好程序员
Java
分享
Mybatis
必会的动态
SQL
,
前言
:
Mybatis
可谓是
java
开发者必须会的一项技能。
MyBatis
的强大特性之一便是它的动态
SQL
。如果你有使用
JDBC
或其它类似框架的经验,你就能体会到根据不同条件拼接
SQL
语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态
SQL
这一特性可以彻底摆脱这种痛苦。
M
ybatis
动态
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
,
我们可以更得心应手的完成我的功能,写更少的代码,实现更多的功能。