Mybatis中的动态SQL

Mybatis的动态SQL包括以下几种元素

元素作用备注
if判断语句单条件分支判断
choose(when,otherwise)相当于java中的switch…case语句多条件分支判断
trim(where,set)辅助元素,用于特定的SQL拼装问题,比如去掉多余的and,or等用于SQL拼装的问题
foreach循环语句在SQL语句中的in语句等列举条件常用
bind通过OGNL表达式自定义一个上下文变量常用于模糊查询中

if元素

if元素是最常用的判断语句,相当于java中的if语句,常常与test属性联合使用。

										使用if构建动态SQL
<select id = "selStu" parameterType = "String" resultType = "stu">
	SELECT stuId,stuName,stuNote 
	FROM t_stu
	WHERE 1 = 1
	<if test="stuName != null and stuName != ''">
		AND stuName like CONCAT('%',#{stuName},'%')
</select>

当参数stuName传递进映射器时,如果参数不为空,则对stuName进行模糊查询。

choose,when,otherwise元素

choose元素类似于java中的switch…case…default…语句,进行多条件分支判断。


  • 假设有这样一个场景:
    • 如果学生学号不为空,则只用学号查询。
    • 如果学生学号为空,而学生备注不为空。则按备注查询。
    • 如果学生学号,备注都为空,则学生姓名不能为空。

							        	使用choose,when,otherwise
<select id = "selStu" parameterType = "stu" resultType = "stu">
	SELECT stuId,stuName,stuNote 
	FROM t_stu
	WHERE 1 = 1
	<choose>
		<when test = "stuId != null and stuId != ''">
			AND stuId = #{stuId}
		</when>
		<when test ="stuNote != null and stuNote != ''">
			AND stuNote = #{stuNote}
		</when>
		<otherwise>
			AND stuName IS NOT NULL
		</otherwise>
	</choose>
</select>

trim,where,set元素

where元素

你会发现前面的两条动态SQL语句中都加有 1 = 1 条件,如果没有加入这个条件,那可能会变成一条错误的语句:

SELECT stuId,stuName,stuNote 
	FROM t_stu
	WHERE
	AND stuName like CONCAT('%',#{stuName},'%')

显然是错误的。但是我们可以用where元素去掉1 = 1这个条件,也一样能到达预期的效果。

										使用where元素
<select id = "selStu" parameterType = "String" resultType = "stu">
	SELECT stuId,stuName,stuNote 
	FROM t_stu
	<where>
		<if test="stuName != null and stuName != ''">
			AND stuName like CONCAT('%',#{stuName},'%')
		<if test="stuNote != null and stuNote != ''">
			AND stuNote like CONCAT('%',#{stuNote },'%')
	</where>
</select>

当where元素里的条件成立时,才会加入where这个SQL关键字到组装的SQL里面,否则就不加人。

trim元素

有时候需要去掉一些特殊的SQL语法,例如and,or。Mybatis可以使用trim元素到达预期的效果。

trim元素里中的四个参数:

参数作用
prefix前缀
prefixOverrides去掉第一个关键字(and或or)
suffix后缀
suffixOverrides去掉最后一个关键字或符号(,)
										使用trim元素
<select id = "selStu" parameterType = "String" resultType = "stu">
	SELECT stuId,stuName,stuNote 
	FROM t_stu
	<trim prefix = "where" prefixOverrides = "and">
		<if test="stuName != null and stuName != ''">
			AND stuName like CONCAT('%',#{stuName},'%')
	</trim>
</select>

set元素

set元素常常用于数据的更新语句。

										使用set元素
<update id = "updStu" parameterType = "stu">
	UODATE t_stu
	<set>
		<if test="stuName != null and stuName != ''">
			stuName = #{stuName },
		</if>
		<if test="stuNote != null and stuNote != ''">
			stuNote = #{stuNote }
		</if>
	</set>
	WHERE stuId = #{stuId}
</update>

foreach元素

foreach使用循环语句,它的作用是遍历集合,能够很好地支持数组和List,Set接口的集合,往往用于SQL的in关键字中。

										使用foreach元素 
<select id = "selStuById" resultMap = "stuMap">
	SELECT stuId,stuName,stuNote 
	FROM t_stu
	WHERE stuId IN
	<foreach item = "stuId" index = "index" collection = "stuIdList"
		open = "(" separaotr = "," close = ")">
		#{stuId}
	</foreach>
</select>
参数作用
collection配置的stuIDList是传递进来的参数名称,它可以是一个数组,List,Set等集合
item循环当前的元素
index当前元素在集合的位置下标
open和close是以什么符号将这些集合元素包装起来
separaotr各个元素的间隔符

bind元素

bind元素的作用是通过OGNL表达式自定义一个上下文变量,这样更方便使用,在模糊查询中很常见。

										使用bind元素
<select id = "selStu" resultMap = "stuMap">
	<bind name = "stuName" value = "'%'+'_Name'+'%'"/>
	<bind name = "stuNote" value = "'%'+'_Note'+'%'"/>
	SELECT stuId,stuName,stuNote 
	FROM t_stu
	WHERE stuName LIKE#{stuName}
	AND stuNote LIKE #{stuNote}
</select>

这里面的_Name和_Note是传递进来的参数,它和通配符(%)连接后分别赋值给stuName和stuNote,然后可以在select语句中使用这个变量进行模糊查询了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值