Mybatis具有实现动态SQL的能力,使用这个特性免不了会用到trim这个标签,trim标签的功能简单来说就是自定义格式拼凑SQL语句。
trim有4个属性:
prefix:表示在trim包裹的SQL前添加指定内容
suffix:表示在trim包裹的SQL末尾添加指定内容
prefixOverrides:表示去掉(覆盖)trim包裹的SQL的指定首部内容
suffixOverrides:表示去掉(覆盖)trim包裹的SQL的指定尾部内容
来看例子:
查找某个用户,通过名字和年龄
public User getUser(@Param("LastName") String lastName,@Param("age") Integer age,@Param("phone") String phone);
对应xml,先看首先想到的:
<select id="getUser" result="user">select * from user_tab where last_name=#{lastName} and age=#{age} and phone=#{phone}
</select>
执行时输出的SQL语句
- prefix
<select id="getUser" resultType="user">select * from user_tab <trim prefix="where">last_name=#{lastName} and age=#{age} and phone=#{phone}</trim>
</select>
输出同样SQL,这个就是prefix的效果
- prefixOverrides
当然实际使用时查找条件都需要做一些判断,最基本的是否为null。
<select id="getUser" resultType="user">select * from user_tab <trim prefix="where"><if test="lastName != null">last_name=#{lastName}</if><if test="age != null">and age=#{age}</if><if test="phone != null">and phone=#{phone}</if></trim>
</select>
执行语句与上面一样,但是假如现在lastName参数为null,我们再看:
// 查询
User user = userMapper.getUser(null, 12,"120");
因为lastName为null,所以第一个if不成立里面的SQL语句不拼接,第二个if里面的and边紧跟在where后面了,语法错误,这是只要加上prefixOverride即可,把首个“and”去掉
<select id="getUser" resultType="user">select * from user_tab <trim prefix="where" prefixOverrides="and"><if test="lastName != null">last_name=#{lastName}</if><if test="age != null">and age=#{age}</if><if test="phone != null">and phone=#{phone}</if></trim>
</select>
如果是先要去掉and获取or,则必须这样写prefixOverrides=“and |or”,注意中间的空格。
- suffix、suffixOverrides
上面查找,这里来看更新
// 根据id来更新
public void updateUser(@Param("user") User user);
对应的xml
<!--普通版-->
<update id="updateUser">update user_tabset last_name=#{lastName},age=#{age},phone=#{phone}where id=#{id}
</update>
使用suffix,并加上条件判断
<update id="updateUser"><trim suffix="where id=#{id}">update user_tabset<if test="lastName != null">last_name=#{lastName},</if><if test="age != null">age=#{age},</if><if test="phone != null">phone=#{phone}</if> </trim>
</update>
执行输出跟上面的普通版语句一样没问题,可以看到suffix的效果
同样的假如phone为null了,
// 更新
userMapper.updateUser(new User(2, "jack", 20, null));
因为最会一个if条件不成立,所以倒数第二个if里面的逗号在where的左侧语法错误,此时使用suffixOverrides即可
<update id="updateUser"><trim suffix="where id=#{id}" suffixOverrides=",">update user_tabset<if test="lastName != null">last_name=#{lastName},</if><if test="age != null">age=#{age},</if><if test="phone != null">phone=#{phone}</if> </trim>
</update>
再次执行输出,成功执行,这个就是suffixOverrides的作用
好了,这个就是trim标签即属性的基本介绍,具体怎么使用看实际情况,上面只是作为演示。