关于Mybatis的动态sql学习笔记
一、基础标签
1.1 if标签
- if:判断
<if test=""> sql语句 </if>
- test:判断表达式(OGNL)
- 从参数中取值进行判断
- 如果遇到特殊符号,要使用转义字符
- 举例:查询员工,要求:携带哪个字段时,查询条件就带上这个字段的值
1 | 接口 |
1 | 映射文件 |
- 存在问题:
- 当id不存在时,sql语句就变成 where and Xxxx,会报错
- 解决方法一:
- 给where后面先弄一个1=1,后面条件拼接都用and Xxx拼接
1 | SQL语句 |
- 解决方法二:使用where标签
1.2 where标签
- where
- 用来替代sql语句中where内的查询条件
- 好处:会去掉凭借字符串第一个多出的and / or,解决拼接错误
- 举例:上述例子修改
1 | 接口 |
1 | 映射文件 |
- 注意:where只能解决”and Xxxx”在前面拼接的,而”Xxx and”在后面拼接的无法解决,拼接要规范
- 如果要使用”Xxxx and”的方式拼接,可以使用trim标签
1.3 trim标签
- trim标签
- trim标签用于字符串的截取
<trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>
prefix
:前缀,给拼串后的字符串写一个前缀prefixOverrides
:前缀覆盖,去掉整个字符串前面多余的字符suffix
:后缀,给拼串后的字符串写一个后缀suffixOverides
:后缀覆盖,去掉整个字符串后面多余的字符
- 举例:修改上述例子,利用trim来实现and在后拼接
1 | 接口 |
1 | 映射文件 |
1.4 choose标签
- choose标签
- 分支选择,使用方法与Java的分支选择差不多
choose
— switchwhen
— caseotherwise
— default
- 举例:如果对象带id就用id查,如果对象有lastName就用lastName查,二者选其一;如果都没有,就查找女性信息
1 | 接口 |
1 | 映射文件 |
1.5 set标签
- set标签
- 用来取代修改的set,用if实现动态sql时,会出现字符串拼接错误
- 举例:实现动态修改数据
1 | 接口 |
1 | 映射文件 |
- 跟where一样,如果字符串出现拼接错误,可以使用trim解决
1 | 接口 |
1 | 映射文件 |
1.6 foreach标签
- foreach标签
- 用来遍历集合/数据,使用方法和增强for循环类似
<foreach collection="" item="" separator="" open="" close="" index="">
collection
:指定要遍历的集合- (mybatis会自动将list封装为Map集合[list, list集合名称],所以要填写list;set, array同理)
- (可以在接口的参数用@param(“”)起别名,来直接调用用别名)
- (手动将List集合转变成Map集合)
item
:将当前遍历的元素赋值给指定的变量separator
:元素之间分割符号open
:遍历完拼接的字符串的前缀close
:遍历完拼接的字符串的后缀index
:索引- 遍历list的时候,index是索引值,item是当前值
- 遍历map的时候,idnex是map的Key,item是map的Value
- 举例:实现以下sql语句
select * from tbl_employee where id in (1, 2, 3, 4)
1 | 接口 |
1 | 映射文件 |
二、批量插入
- 利用foreach标签实现动态插入
2.1 MySQL处理
- 方法一:实现以下sql语句
insert into tbl_employee(last_name, gender, email) value(x, x, x, x), (x, x, x, x)
- mysql支持value(),.(), ()的方式进行批量插入
1 | 接口 |
1 | 映射文件 |
- 方法二:执行多条sql语句
- 在mysql的url添加属性:allowMultiQueries=true
- 然后使用foreach实现重复多条sql语句,分隔符为’;’
2.2 Oracle处理
- 使用以下sql语句格式:
- 用begin end包括多条sql语句,多条sql语句使用foreach来实现,分隔符为’;’
1 | begin |
三、默认参数
- 在Mybatis中,除了方法中我们传入的参数,还额外自带两个默认的参数
_parameter
:代表整个参数- 单个参数:_parameter就是传递的参数
- 多个参数:参数会封装在一个map,_parameter就是这个map
_databaseId
:如果配置了databaseIdProvider标签,_databaseId就是代表当前数据库的别名
1 | 全局配置文件 |
1 | 接口 |
1 | 映射文件 |
四、进阶标签
4.1 bind标签
- 是CURD标签的子标签,可以将OGNL表达式绑定在一个变量中,方便后来引用这个变量的值
<bind name="" value="" />
name
:变量名value
:参数进行处理后的值
- 例:
<bind name="_lastName" value="'%'+lastName+'%'"/>
4.2 sql、include标签
- sql标签
- 抽取可重用的sql片段,方便后面引用,类似Java的方法封装
1 | <sql id=""> |
- include标签
- 引用外部的定义的sql标签
<include refid=""></include>
- refid:引用的sql标签id