5.4 trim、where、set 元素
细心的读者会发现 5.3 节的 SQL 语句笔者加入了一个条件 1=1 ,如果没有加入这个条件,那么可能就变为了下面这样一条错误的语句。
select role_no, role_name, note from t_role where and role_name like concat('%', #{roleName}, '%')
显然就会报错关于 SQL 的语法异常。而加入了 1=1 这样的条件又显得相当奇怪。不过不必担心,我们可以用 where 元素去处理 SQL 以达到预期的效果。例如我们去掉了条件 1=1 ,只要用 where 元素就可以了,如代码清单 5-3 所示。
代码清单 5-3:使用 where 元素
<select id="findRoles" parameterType="string" resultMap="roleResultMap"> select role_no, role_name, note from t_role <where> <if test="roleName != null and roleName !=''"> and role_name like concat('%', #{roleName}, '%') </if> </where> </select>
这样当 where 元素里面的条件成立的时候,才会加入 where 这个 SQL 关键字到组装的 SQL 里面,否则就不加入。
有时候我们要去掉一些特殊的 SQL 语法,比如常见的 and、or。而使用 trim 元素可以达到我们预期的效果,如代码清单 5-4 所示。
代码清单 5-4:使用 trim 元素
<select id="findRoles" parameterType="string" resultMap="roleResultMap"> select role_no, role_name, note from t_role <trim prefix="where" prefixOverrides="and"> <if test="roleName != null and roleName !=''"> and role_name like concat('%', #{roleName}, '%') </if> </trim> </select>
稍微解释一下,trim 元素就意味着我们需要去掉一些特殊的字符串,prefix 代表的是语句的前缀,而 prefixOverrides 代表的是你需要去掉的那种字符串。上面的写法基本与 where 是等效的。
在 Hibernate 中我们常常需要更新某一对象,发送所有的字段给持久对象。现实中的场景常常是,我只想更新一个字段,如果发送所有的属性去更新一遍,对网络带宽消耗较大,性能最佳的办法是把主键和更新字段的值传递给 SQL 更新即可。例如,角色表有一个主键和两个字段,如果一个个去更新需要写 2 条 SQL,如果有 1000 个字段呢?显然这种做法是不方便的,而在 Hibernate 中我们做更新都是用全部字段发送给 SQL 的方法来避免这一情况发生。
在 MyBatis 中,我们常常可以使用 set 元素来完成这些功能,如代码清单 5-5 所示。
代码清单 5-5:使用 set 元素
<update id="updateRole" parameterType="role"> update t_role <set> <if test="roleName != null and roleName !=''"> role_name = #{roleName}, </if> <if test="note != null and note != ''"> note = #{note} </if> </set> where role_no = #{roleNo} </update>
set 元素遇到了逗号,它会把对应的逗号去掉,如果我们自己编写那将是多少次的判断呢?当我们只想更新备注,我们只需要传递备注信息和角色编号即可,而不需要再传递角色名称。MyBatis 就会根据参数的规则进行动态 SQL 组装,这样便能满足要求,同时避免了全部字段更新的麻烦。
同样的你也可以把它转变为对应的 trim 元素,代码如下。
<trim prefix="SET" suffixOverrides=",">...</trim>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论