好程序员Java分享Mybatis必会的动态SQL,前言:

Mybatis可谓是java开发者必须会的一项技能。MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

Mybatis动态sql

mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签,可组合成非常灵活的SQL语句,从而在提高 SQL 语句的准确性的同时,也大大提高了开发人员的效率。本文主要介绍这几个动态SQL.

具体示例

if标签 if就是用来对输入映射的字段进行判断 一般是非空判断 null 和""。

1.<!--案例1:动态sql之if-->

2.<selectid="selectUsersIf"parameterType="user"resultType="user">

3.select*fromuserswhere1=1

4.<iftest="uname!=nullanduname!=''">andunamelike"%"#{uname}"%"</if>

5.<iftest="sex!=nullandsex!=''">andsex=#{sex}</if>

6.</select>

动态SQL <where /> 相当于 where关键字 <where />可以自动处理第一个前and 或者or。 当条件都没有的时候 where也不会加上 。

1.<!--案例2:动态sql之where可以自动处理第一个前and或者or。当条件都没有的时候where也不会加上-->

2.<selectid="selectUsersWhere"parameterType="user"resultType="user">

3.select*fromusers

4.<where>

5.<iftest="uname!=nullanduname!=''">andunamelike"%"#{uname}"%"</if>

6.<iftest="sex!=nullandsex!=''">andsex=#{sex}</if>

7.</where>

choose—when--when--otherwise when可以多个 otherwise只能有一个 类似于 switch case。

需求:输入用户id 按照用户id进行精确查找 其他条件不看 没有输入 id 用户名模糊查找 都没有的话 查询id=1的用户

1.<!--案例3:动态sql之choose—whenwhenotherwise-->

2.

3.<selectid="selectUsersChoose"parameterType="user"resultType="user">

4.select*fromusers

5.<where>

6.<choose>

7.<whentest="uid!=null">uid=#{uid}</when>

8.<whentest="uname!=nullanduname!=''">unamelike"%"#{uname}"%"</when>

9.<otherwise>uid=1</otherwise>

10.

11.</choose>

12.</where>

13.</select>

动态sql之set 代替set关键字 set标签可以帮助我们去掉最后一个逗号

1.<updateid="updateSet"parameterType="user">

2.

3.updateusers

4.

5.<set>

6.<iftest="uname!=nullanduname!=''">uname=#{uname},</if>

7.<iftest="upwd!=nullandupwd!=''">upwd=#{upwd},</if>

8.<iftest="sex!=nullandsex!=''">sex=#{sex},</if>

9.<iftest="birthday!=null">birthday=#{birthday},</if>

10.</set>

11.whereuid=#{uid}

12.</update>

Trim,trim代替where

1.<!--案例5:动态sql之trim代替where-->

2.<selectid="selectUsersTrimWhere"parameterType="user"resultType="user">

3.select*fromusers

4.<!--

5.prefix:指添加前缀修饰

6.suffix:添加后缀修饰

7.prefixOverrides:去掉前缀修饰

8.suffixOverrides:去掉后缀修饰

9.-->

10.<trimprefix="where"prefixOverrides="and|or">

11.<iftest="uname!=nullanduname!=''">andunamelike"%"#{uname}"%"</if>

12.<iftest="sex!=nullandsex!=''">andsex=#{sex}</if>

13.</trim>

14.</select>

Trim代替set:

1.<!--案例6:动态sql之trim代替set-->

2.<updateid="updateTrimSet"parameterType="user">

3.

4.updateusers

5.

6.<trimprefix="set"suffixOverrides=","suffix="whereuid=#{uid}">

7.<iftest="uname!=nullanduname!=''">uname=#{uname},</if>

8.<iftest="upwd!=nullandupwd!=''">upwd=#{upwd},</if>

9.<iftest="sex!=nullandsex!=''">sex=#{sex},</if>

10.<iftest="birthday!=null">birthday=#{birthday},</if>

11.</trim>

12.

Foreach来遍历集合

1.<!--案例7:动态sql之foreach遍历数组-->

2.<selectid="selectUsersForeachArray"resultType="user">

3.select*fromuserswhereuidin

4.<!--

5.collection:要遍历的集合

6.item:当前正在遍历的对象的变量名

7.open:开始遍历

8.close:结束便利

9.index:下标

10.separator:分割

11.-->

12.<foreachcollection="array"item="item"open="("close=")"index="index"separator=",">

13.#{item}

14.</foreach>

15.

16.</select>

总结

熟练掌握以上Mysql的动态SQL,我们可以更得心应手的完成我的功能,写更少的代码,实现更多的功能。