文章目录
1. 动态sql的好处
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
注意:xml中特殊符号如 ” , > , < 等这些都需要使用转义字符
2. 动态sql之:if、where
- if 用于完成简单的判断.
- where用于解决SQL语句中where关键字以及条件前面的and或者or的问题
正确示例:
<select id="getByUser" resultType="user">
select * from users
<where>
<if test="id != null and id != '' ">
and id=#{id}
</if>
<if test="username != null and username != '' ">
and username like concat('%',#{username},'%')
</if>
<if test="birthday != null ">
and birthday = #{birthday}
</if>
<if test="sex != null and sex !=''">
and sex = #{sex}
</if>
<if test="address != null and address !=''">
and address like concat('%',#{address},'%')
</if>
</where>
</select>
错误示范(没有where标签):
3.动态sql之: trim
trim 可以在条件判断完的SQL语句前后添加或者去掉指定的字符
- prefix: 添加前缀
- prefixOverrides: 去掉前缀
- suffix: 添加后缀
- suffixOverrides: 去掉后缀
示例
4. 动态sql之:set
主要是用于解决修改操作中SQL语句中可能多出逗号的问题
使用示例:
不用set标签的示例 :
5.动态sql之: choose、when、otherwise
choose 主要是用于分支判断,类似于java中的switch case,只会满足所有分支中的一个
6. 动态sql之:foreach
1)foreach 主要用于循环迭代
- collection: 要迭代的集合
- item: 当前从集合中迭代出的元素
- open: 开始字符
- close:结束字符
- separator: 元素与元素之间的分隔符
- index:
- 迭代的是List集合: index表示的当前元素的下标
- 迭代的Map集合: index表示的当前元素的key
示例:
这里注意Mapper接口参数列表要加@Param
/**
* 测试foreach
*
* @param ids
* @return {@code List<User>}
*/
List<User> testForeach(@Param("ids") List<Integer> ids);
7.动态sql之: sql、include
sql 标签是用于抽取可重用的sql片段,将相同的,使用频繁的SQL片段抽取出来,单独定义,方便多次引用.
include就是来引用sql标签