MyBatis--动态sql
Posted 肖帆咪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis--动态sql相关的知识,希望对你有一定的参考价值。
动态sql
MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。动态 SQL 可以彻底处理条件地串联 SQL 字符串减少程序员的压力,让程序员将更多地精力投入开发业务中。
MyBatis 中用于实现动态 SQL 的元素主要有:
If 标签可以对传入的条件进行判断
#{}占位符,预编译,先编译好sql语句在取值,防止sql注入(传值时使用)
${}拼接符,会传入参数字符中,取值后再编译sql,不能防止注入
${}适用于select * from user order by ${name}
insert into user values (3,'jim',22)
useGeneratedKeys="true"返回主键
keyProperty="id" 用bean下的属性接收
keyColumn="id" 数据库中的列
where 标签
会进行判断,如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉AND 或 OR。
<select id="findUser" resultType="User">
select * from user
<!--
<if test="">条件判断
<where>当条件成立时,插入where关键字,否则不插入
会取出where 语句中开头的and or 等关键字
-->
<where>
<if test="address!=null">
and address = #{address}
</if>
<if test="user_name!=null">
and user_name = #{user_name}
</if>
</where>
</select>
trim 标签
其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定内容
使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分
<select id="findUser" resultType="User">
select * from user
<trim prefix="where" prefixOverrides="and | or">
<if test="address!=null">
and address = #{address}
</if>
<if test="user_name!=null">
and user_name = #{user_name}
</if>
</trim>
</select>
模糊查询
<!--
模糊查询
1.在mapper中 user_name like '%${user_name}%'
2.在传值时候拼接好 map.put("user_name","%j%");
3.使用concat('%',#{user_name},'%')
-->
<select id="findUser1" resultType="User">
select * from user
<where>
<if test="user_name!=null">
and user_name like concat('%',#{user_name},'%')
</if>
</where>
</select>
set 元素可以把最后一个逗号去掉
<update id="update" parameterType="User">
update user
<set>
<if test="userName!=null">
user_name = #{userName},
</if>
<if test="age!=null">
age = #{age},
</if>
<if test="mobile!=null">
mobile = #{mobile},
</if>
<if test="address!=null">
address = #{address}
</if>
</set>
where id = #{id}
</update>
也可以使用trim实现
<update id="update" parameterType="User">
update user
<trim prefix="set" suffixOverrides=",">
<if test="userName!=null">
user_name = #{userName},
</if>
<if test="age!=null">
age = #{age},
</if>
<if test="mobile!=null">
mobile = #{mobile},
</if>
<if test="address!=null">
address = #{address}
</if>
</trim>
where id = #{id}
</update>
Foreach元素
主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。
在使用 foreach 的时候最关键的也是最容易出错的就是 collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。
– 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list
– 如果传入的是单参数且参数类型是一个 array 数组的时候,collection 的属性值为array
适用范围,删除多个数据
item 表示集合中每一个元素进行迭代时的别名
index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置
open 表示该语句以什么开始
separator 表示在每次进行迭代之间以什么符号作为分隔符
close 表示以什么结束
<delete id="deleteUser" parameterType="User">
delete from user where id IN
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
特殊符号处理
在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<>
等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示:
特殊字符 转义字符
< <
> >
" "
’ '
& &
也可以使用<![CADTA[]]>来包裹特殊字符,但是这种方式所在的内容会被解析器忽略,应减少使用
<if test="id != null">
AND <![CDATA[ id <> #{id} ]]>
</if>
以上是关于MyBatis--动态sql的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取
mybatis动态sql之利用sql标签抽取可重用的sql片段
MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段