好程序员 Java 分享 Mybatis 必会的动态 SQL , 前言 :
Mybatis 可谓是 java 开发者必须会的一项技能。 MyBatis 的强大特性之一便是它的动态 SQL 。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,从而在提高 SQL 语句的准确性的同时,也大大提高了开发人员的效率。本文主要介绍这几个动态SQL .
if标签 if就是用来对输入映射的字段进行判断 一般是非空判断 null 和""。
1. <!-- 案例 1 :动态 sql 之 if -->
2. <select id = "selectUsersIf" parameterType = "user" resultType = "user" >
3. select * from users where 1 =1
4. <if test = "uname!=null and uname!=''" > and uname like "%"#{uname}"%" </if>
5. <if test = "sex!=null and sex!=''" > and sex = #{sex} </if>
6. </select>
动态 SQL <where /> 相当于 where 关键字 <where /> 可以自动处理第一个前 and 或者 or 。 当条件都没有的时候 where 也不会加上 。
1. <!-- 案例 2 :动态 sql 之 where 可以自动处理第一个前 and 或者 or 。当条件都没有的时候 where 也不会加上 -->
2. <select id = "selectUsersWhere" parameterType = "user" resultType = "user" >
3. select * from users
4. <where>
5. <if test = "uname!=null and uname!=''" > and uname like "%"#{uname}"%" </if>
6. <if test = "sex!=null and sex!=''" > and sex = #{sex} </if>
7. </where>
choose — when--when--otherwise when 可以多个 otherwise 只能有一个 类似于 switch case 。
需求:输入用户 id 按照用户 id 进行精确查找 其他条件不看 没有输入 id 用户名模糊查找 都没有的话 查询 id=1 的用户
1. <!-- 案例 3 :动态 sql 之 choose—when when otherwise -->
2.
3. <select id = "selectUsersChoose" parameterType = "user" resultType = "user" >
4. select * from users
5. <where>
6. <choose>
7. <when test = "uid!=null" > uid =#{uid} </when>
8. <when test = "uname!=null and uname!=''" > uname like "%"#{uname}"%" </when>
9. <otherwise> uid = 1 </otherwise>
10.
11. </choose>
12. </where>
13. </select>
动态 sql 之 set 代替 set 关键字 set 标签可以帮助我们去掉最后一个逗号
1. <update id = "updateSet" parameterType = "user" >
2.
3. update users
4.
5. <set>
6. <if test = "uname!=null and uname!=''" > uname =#{uname}, </if>
7. <if test = "upwd!=null and upwd!=''" > upwd =#{upwd}, </if>
8. <if test = "sex!=null and sex!=''" > sex =#{sex}, </if>
9. <if test = "birthday!=null" > birthday =#{birthday}, </if>
10. </set>
11. where uid =#{uid}
12. </update>
Trim , trim 代替 where
1. <!-- 案例 5 :动态 sql 之 trim 代替 where -->
2. <select id = "selectUsersTrimWhere" parameterType = "user" resultType = "user" >
3. select * from users
4. <!--
5. prefix: 指添加前缀修饰
6. suffix: 添加后缀修饰
7. prefixOverrides :去掉前缀修饰
8. suffixOverrides :去掉后缀修饰
9. -- >
10. < trim prefix = "where" prefixOverrides = "and|or" >
11. <if test = "uname!=null and uname!=''" > and uname like "%"#{uname}"%" </if>
12. <if test = "sex!=null and sex!=''" > and sex = #{sex} </if>
13. </trim>
14. </select>
Trim 代替 set :
1. <!-- 案例 6 :动态 sql 之 trim 代替 set -->
2. <update id = "updateTrimSet" parameterType = "user" >
3.
4. update users
5.
6. <trim prefix = "set" suffixOverrides = "," suffix = "where uid=#{uid}" >
7. <if test = "uname!=null and uname!=''" > uname =#{uname}, </if>
8. <if test = "upwd!=null and upwd!=''" > upwd =#{upwd}, </if>
9. <if test = "sex!=null and sex!=''" > sex =#{sex}, </if>
10. <if test = "birthday!=null" > birthday =#{birthday}, </if>
11. </trim>
12.
F oreach 来遍历集合
1. <!-- 案例 7: 动态 sql 之 foreach 遍历数组 -->
2. <select id = "selectUsersForeachArray" resultType = "user" >
3. select * from users where uid in
4. <!--
5. collection: 要遍历的集合
6. item: 当前正在遍历的对象的变量名
7. open: 开始遍历
8. close: 结束便利
9. index: 下标
10. separator: 分割
11. -- >
12. <foreach collection = "array" item = "item" open = "(" close = ")" index = "index" separator = "," >
13. #{item}
14. </foreach>
15.
16. </select>
熟练掌握以上 Mysql 的动态 SQL , 我们可以更得心应手的完成我的功能,写更少的代码,实现更多的功能。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。