##概述
MyBatis框架之所以优秀,一是因为将sql与代码分离,二就是具有强大的动态sql功能。
主要的动态sql有:
- if标签的使用。
- where标签的使用。
- where标签与choose标签的联合使用。
- set标签的使用。
- foreach标签的使用。
- trim标签的使用。
一,if标签的使用
使用示例如下:
<select id="queryList" parameterType="studentModel" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from student
WHERE name=#{name}
<if test="age > 0">
AND age=#{age}
</if>
</select>
说明:
- if的作用是判断是否满足条件,满足条件时if里面的sql片段才生效。
- 此时的意思是:如果age大于0则在where中添加age的判断条件。
二,where标签的使用
使用示例如下:
<select id="queryList" parameterType="studentModel" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from student
<where>
<if test="name!=null and name.length()>0">
AND name=#{name}
</if>
<if test="age > 0">
AND age=#{age}
</if>
</where>
</select>
说明:
- where常与if连用,当if中有满足的条件时where才会其作用。
- where标签中的每一个字段前都可以加and,系统会自己将第一个满足条件的字段前and去掉。
注:此时的示例与上面if的示例都是动态判断where条件,二者有什么区别呢?只使用if标签时必须有一个满足判断条件的字段,使用where标签时可以全部都不满足判断条件。
三,where标签与choose标签联合的使用
where标签除了与if标签联合使用外,还可以与choose标签联合使用。使用示例如下:
<select id="queryList" parameterType="studentModel" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from student
<where>
<choose>
<when test="name!=null and name.length()>0">
AND name=#{name}
</when>
<when test="age > 0">
AND age=#{age}
</when>
<otherwise>
</otherwise>
</choose>
</where>
</select>
where标签与choose标签连用比与if标签联用的优点是:当都不满足条件时可以在otherwise标签中设置默认的判断条件。
四,set标签的使用
在update操作时使用动态set。使用示例如下:
<update id="update" parameterType="studentModel">
UPDATE student
<set>
<if test="name!=null and name.length()>0">
name= #{name},
</if>
<if test="age>0">
age = #{age},
</if>
</set>
WHERE id = #{id}
</update>
说明:
- set标签常用if标签一起使用。
- 每个if中的sql片段都要加逗号,这也是sql语法的要求。
五,foreach标签的使用
foreach的意思是遍历,使用示例如下:
<select id="getObjectByIds" parameterType="java.util.List" resultType="studentModel">
select name,age
from student
where id in
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
说明:
- collection :collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为集合,所以值为list.
- item : 表示在迭代过程中每一个元素的别名
- index :表示在迭代过程中每次迭代到的位置(下标)
- open :前缀
- close :后缀
- separator :分隔符,表示迭代时每个元素之间以什么分隔.
六,trim标签的使用
trim是一个很灵活的标签,有四个属性,意思分别是:
1、prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容。
2、prefixOverrides,suffixOverrides 表示前面或者后面删除内容。
3、如果suffixOverrides和suffix同时使用,则一般现写suffixOverrides,再写suffix,表示先删除suffixOverrides的属性值,然后再拼接suffix中的属性值。
具体使用示例如下:
<update id="testTrim" parameterType="com.mybatis.pojo.User">
update user
<trim prefix="set" suffixOverrides=",">
<if test="cash!=null and cash.length()>0">
cash= #{cash},
</if>
<if test="address!=null and address.length()>0">
address= #{address},
</if>
</trim>
where id = #{id}
</update>
此时把set拼接在cash=#{cash}前。并把address=#{address}后面的逗号删除。
上面的例子也可以这么写:
<update id="testTrim" parameterType="com.mybatis.pojo.User">
update user
set
<trim suffixOverrides="," suffix="where id = #{id}">
<if test="cash!=null and cash.length()>0">
cash= #{cash},
</if>
<if test="address!=null and address.length()>0">
address= #{address},
</if>
</trim>
where id = #{id}
</update>
##总结
目前常用的动态sql标签就是这些,以后会持续更新。