在 MyBatis 中提供了动态 SQL 功能。将使用 Java 代码拼接 SQL 语句,改变为在 XML 映射文件中使用标签拼接 SQL 语句。
MyBatis 中动态 SQL 是编写在 mapper.xml 中的,其语法和 JSTL 类似,但是却是基于强大 的 OGNL 表达式实现的。
if 标签单分支判断语句
如果test中布尔值为true,if标签中的表达式将添加到SQL表达式中
<select id="selectUsersByProperty" resultType="users">
select * from users where 1=1
<if test="userid != 0">
and userid = #{userid}
if>
<if test="username != null and username != ''">
and username = #{username}
if>
<if test="usersex != null and usersex != ''">
and usersex = #{usersex}
if>
select>
从多个条件中选择一个使用
顺序判断,当有条件满足,则将对应表达式添加到SQL表达式中,并结束choose标签
<select id="selectUsersByChoose" resultType="users">
select * from users where 1=1
<choose>
<when test="username != null and username != ''">
and username = #{username}
when>
<when test="usersex != null and usersex != ''">
and usersex = #{usersex}
when>
<otherwise>
and userid = 1
otherwise>
choose>
select>
使用 where 标签,就不需要提供 where 1=1 这样的条件了。如果判断条件不为空则自动添加 where 关键字,并且会自动去掉第一个条件前面的 and 或 or。
<select id="selectUsersByPropertyWhere" resultType="users">
select * from users
<where>
<if test="userid != 0">
and userid = #{userid}
if>
<if test="username != null and username != ''">
and username = #{username}
if>
<if test="usersex != null and usersex != ''">
and usersex = #{usersex}
if>
where>
select>
bind 标签允许我们在 OGNL 表达式以外创建一个变量,并可以将其绑定到当前的 SQL 语句中。一般应用于模糊查询,通过 bind 绑定通配符和查询值。
<select id="selectUsersByLikeName" resultType="users">
<bind name="likeName" value="'%'+name+'%'"/>
select * from users where username like #{likeName}
select>
set 标签用在 update 语句中。借助 if 标签,可以只对有具体值的字段进行更新。set 标签会自动添加 set 关键字,自动去掉最后一个if语句的多余的逗号
<update id="usersUpdate">
update users
<set>
<if test="username != null and username != ''">
username = #{username},
if>
<if test="usersex != null and usersex != ''">
usersex = #{usersex},
if>
set>
where userid = #{userid}
update>
foreach 标签的功能非常强大,我们可以将任何可迭代对象如 List、Set 、Map 或者数组对象作为集合参数传递给 foreach 标签进行遍历。它也允许我们指定开头与结尾的字符串以及集合项迭代之间的分隔符
<select id="selectUsersByIdUseCollection" resultType="users">
select * from users where userid in
<foreach collection="collection" item="userid" open="(" separator="," close=")">
#{userid}
foreach>
select>
<select id="selectUsersByIdUseArray" resultType="users">
select * from users where userid in
<foreach collection="array" item="userid" open="(" separator="," close=")">
#{userid}
foreach>
select>
<select id="selectUsersCount" resultType="int">
select count(*) from users where
<foreach collection="map" separator="and" item="value" index="key">
${key} = #{value}
foreach>
select>
<insert id="insertUsersBatch" >
insert into users values
<foreach collection="collection" item="user" separator=",">
(default ,#{user.username},#{user.usersex})
foreach>
insert>