mybatis中动态sql的操作(where、foreach、if、set、choose、trim标签的使用)

 

 

动态sql需要使用的标签

在mybatis中,我们除了做一些固定sql之外,还要做一些动态的sql拼接,因为我们要对从浏览器传下来的参数进行值判断,为不为空这些啊,所以我们根据条件去做到动态sql拼接,才满足我们的需求。

      在mybitis中的sql语句都是进行拼接的,意思就是任何用于动态sql的标签都是在前面已经写的sql语句后面进行追加sql语句。

 

逻辑标签的使用

1、<where>--<if>标签

if标签,顾名思义,就和我们Java中的if一样,是用做判断的,if标签可单独使用,也可嵌套where标签使用。它的使用也很简单。

 

比如我做查找时:(test属性就是写条件表达式的)

<select id="findUserBeanByMap" resultMap="userMap">
	select
	id,login_name,user_name,age,gender,user_pwd,birthday,create_time from
	t_user 
		
	<where>
	    1 = 1
		<if test="m.userName != null &amp;&amp; m.userName != ''">
			and user_name like concat(#{m.userName},'%')
		</if>
		<if test="m.age != null">
			and age = #{m.age}
		</if>
		<if test="m.gender != null">
			and gender = #{m.gender}
		</if>
	</where>

</select>

里面有where标签,这个标签就是自动在后面拼接where的,用于我们拼接where条件,在where标签中,如果第一个条件前面含有“AND”或“OR”,它会自动进行忽略,一般和if标签进行嵌套使用,用于动态拼接where条件。同时注意的是:在xml中有时我们用一些“<”这类符号去做if条件判断时,可能它会认不到,所以我们要用到转义字符,常用的有:

&lt; < 小于号 
&gt; > 大于号 
&amp; & 和 
&apos; ' 单引号 
&quot; " 双引号

实体必须以符号"&"开头,以符号";"结尾。 注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。

其实标签之间是可以嵌套使用,也可以单独使用,根据你的情况而定。

 

2、<foreach>标签

顾名思义,就是用作循环用的,相当于java中的foreach循环。

 

比如我们做批量新增时:(collection表示的是集合,只就是从接口传下来的集合;item表示的是集合每个单独的值,自己随便起名字;separator表示每次循环结束用什么隔开)

<insert id="addBatchUserBean">
	<!-- 批量新增的语法:insert into 表 (列名列表) values (),(),()…… -->
	insert into
	t_user(login_name,user_name,user_pwd,age,gender,birthday,create_time)
	values
	<!-- 循环语句,类似我们java的 for(UserBean u,users){ } ,separator表示每个结果之间用什么隔开-->
	<foreach collection="users" item="u" separator=",">
		(#{u.loginName},#{u.userName},#{u.password},#{u.age},#{u.gender},#{u.birthday},now())
	</foreach>
</insert>

 

比如我们用于批量删除时:(foreach 该标记主要用于遍历集合或者数组,collection 属性代表需要遍历的集合或数组,item 代表每次遍历取出来的数据,open 代表遍历开始前,以什么符号开始, close 代表遍历结束后,以什么符号结束 ,separator 代表每次遍历的分隔符):

<delete id="deleteBatchUserBean">
	<!-- 批量删除的语法:delete from 表 where id in (……) -->
	<!-- collection 如果接口传下来的list参数并未取参数别名,那么此处就要写成array,
    取了别名,那么就按照别名来写,例如:ids -->

	delete from t_user where id in
	<foreach collection="ids" item="id" open="(" close=")"
		separator=",">
		#{id}
	</foreach>

<!-- foreach 该标记主要用于遍历集合或者数组,collection 属性代表需要遍历的
集合或数组 item 代表每次遍历取出来的数据,open 代表遍历开始前,以什么符号开始, 
close 代表遍历结束后,以什么符号结束 ,separator 代表每次遍历的分隔符 -->
</delete>

 

3、<set>--<if>标签

set标签主要用在做修改的时候,我们要实现按需修改,就是只对表中的特定列进行修改的时候用,它主要和if标签嵌套使用。

这里,set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号,因为用了条件语句之后很可能就会在生成的 SQL 语句的后面留下这些逗号。(译者注:因为用的是“if”元素,若最后一个“if”没有匹配上而前面的匹配上,SQL 语句的最后就会有一个逗号遗留),意思是如果在set中最后的条件没匹配上,会遗留下前面匹配上的条件的“,”,所以为了避免这种情况最后的条件一定要匹配上,所以我们可以在最后加上一个一定能匹配上的条件。

比如:

<update id="updateUserBean">
	update t_user 
	<!-- set-if判断,可以在修改的时候对指定列进行修改,而不是全部修改-->
	<set>
		<if test="u.loginName != null and u.loginName != ''">
			login_name = #{u.loginName},
		</if>
		<if test="u.userName != null and u.userName != ''">
			user_name = #{u.userName},
		</if>
		<if test="u.age != null">
			age = #{u.age},
		</if>
		<if test="u.gender != null">
			gender = #{u.gender},
		</if>
		<if test="u.password != null and u.password != ''">
			user_pwd = #{u.password},
		</if>
		<if test="u.birthday != null">
			birthday = #{u.birthday},
		</if>
		update_time = now()
	</set>
	where id = #{u.id};
</update>

 

4、<choose>--<when>--<otherwise>标签

这一组标签等同于java中的switch case default条件控制语句,用法如下,不过比起比起上面的where--if嵌套,明显where--if要更好一些,where--if足以。

<select id="findUserBeanByObject" resultMap="userMap">
	select
	id,login_name,user_name,age,gender,user_pwd,birthday,create_time from
	t_user
		
	<where>
	<!-- choose when otherwise 等同于java中的switch case default -->
		<choose>
			<when test="u.userName != null &amp;&amp; u.userName != ''">
				and user_name like concat(#{u.userName},'%')
			</when>
			<when test="u.age != null">
				and age = #{u.age}
			</when>
			<when test="u.gender != null">
				and gender = #{u.gender}
			</when>
			<otherwise>
				1=1 
			</otherwise>
		</choose>
	</where> 

	order by ${sort} ${order}-->

</select>

 

5、<trim>--<if>标签

这个标签其实和where--if标签非常接近,也是动态拼接,不过使用where--if就足够了。

<select id="findUserBeanByObject" resultMap="userMap">
	select
	id,login_name,user_name,age,gender,user_pwd,birthday,create_time from
	t_user
		
   <!-- trim if 作用跟where if 非常的接近
	prefix="where" 表示需要条件判断之前,以什么开始
	prefixOverrides="and|or" 如果where 后直接跟and或者or ,那么将使用空字符串替换-->
		
	<trim prefix="where" prefixOverrides="and|or">
		<if test="u.userName != null &amp;&amp; u.userName != ''">
			and user_name like concat(#{u.userName},'%')
		</if>
		<if test="u.age != null">
			and age = #{u.age}
		</if>
		<if test="u.gender != null">
			and gender = #{u.gender}
		</if>
	</trim>
		
	order by ${sort} ${order}
</select>

以上这些标签足够了,也是我们常用的。

 

更多动态sql标签参考myvatis官网http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值