MyBatis 的强大特性之一便是它的动态 SQL。动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。
1.if标签
映射文件配置:
<select id="query" resultMap="baseMap" parameterType="user">
select * from t_user
<!-- 这里的1=1方便测试 -->
where 1=1
<!-- 条件if标签通过判断name参数是否为空决定是否使用这个SQL语句 -->
<if test="name!=null" >
and name=#{name}
</if>
</select>
测试代码name=null的情况下:
@Test
public void test() {
List<User> list = mapper.query(new User());
for (User user : list) {
System.err.println("在name=null的情况下"+user);
}
}
测试结果:
测试代码name!=null的情况下:
@Test
public void test() {
User testUser = new User();
testUser.setName("zhangsan");
List<User> list = mapper.query(testUser);
for (User user : list) {
System.err.println("在name=null的情况下"+user);
}
}
2. choose,when,otherwise
choose选择语句,差不多等同于java语句中的switch语句。通过创建多个标签元素来选择符合要求的元素。when表示在满足某种情况下调用该内容,otherwise表示在所有情况都不满足的情况下调用的内容。
配置标签代码使用方式:
<select id="query" resultMap="baseMap" parameterType="user">
select * from t_user
where 1=1
<!-- 如果满足其中的条件就调用其中的SQL语句 -->
<choose>
<when test="no!=null">
and no=#{no}
</when>
<when test="name!=null">
and name=#{name}
</when>
<otherwise>
<if test="age!=null" >
and age=#{age}
</if>
</otherwise>
</choose>
</select>
3.where
上述配置代码中为了方便测试我都在where后面添加1=1来方便测试,但是有时候我们对where是否使用也需要动态决定。这个时候就可以使用where标签来解决这个问题。
<select id="queryById" resultType="user" parameterType="int">
select *
from t_user
<where>
<if test="no!=null" >
no=#{no}
</if>
</where>
</select>
这里满足条件就会自动添加where并调用其中的SQL代码。
4.set
set标签主要用于SQL更新UPDATE代码中,用法如下代码:
<update id="update" parameterType="user">
update t_user
<!-- 通过set来动态设置更新的参数 -->
<set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set>
where no = #{no}
</update>
5.trim
trim标签是一个格式化标签,可以用来代替set或者where标签的功能。具体用法如下代码:
<update id="update" parameterType="user">
update t_user
<!-- <set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set> -->
<!-- prefix表示调用SQL语句时在最前面添加的前缀
prefixOverrides表示调用SQL语句时去掉的第一个指定内容
suffix表示调用SQL语句时在最后面添加的后缀
suffixOverride表示调用SQL语句时去掉的最后一个指定内容
-->
<trim prefix="set" prefixOverrides="and | or">
<if test="name!=null"> and name=#{name}</if>
<if test="age!=null"> or age=#{age}</if>
</trim>
where no = #{no}
</update>
通过这个trim获得了跟set一样的效果,不过更具有灵活性。