5. Mapper XML文件详解
1.CRUD标签
1.1.select
select – 书写查询sql语句
select中的几个属性说明:
id属性:当前名称空间下的statement的唯一标识。必须。要求id和mapper接口中的方法的名字一致。
resultType:将结果集映射为java的对象类型。必须(和 resultMap 二选一)
parameterType:传入参数类型。可以省略
1.2.insert
insert 的几个属性说明:
id:唯一标识,随便写,在同一个命名空间下保持唯一,使用动态代理之后要求和方法名保持一致
parameterType:参数的类型,使用动态代理之后和方法的参数类型一致
useGeneratedKeys:开启主键回写
keyColumn:指定数据库的主键
keyProperty:主键对应的pojo属性名
标签内部:具体的sql语句。
1.3.update
id属性:当前名称空间下的statement的唯一标识(必须属性);
parameterType:传入的参数类型,可以省略。
标签内部:具体的sql语句。
1.4.delete
delete 的几个属性说明:
id属性:当前名称空间下的statement的唯一标识(必须属性);
parameterType:传入的参数类型,可以省略。
标签内部:具体的sql语句。
2.#{}和${}
场景:数据库有两个一模一样的表。历史表,当前表
查询表中的信息,有时候从历史表中去查询数据,有时候需要去新的表去查询数据。
希望使用1个方法来完成操作。
<select id="queryUserByTableName" resultType="com.zpc.mybatis.pojo.User"> select * from #{tableName} </select>
/** * 根据表名查询用户信息(直接使用注解指定传入参数名称) * * @param tableName * @return */ public List<User> queryUserByTableName(String tableName);
测试输出:
有问题,报语法错误:相当于执行了这样一条sql:
select * from 'tb_user';
显然表名多了引号。
改正:
<select id="queryUserByTableName" resultType="com.zpc.mybatis.pojo.User"> select * from ${tableName} </select>
注意:
#{} 只是替换?,相当于PreparedStatement使用占位符去替换参数,可以防止sql注入。
${} 是进行字符串拼接,相当于sql语句中的Statement,使用字符串去拼接sql;$可以是sql中的任一部分传入到Statement中,不能防止sql注入。
使用${} 去取出参数值信息,需要使用${value}
#{} 只是表示占位,与参数的名字无关,如果只有一个参数,会自动对应。
推荐:
/** * 根据表名查询用户信息(直接使用注解指定传入参数名称) * * @param tableName * @return */ public List<User> queryUserByTableName(@Param("tableName") String tableName);
<select id="queryUserByTableName" resultType="com.zpc.mybatis.pojo.User"> select * from ${tableName} </select>
#{}多个参数时:
/** * 登录(直接使用注解指定传入参数名称) * * @param userName * @param password * @return */ public User login( String userName, String password);
<select id="login" resultType="com.zpc.mybatis.pojo.User"> select * from tb_user where user_name = #{userName} and password = #{password} </select>
报错:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'userName' not found. Available parameters are [0, 1, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'userName' not found. Available parameters are [0, 1, param1, param2]
解决方案一:
<select id="login" resultType="com.zpc.mybatis.pojo.User"> select * from tb_user where user_name = #{0} and password = #{1} </select>
解决方案二:
<select id="login" resultType="com.zpc.mybatis.pojo.User"> select * from tb_user where user_name = #{param1} and password = #{param2} </select>
最终解决方案:
/** * 登录(直接使用注解指定传入参数名称) * * @param userName * @param password * @return */ public User login(@Param("userName") String userName, @Param("password") String password);
<select id="login" resultType="com.zpc.mybatis.pojo.User"> select * from tb_user where user_name = #{userName} and password = #{password} </select>
通常在方法的参数列表上加上一个注释@Param(“xxxx”) 显式指定参数的名字,然后通过${“xxxx”}或#{“xxxx”}
sql语句动态生成的时候,使用${};
sql语句中某个参数进行占位的时候#{}
3.resultMap
使用:
4.sql片段
<sql id=””></sql> <include refId=”” />
例如在UserMapper.xml中定义如下片段:
<sql id="commonSql">
id,
user_name,
password,
name,
age,
sex,
birthday,
created,
updated
</sql>
Sql片段也可以定义在单独的.xml文件中如:
定义CommonSQL.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="CommonSQL"> <sql id="commonSql"> id, user_name, password, name, age, sex, birthday, created, updated </sql> </mapper>
使用:
<select id="queryUserById" resultMap="userResultMap"> select <include refid="CommonSQL.commonSql"></include> from tb_user where id = #{id} </select>
<select id="queryUsersLikeUserName" resultType="User"> select <include refid="CommonSQL.commonSql"></include> from tb_user where user_name like "%"#{userName}"%" </select>
当然要完成这个功能还需要在全局配置文件mybatis-config.xml中引入该外部配置文件:
<mappers> <mapper resource="CommonSQL.xml"/> <!-- 开启mapper接口的包扫描,基于class的配置方式 --> <package name="com.zpc.mybatis.mapper"/> </mappers>
原文地址:https://www.cnblogs.com/jvStarBlog/p/12735990.html
- 自创数据集,用TensorFlow预测股票教程 !(附代码)
- 介绍几个好用的android自定义控件
- T-SQL—理解CTEs
- SQL 扩展事件
- ShapeDrawable做放大镜效果
- android放大镜效果实现
- Android StringEntity() 和 UrlEncodedFormEntity() 的区别
- 如何根据日志查看删除的数据(转译)
- 具体问题解决:分离脚本
- 独家 | 手把手教你用Python 3创建用于机器学习开发的Linux虚拟机(附安装教程、代码)
- TSQL--临时表和表变量
- 微软开源 C++ REST SDK
- 使用Autofac在ASP.NET Web API上实现依赖注入
- Universal-Image-Loader完全解析--从源代码分析Universal-Image-Loader中的线程池
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Next.js + TypeScript 搭建一个简易的博客系统
- 【redis】02-redis持久化存储以及对象存储
- Kubernetes 集群可视化监控之 Weave Scope 入门
- h5 与原生 app 交互的原理
- 怎么在Openresty中REST?
- 【redis】04-redis 根据监听key的失效事件实现订单超时关闭
- 搭建分布式任务调度平台
- 微信小程序根据线上版本 Source Map 文件定位错误代码
- 全解系列:内存泄漏定位工具LeakCanary!
- 【Java反射】触手可及
- 【Flutter 专题】100 何为 Flutter Widgets ?
- Python爬虫 爬取豆瓣电影Top250信息
- Python编程 基础练习(一)
- Python编程 基础练习(二)
- python数据可视化 豆瓣电影top250数据分析