动态SQL是mybatis最重要的特性,它可以彻底解决jdbc那样的拼接条件的痛苦。可以使用以下标签:
•if
•choose (when, otherwise)
•trim (where, set)
•foreach
if 标签
eg : 需求:根据username查询,如果gender不等于null,同时也根据gender查询。
<select id="getUsers" resultType="user">
select * from user
where username = #{username}
<if test="gender!= null">
and gender = #{gender}
if>
select>
有时候,我们并不希望是有许多条件,我们仅希望以某一种条件进行查询,我们就可以像java的jstl标签一样。
<select id="getUsersChoose" resultType="user">
select * from user
where
<when test="username!=null">
username=#{username}
when>
<when test="password!=null">
password=#{password}
when>
gender=#{gender}
select>
trim, where, set标签
以上的两类标签在使用的时候,会出现一些问题,比如使用if标签更新User,动态如下
id="updateUser" parameterType="user">
update user set
<if test="username!= null">
username=#{username}
if>
<if test="password!= null">
,password=#{password}
if>
<if test="gender!= null">
,gender=#{gender}
if>
where id = #{id}
如果username=null,其他都不是null,这样在mybatis生成动态sql的时候就会是这样;
update user set , password=#{password},gender=#{gender} where id = #{id}
有没有注意到set关键字后面多了一个“,”,这样就拼成了一个错误的sql语句。
我们可以使用trim标签对以上sql进行改造,
id="updateUser" parameterType="user">
update user set
",">
<if test="username!= null">
username=#{username}
if>
<if test="password!= null">
,password=#{password}
if>
<if test="gender!= null">
,gender=#{gender}
if>
where id = #{id}
其中:prefixOverrides属性可以将多出的“,”忽略。
也可以直接使用set标签改造,如下
id="updateUser" parameterType="user">
update user
<set>
<if test="username!= null">
username=#{username}
if>
<if test="password!= null">
,password=#{password}
if>
<if test="gender!= null">
,gender=#{gender}
if>
set>
where id = #{id}
where标签也有类似的功能,它可以代替sql中的关键字where,并将拼接后的sql中多余的 “,”,或者“and”忽略,此处就不做介绍了。
"addUsers" parameterType="list">
insert into user(username,password,gender)
values
<foreach collection="list" item="user" separator=",">
(#{user.username},#{user.password},#{user.gender})
foreach>
此处仅介绍各个标签常用的方法,更多用法请参考官方提供的pdf文件。