mybatis中动态SQL常用标签详解

1, MyBatis动态SQL

  • 动态SQL是MyBatis框架中特性之一,在一些组合查询页面需要根据用户输入的条件不同生成不同的查询SQL语句,在JDBC或其他相似框架中需要在代码中拼接SQL语句,容易出错。MyBatis动态SQL可以解决这种问题。

动态SQL标签与JSTL标签相似,它允许在xml中构建不同的SQL语句,常用SQL标签:

  • 判断标签: ifchoose(when,otherwise)
  • 关键字标签: wheresettrim
  • 循环标签: foreach

1.1 if 标签

  • if标签是简单条件判断逻辑,满足指定条件时追加if标签内的sql语句,不满足时不增加。
<select>
		sql语句1
	<if test="条件表达式">
		sql语句2
	</if>
</select>
  • if 标签最常见的使用是在where字句部分,根据不同的条件追加不同的SQL语句。

1.2 choose 标签

  • choose 标签的作用相当于Java 的 switch 语句,和JSTL中的choose标签作用和用法一致,通常与when和otherwise搭配使用。
<select>
		sql语句1
	<choose>
		<when test="条件表达式">
			sql语句2
		</when>
		<when test="条件表达式">
			sql语句3
		</when>
		<otherwise>
			sql语句4
		</otherwise>
	</choose>
</select>

1.3 where 标签

  • where 标签可以在 <where> 标签所在的位置输出一个where关键字,而且可以将后面多余的 and 或者 or 关键字去除
	<select>
		select * from emp 
		<where>
			<if test="deptno!=null">
				deptno=#{deptno}
			</if>
			<if test="salary!=null">
				and salary=#{salary}
			</if>
		</where>
	</select>

1.4 set 标签

  • set 标签主要用在更新操作时,功能和where标签相似,在 <set> 标签所在的位置输出一个set 关键字,可以去除与内容结尾无关的逗号。
	<update>
		update emp 
		<set>
			<if test="empno!=null">
				where empno=#{empno},
			</if>
			<if test="deptno!=null">
			where deptno=#{deptno},
			</if>
		</set>
		<if test="empno!=null">
			where empno=#{empno}
		</if>
	</update>

1.5 trim 标签主要功能:

  • 可以在自己包含的内容前面(或者后面)加上某些前缀,与之对应的属性是 prefixsuffix
  • 可以把包含内容前或者后的某些内容过滤,即忽略,对应的属性是 prefixOverridessuffixOverrides
	<!-- 等价于where标签 -->
<!-- 忽略语句前的 "and" 和 "or" -->
	<trim prefix="where" prefixOverrides="and | or">
		...
	</trim>
	<!-- 等价于set标签 -->
<!-- 忽略语句后的 "," -->
	<trim prefix="set" suffixOverrides=",">
		...
	</trim>

1.6 foreach 标签

  • foreach 标签实现循环逻辑,可以进行一个集合迭代,主要用在构建IN条件中
<!-- select * from emp where empno in (1001.1003.1005); -->
		<select>
			select * from emp where empno in
			<foreach collection="集合" item="迭代变量" open="(" close=")" separator="间隔符(一般是',')">
				#{迭代变量}
			</foreach>
		</select>
<!-- insert into dept values( 1 ,"研发部"),( 2 ,"财务部"),( 3 ,"市场部"); -->
		<insert> 
			insert into dept values
			<foreach collection="depts" item="dept" separator=",">
				(#{dept.deptno},#{dept.dname})
			</foreach>
		</insert>
  • foreach 标签它允许指定一个集合,声明集合项和索引变量,变量可以用在标签体内,它允许指定开放和关闭的字符串,在迭代项之间放置分隔符。

1.7 bind 标签

  • bind 标签可以从OGNL表达式中创建一个变量,并将其绑定到上下文。

mapper.xml 中字符串拼接:

  • 使用连接函数
select * from emp where ename like concat('%',#{ename},'%')
  • 使用build标签
	<select id="findByEname" parameterType="Condition" resultType="Emp">
		<bind name="emp_ename" value="'%'+ename+'%'"/>
			select * from emp where ename like #{emp_ename}
	</select>

1.8 注意:

  • 在Oracle数据库中concat函数有且仅有两个参数,若有多个字符串需要拼接,则需要嵌套调用concat()函数。
  • 如:concat(caoncat(‘’,‘’))
  • 在xml中特殊符号需要转义。
    采用xml转义字符进行转义(分号不能丢)
    < -----> &lt;
    > -----> &gt;
    & -----> &amp;
    ’ -----> &apos;
    " -----> &quou;
    空格 -----> &nbsp;
  • 采用 <![CDATA[]]> 进行说明,将此内容不进行解析。
<if test="salary !=null">
	<choose>
		<when test="salary>50000">
			where salary <![CDATA[>]]> #{salary}
		</when>
加粗样式	<	when test="salary>40000">
		where salary > #{salary}
		</when>
			<otherwise>
				where salary  <![CDATA[<]]> 40000
			</otherwise>
	</choose>
</if>

1.9 #{} 与 ${}取值比较

  • 都是取变量的值
  • #{}在取值时,sql语句中变量值会替换成“”,${} 直接替换成变量的值,因此**#{}** 处理时安全的,可以防止SQL注入,且sql是预编译的。
  • ${} 方式一般用于传入数据对象,例如:表名,字段名。
例如:
	select * from emp where empno=#{id}
	select * from emp where empno=${id}
若id参数的值是1001, 则分别解析为:
	#{}:	select * from emp where empno='1001'
	${}:	select * from emp where empno=1001
若参数是"'empno=1001'or'1=1'",则分别解析为:
	#{}:	"'empno=1001'or'1=1'"
	${}: 	'empno=1001'or'1=1'	
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis是一个流行的ORM框架,通过Mapper文件将Java对象映射到SQL语句。MyBatis的Mapper文件是一个XML文件,它包含了可以执行的SQL语句。动态SQLMyBatis的一个重要的功能,可以根据不同情况,生成不同的SQL语句,从而实现更加灵活的查询。 if标签MyBatis动态SQL的一种标签,它可以根据条件生成动态的SQL语句。if标签的语法如下: ``` <if test="condition1"> SQL语句 </if> ``` 其,test属性表示需要判断的条件,可以是一个字符串表达式或者OGNL表达式。SQL语句则是当满足条件时需要执行的SQL语句。如果条件不满足,则不会执行这段SQL语句。 if标签可以包含多个嵌套的if标签,以实现更加复杂的条件判断。同时,还可以使用choose、when、otherwise标签结合if标签,实现更加灵活的条件判断。例如: ``` <select id="queryUsers" resultType="User"> SELECT * FROM users <where> <if test="username != null and username != ''"> AND username LIKE '%${username}%' </if> <if test="gender != null and gender != ''"> AND gender = #{gender} </if> <choose> <when test="orderBy == 'name'"> ORDER BY username </when> <when test="orderBy == 'age'"> ORDER BY age </when> <otherwise> ORDER BY id </otherwise> </choose> </where> </select> ``` 以上例子是一个查询用户的SQL语句,根据不同情况生成不同的SQL语句。其,if标签根据传入的参数判断是否需要加入username、gender的查询条件,choose标签根据orderBy的值,生成不同的排序条件。 if标签MyBatis动态SQL的重要功能之一,可以根据条件生成不同的SQL语句,从而实现更加灵活的查询。熟练掌握if标签的使用,可以使MyBatis开发更加高效和灵活。 ### 回答2: Mybatis是一款流行的Java ORM框架,它提供了许多方便的功能,其之一就是动态SQL。当我们需要根据不同的条件拼接SQL语句时,就可以使用动态SQL来实现。具体来说,if标签是其一种实现方式,下面将详解其用法。 if标签可以用于where、set、foreach等标签,用于判断当前条件是否成立,如果成立就拼接相应的SQL语句,否则不进行任何操作。其基本语法如下: <if test="condition"> SQL语句 </if> 其,test属性用于指定判断条件,可以是简单的表达式或者是复杂的逻辑语句。下面是一些常用的判断条件: 1. 判断参数是否为空 <if test="param != null"> SQL语句 </if> 2. 判断字符串是否为空 <if test="str != ''"> SQL语句 </if> 3. 判断是否相等 <if test="param == 'value'"> SQL语句 </if> 4. 判断是否大于 <if test="param > 10"> SQL语句 </if> 5. 判断是否包含 <if test="str.indexOf('value') != -1"> SQL语句 </if> 除了以上几种基本用法,if标签还可以嵌套使用,用于实现更复杂的判断逻辑。例如: <if test="param1 != null"> SQL语句 <if test="param2 != null"> SQL语句 </if> </if> 上述代码示例,如果param1不为空,就会拼接第一个SQL语句;如果param2也不为空,则会在第一个SQL语句之后再拼接第二个SQL语句。 总的来说,if标签Mybatis动态SQL的基础,能够帮助我们实现更加灵活的SQL拼接,提高代码的可读性和可维护性。学习和掌握其使用方法,对于开发高效、高质量的程序是非常有帮助的。 ### 回答3: MyBatis是一款非常优秀的Java持久层框架,提供了丰富的SQL查询方式。在进行SQL查询的时候,经常需要根据具体的条件组合而成不同的SQL语句。这个时候可以使用MyBatis动态SQL特性。在动态SQL,if标签常用的一种方式。下面就来详解一下if标签的用法。 if标签的作用:在SQL语句根据判断条件动态生成SQL语句。相当于Java的if语句。 if标签的用法:在Mapper.xml文件,使用if标签包裹需要动态生成的SQL。if标签的属性为test,表示判断条件。属性值可以是任何符合OGNL规则的表达式,常见的有以下几种方式: 1. 如果条件不为空,则生成相应的SQL语句:<![CDATA[需要动态生成的SQL语句]]>。 例如: <select id="findUser" parameterType="User" resultMap="UserMap"> SELECT * FROM user <where> <if test="name != null and name != ''"> AND name = #{name} </if> </where> </select> 当调用findUser方法时,如果传入的name不为空,那么就会生成如下的SQL语句: SELECT * FROM user WHERE name = ? 2. 如果条件为true,则生成相应的SQL语句: 例如: <select id="findUsers" resultMap="UserMap"> SELECT * FROM user <where> <if test="name != null and name != ''"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select> 当调用findUsers方法时,如果传入的name和age分别为"Tom"和20,那么就会生成如下的SQL语句: SELECT * FROM user WHERE name = 'Tom' AND age = 20 3. 如果条件为false,则不在生成相应的SQL语句: 例如: <select id="findUsers" resultMap="UserMap"> SELECT * FROM user <where> <if test="name != null and name != ''"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select> 当调用findUsers方法时,如果传入的name为"Tom",age为空,那么就会生成如下的SQL语句: SELECT * FROM user WHERE name = 'Tom' if标签的嵌套: if标签可以进行嵌套,从而实现更加灵活的SQL生成方式。 例如: <select id="findUsers" resultMap="UserMap"> SELECT * FROM user <where> <if test="name != null and name != ''"> AND name = #{name} </if> <if test="age != null"> <if test="age < 18"> AND age < 18 </if> <if test="age >= 18 and age < 30"> AND age >= 18 AND age < 30 </if> <if test="age >= 30"> AND age >= 30 </if> </if> </where> </select> 当调用findUsers方法时,如果传入的name为空,age为25,那么就会生成如下的SQL语句: SELECT * FROM user WHERE age >= 18 AND age < 30 以上就是if标签的用法详解。使用if标签可以让查询条件更加灵活、动态,深受开发者们的喜爱。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值