MyBatis动态Sql标签的基本使用

我们在使用Mybatis会经常用到一些动态SQL,Mybatis提供了一些标签供我们使用,本文简单介绍一些常用的标签;
在动态sql中如果出现了大于号(>),小于号(<),大于等于号(>=), 小于等于号(<=),最好将其转换为实体符号,否则,XML可能会出现解析出错问题;特别是对于小于号,在XML中是绝对不能出现的,否则解析一定出错误。
我们可以通过替换符号进行替换:
在这里插入图片描述

if标签

对于该标签的执行,当test的值为true时,会讲其包含的SQL片断拼接到SQL语句中;在只是要标签的时候,存在一个比较麻烦的地方,我们需要在where后手工添加1=1的子句,因为如果where后的所有标签条件都是false,并且where子句后没有1=1,则SQL中就后面就一个空的where,SQL就出错看。所以当在where后,要添加一个1=1的子句,以防止这种情况发生。

<select id="getEmpsByConditionIf" resultType="com.yilu.mybatis.Employee">
		select * from tbl_employee
		where 1=1
		<!-- 
			test:判断表达式(OGNL)
			从参数中取值进行判断
			遇见特殊字符一个写转义字符
		 -->
		
		 	<if test="id!=null">
			and id=#{id}
			</if>
			<if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
				and last_name like #{lastName}
			</if>
			<if test="email != null and email.trim()!= &quot;&quot;">
				and email=#{email}
			</if>
			<!-- OGNL会进行字符串与数字的转换判断 "0"==0 -->
			<if test="gender==0 or gender==1">
				and gender=#{gender}
			</if>
		
	</select>

where标签

在上面使用标签的时候,我们需要加一个1=1子句,但是还存在一个问题是,如果数据库很大的时候,会严重影响查询效率;
使用标签在有查询条件的时候,可以自动添加上where子句,没有查询条件时,就不会添加where子句,需要注意的是,第一个if标签中的SQL片段可以不包含and,当然写上也不会报错,系统会将自动去除多余的and,但是其他if中的SQL语句的and,必须要求写上,否则SQL语句拼接会出错误。

<select id="getEmpsByConditionIf" resultType="com.yilu.mybatis.Employee">
		select * from tbl_employee
		<!-- where 1=1-->
		<!-- 方法2:mybatis使用where标签 -->
		<!-- 
			test:判断表达式(OGNL)
			从参数中取值进行判断
			遇见特殊字符一个写转义字符
		 -->
		 <where>
		 	<if test="id!=null">
			and id=#{id}
			</if>
			<if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
				and last_name like #{lastName}
			</if>
			<if test="email != null and email.trim()!= &quot;&quot;">
				and email=#{email}
			</if>
			<!-- OGNL会进行字符串与数字的转换判断 "0"==0 -->
			<if test="gender==0 or gender==1">
				and gender=#{gender}
			</if>
		 </where>
		
	</select>

trim标签

我们在使用where标签时,and是写在sql条件片断的前面,如果sql片断后面多出的and或者or where标签不能解决 。
那么当and写在sql后面,我们可以使用标签:
trim 自定义字符串截取的规则
prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
prefix给拼串后的整个字符串加一个前缀
prefixOverrides="":
前缀覆盖: 去掉整个字符串前面多余的字符
suffix="":后缀
suffix给拼串后的整个字符串加一个后缀
suffixOverrides=""
后缀覆盖:去掉整个字符串后面多余的字符

<select id="getEmpsByConditionTrim" resultType="com.yilu.mybatis.Employee">
	select * from tbl_employee
	<trim prefix="where" suffixOverrides="and">
	 	<if test="id!=null">
		id=#{id} and 
		</if>
		<if test="lastName!=null &amp;&amp; lastName!=&quot;&quot;">
			last_name like #{lastName} and 
		</if>
		<if test="email != null and email.trim()!= &quot;&quot;">
			email=#{email} and
		</if>
		<if test="gender==0 or gender==1">
			gender=#{gender} and 
		</if>
	 </trim>
</select>

choose标签

choose(when,otherwise):分支选择 相当于switch case:break;

对于标签,其会从第一个开始逐个向后进行条件判断,如果出现中test属性为true,则直接结束choose标签,不再向后进行判断查找,如果when标签中的test判断结果都是false,则最后会执行otherwise标签;

在下面的例子中:如果带了id就用id查,如果带了lastName就用lastName查,只会进入其中一个

 <select id="getEmpsByConditionChoose" resultType="com.yilu.mybatis.Employee">
	 	select * from tbl_employee
	 	<where>
	 		<choose>
	 			<when test="id!=null">
	 				id=#{id}
	 			</when>
	 			<when test="lastName!=null">
	 				last_name like #{lastName}
	 			</when>
	 			<when test="email!=null">
	 				email=#{email}
	 			</when>
	 			<!-- 其他情况查询所有 -->
	 			<otherwise>
	 				1=1
	 			</otherwise>
	 		</choose>
	 	</where>
	 
	 </select>

foreach标签

标签用于实现对于数组与集合的遍历。
1.collection:指定要遍历的集合:
list类型的参数会特殊处理封装到map中,map的key就叫list
2. item:将当前遍历出来的元素赋值给指定变量
3.#{变量名} 就能取出变量的值也就是当前遍历出来的元素
4.separator每个元素之间的分隔符
5.open:遍历所有结果拼接一个开始的字符
6.close:遍历所有结果拼接一个结束的字符

 <select id="getEmpsByConditionForeach" resultType="com.yilu.mybatis.Employee">
	 	select * from tbl_employee 
	  <if test="list!= null and list.size > 0">
	    where id in
		   <foreach collection="list" item="item_id"
		   separator="," open="(" close=")">
		  	#{item_id}
		  </foreach>
	  </if>
	  </select>

sql标签

抽取可重用的sql片段。方便后面引用
1、sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用
2、include来引用已经抽取的sql;

<select id="selectStudentForeachList" resultType="com.yilu.beans.Student">
	<!-- select * from student -->
	<include refid="selectColumns"></include>
	<if test="list != null and list.size()>0">
		<where>
			<foreach collection="list" item="stu" open="id in (" close=")" separator=",">
				#{stu.id}
			</foreach>
		</where>
	</if>
</select>


<!-- sql片段 -->
<sql id="selectColumns">
	select * from student
</sql>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis 是一种优秀的 ORM 框架,它的优势之一就是可以执行动态 SQL动态 SQL 允许你在运行时创建 SQL 语句,根据不同的情况动态地拼接 SQL 语句,这使得 SQL 语句的编写更加灵活。 在 MyBatis 中,动态 SQL 的执行原理如下: 1. MyBatis 会解析 Mapper 文件中的 SQL 语句,根据其中的动态 SQL 片段,生成相应的 SQL 语句。 2. 在执行 SQL 语句之前,MyBatis 会将 SQL 语句中的占位符替换为具体的参数值。 3. MyBatis使用 JDBC 执行生成的 SQL 语句,执行查询或者更新操作。 MyBatis 提供了以下几种动态 SQL 语句: 1. if 元素:用于根据条件判断是否包含某一部分 SQL 语句。 2. choose 元素:类似于 Java 中的 switch 语句,用于从多个选项中选择一个。 3. when 元素:用于在 choose 元素中定义选项。 4. otherwise 元素:用于在 choose 元素中定义默认选项。 5. trim 元素:用于从 SQL 语句的开头或结尾去除指定的字符串。 6. where 元素:用于在 SQL 语句中添加 WHERE 子句。 7. set 元素:用于在 SQL 语句中添加 SET 子句。 8. foreach 元素:用于对集合进行遍历,并生成对应的 SQL 语句。 以上这些元素可以组合使用,从而生成更加复杂的 SQL 语句。使用动态 SQL,可以大大提高 MyBatis 的灵活性和可扩展性。 ### 回答2: MyBatis动态SQL的执行原理如下: MyBatis是一款基于Java的持久层框架,它的动态SQL功能是通过使用XML或注解来定义SQL语句,以及使用动态标签和OGNL表达式来实现动态SQL的执行。 首先,MyBatis会解析XML配置文件或注解中定义的SQL语句,并将其转化为内部存储结构,通常是一棵解析树。这个过程通常在应用程序启动时完成,以提高后续SQL的执行效率。 在执行SQL语句时,MyBatis会先根据动态标签的判断条件来确定是否需要执行该SQL语句。动态标签例如`<if>`、`<choose>`、`<when>`、`<otherwise>`等,通过判断条件来决定是否包含或执行对应的SQL片段。 在动态标签中,我们可以使用OGNL(对象图导航语言)表达式来实现更灵活的判断逻辑。OGNL可以访问和操作对象的属性、方法等,并支持一些基本的判断和计算操作,如判断集合是否为空、字符串是否相等等。 执行动态SQL时,MyBatis还会将动态SQL中的动态标签和OGNL表达式进行解析和执行,根据判断结果来拼接最终的SQL语句。这个过程通常发生在SQL语句被执行之前。 最后,MyBatis使用JDBC连接数据库,并将最终生成的SQL语句发送到数据库服务器执行。数据库服务器返回执行结果后,MyBatis会将结果转换为Java对象,并返回给应用程序进行后续处理。 总结来说,MyBatis动态SQL的执行原理是通过解析和执行动态标签和OGNL表达式来生成最终的SQL语句,并将其发送到数据库服务器执行。这种动态化的特点使得开发者能够根据不同的条件和场景生成不同的SQL语句,从而提高应用程序的灵活性和性能。 ### 回答3: MyBatis动态SQL的执行原理如下: 1. 解析mapper文件:MyBatis通过解析mapper文件,将其中的SQL语句解析为对应的对象模型。 2. 处理动态标签MyBatis中的动态SQL采用了一些特殊的标签,如if、choose、when、otherwise等,用于根据不同的条件生成不同的SQL语句。在执行前,MyBatis会根据传入的参数动态处理这些标签,生成最终的SQL语句。 3. 参数绑定:MyBatis会将传入的参数与SQL语句中的占位符进行绑定。根据参数的类型,MyBatis会调用对应的类型处理器将参数转换成SQL语句中的具体数值。 4. 执行SQL语句:MyBatis会将生成的SQL语句交给对应的数据库驱动程序执行。数据库驱动程序会将SQL语句发送到数据库服务器,数据库服务器解析执行SQL语句,并返回执行结果。 5. 结果映射:MyBatis会根据mapper文件中的配置,将数据库返回的结果映射为Java对象。MyBatis提供了丰富的结果映射方式,包括基本类型、POJO对象、集合等。 总的来说,MyBatis动态SQL的执行原理可以归纳为解析mapper文件、处理动态标签、参数绑定、执行SQL语句和结果映射。通过这一步骤,MyBatis实现了动态生成SQL语句、参数绑定和结果映射的功能,为开发者提供了方便灵活的SQL操作方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值