MyBatis中choose-when-otherwise、trim、foreach、bind的使用

本文深入探讨MyBatis框架中动态SQL的高级应用,包括choose、trim、foreach及bind元素的巧妙运用,旨在帮助开发者掌握更为灵活的SQL构建方式,提高数据库查询效率。

choose-when-otherwise

  1. 如果角色编号(roleNo)不为空的话,则只用角色编号作为条件查询
  2. 当角色编号为空,而角色名称不为空的话,则用角色名称作为查询条件
  3. 如果角色编号和角色名称都为空的,则要求备注不为空
	<select id="findRole2" parameterType="role" resultMap="roleResultMap">
		select role_no, role_name, note from t_role
		where 1=1
		<choose>
			<when test="roleNo != null and roleNo !=''">
				AND role_no = #{roleNo}
			</when>
			<when test="roleName != null and roleName !=''">
				AND role_name like concat('%', #{roleName}, '%')
			</when>
			<otherwise>
				AND note is not null
			</otherwise>
		</choose>
	</select>

trim

trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某写后缀,与之对应的属性是prefix和suffix; 可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides。

字符串操作
prefix在前面加上某些内容
suffix在后面加上某些内容
prefixOverrides在前面忽略某些内容
suffixOverrides在后面忽略某些内容
	<select id="findRole4" parameterType="string" resultMap="roleResultMap">
		select role_no, role_name, note from t_role
		<trim prefix="where" prefixOverrides="and">
			<if test="roleName != null and roleName !=''">
				and role_name like concat('%', #{roleName}, '%')
			</if>
		</trim>
	</select>

该例子如果不用trim的话,那么将会变成select role_no, role_name, note from t_role where and role_name like concat('%', #{roleName}, '%');那么这样子sql语句中便会多出‘and’,使用prefixOverrides将where后面句子前面的and忽略。运行时候的结果就是select role_no, role_name, note from t_role where role_name like concat('%', #{roleName}, '%');

foreach

  1. collection配置的是传进来的数组、List、Set等集合
  2. item配置的是循环中单前的元素
  3. index是当前循环元素的下标
  4. open、close配置的是以什么符号将这些集合元素包装起来
  5. separator是各个元素的间隔符
	<select id="findRoleByNums" resultMap="roleResultMap">
		select role_no, role_name, note from t_role where role_no in
		<foreach item="roleNo" index="index" collection="roleNoList"
			open="(" separator="," close=")">
			#{roleNo}
		</foreach>
	</select>

bind

bind元素是通过OGNL表达式去定义一个上下文变量,这样子使用起来更加方便。

	<select id="findRole6" resultMap="roleResultMap">
		<bind name="pattern_roleName" value="'%' + roleName + '%'" />
		<bind name="pattern_note" value="'%' + note + '%'" />
		SELECT role_no, role_name, note FROM t_role
		where role_name like
		#{pattern_roleName}
		and note like #{pattern_note}
	</select>

使用bind定义变量,不管在orcale或者mysql中都可以使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值