Mybatis系列八——动态 SQL

动态 SQL

        在 MyBatis 中提供了动态 SQL 功能。将使用 Java 代码拼接 SQL 语句,改变为在 XML 映射文件中使用标签拼接 SQL 语句。
        MyBatis 中动态 SQL 是编写在 mapper.xml 中的,其语法和 JSTL 类似,但是却是基于强大 的 OGNL 表达式实现的。

if 标签

if 标签单分支判断语句
如果test中布尔值为true,if标签中的表达式将添加到SQL表达式中

 
<select id="selectUsersByProperty" resultType="users"> 
	select * from users where 1=1 
	<if test="userid != 0"> 
		and userid = #{userid} 
	if> 
	<if test="username != null and username != ''"> 
		and username = #{username} 
	if> 
	<if test="usersex != null and usersex != ''"> 
		and usersex = #{usersex} 
	if> 
select>

choose、when、otherwise 标签

从多个条件中选择一个使用
顺序判断,当有条件满足,则将对应表达式添加到SQL表达式中,并结束choose标签

 
<select id="selectUsersByChoose" resultType="users"> 
	select * from users where 1=1 
	<choose> 
		<when test="username != null and username != ''"> 
			and username = #{username} 
		when> 
		<when test="usersex != null and usersex != ''"> 
			and usersex = #{usersex} 
		when> 
		<otherwise> 
			and userid = 1 
		otherwise> 
	choose> 
select>

where 标签

使用 where 标签,就不需要提供 where 1=1 这样的条件了。如果判断条件不为空则自动添加 where 关键字,并且会自动去掉第一个条件前面的 and 或 or

 
<select id="selectUsersByPropertyWhere" resultType="users"> 
	select * from users 
	<where> 
		<if test="userid != 0"> 
			and userid = #{userid} 
		if> 
		<if test="username != null and username != ''"> 
			and username = #{username} 
		if> 
		<if test="usersex != null and usersex != ''"> 
			and usersex = #{usersex} 
		if> 
	where> 
select>

bind 标签

bind 标签允许我们在 OGNL 表达式以外创建一个变量,并可以将其绑定到当前的 SQL 语句中。一般应用于模糊查询,通过 bind 绑定通配符和查询值

 
<select id="selectUsersByLikeName" resultType="users"> 
	<bind name="likeName" value="'%'+name+'%'"/> 
	select * from users where username like #{likeName} 
select>

set 标签

set 标签用在 update 语句中。借助 if 标签,可以只对有具体值的字段进行更新。set 标签会自动添加 set 关键字,自动去掉最后一个if语句的多余的逗号

 
<update id="usersUpdate"> 
	update users 
	<set>
		<if test="username != null and username != ''"> 
			username = #{username}, 
		if> 
		<if test="usersex != null and usersex != ''"> 
			usersex = #{usersex}, 
		if> 
	set> 
	where userid = #{userid} 
update>

foreach 标签

foreach 标签的功能非常强大,我们可以将任何可迭代对象如 List、Set 、Map 或者数组对象作为集合参数传递给 foreach 标签进行遍历。它也允许我们指定开头与结尾的字符串以及集合项迭代之间的分隔符

  • collection:表示迭代集合的名称或类型。如果使用名称指定,可以使用@Param 注解指定。该属性为必选属性。
  • item:表示本次迭代获取的元素,若 collection为List、Set 或者数组,则表示其中的元素; 若collection为map,则代表key-value的value,该属性为必选属性
  • open:表示该语句以什么开始,最常用的是左括弧’(’,注意:Mybatis 会将该字符拼接到 循环元素之前,并且只拼接一次,该属性为可选属性。
  • close:表示该语句以什么结束,最常用的是右括弧’)’,注意:Mybatis 会将该字符拼接到 循环元素之后,并且只拼接一次,该属性为可选属性。
  • separator:在每次循环中为 SQL 语句添加 separator 属性指定的字符,但最后一次循环不在添加。 该属性为可选属性
  • index:在 ListSet 和数组中,index 表示当前迭代的序号。在 Map中,index 为元素的 Key,item 为元素的 Value。该属性为可选属性

迭代 List、Set

 
<select id="selectUsersByIdUseCollection" resultType="users"> 
	select * from users where userid in 
	<foreach collection="collection" item="userid" open="(" separator="," close=")"> 
		#{userid} 
	foreach> 
select>

迭代数组

 
<select id="selectUsersByIdUseArray" resultType="users"> 
	select * from users where userid in 
	<foreach collection="array" item="userid" open="(" separator="," close=")"> 
		#{userid} 
	foreach> 
select>

迭代 Map

 
<select id="selectUsersCount" resultType="int"> 
	select count(*) from users where 
	<foreach collection="map" separator="and" item="value" index="key"> 
		${key} = #{value} 
	foreach> 
select>

使用 foreach 标签完成批量添加

<insert id="insertUsersBatch" > 
	insert into users values 
	<foreach collection="collection" item="user" separator=","> 
		(default ,#{user.username},#{user.usersex}) 
	foreach> 
insert>

你可能感兴趣的:(#,Mybatis,sql,xml,数据库)