4. 动态SQL

本文详细介绍了MyBatis中的动态SQL特性,包括IF、WHERE、TRIM、SET、CHOOSE、FOREACH等元素的使用,以及如何利用OGNL表达式简化SQL操作和参数绑定。
摘要由CSDN通过智能技术生成

动态sql

  • 动态 SQL是MyBatis强大特性之一。极大的简化我们拼装SQL的操作
  • 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似
  • MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作
  • OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等
    • 访问对象属性: person.name
    • 调用方法: person.getName()
    • 调用静态属性/方法: @java.lang.Math@PI @java.util.UUID@randomUUID()
    • 调用构造方法: new com.atguigu.bean.Person(‘admin’).name
    • 运算符: +,-*,/,%
    • 逻辑运算符: in,not in,>,>=,<,<=,==,!=
    • 注意:xml中特殊符号如”,>,<等这些都需要使用转义字符

1.1 if where

  • If用于完成简单的判断.
  • Where用于解决SQL语句中where关键字以及条件中第一个and或者or的问题
<select id="getEmpsByConditionIf" resultType="net.suncaper.mybatis.domain.Employee">
		select id , last_name ,email  , gender  
		from tbl_employee 
		<where>
			<if test="id!=null">
				and id = #{id}
			</if>
			<if test="lastName!=null and lastName!=""">
				and last_name = #{lastName}
			</if>
			<if test="email!=null and email.trim()!=''">
				and email = #{email}
			</if>
			<if test=""m".equals(gender) or "f".equals(gender)">
				and gender = #{gender}
			</if>
		</where>
</select>

1.2 trim

  • Trim 可以在条件判断完的SQL语句前后 添加或者去掉指定的字符
  • prefix: 添加前缀
  • prefixOverrides: 去掉前缀
    • suffix: 添加后缀
  • suffixOverrides: 去掉后缀
<select id="getEmpsByConditionTrim" resultType="net.suncaper.mybatis.domain.Employee">
		select id , last_name ,email  , gender  
		from tbl_employee 
		<trim prefix="where"  suffixOverrides="and">
			<if test="id!=null">
				 id = #{id} and
			</if>
			<if test="lastName!=null && lastName!=""">
				 last_name = #{lastName} and
			</if>
			<if test="email!=null and email.trim()!=''">
				 email = #{email} and
			</if>
			<if test=""m".equals(gender) or "f".equals(gender)">
				gender = #{gender}
			</if>
		</trim>
</select>

1.3 set

  • set 主要是用于解决修改操作中SQL语句中可能多出逗号的问题
<update id="updateEmpByConditionSet">
		update  tbl_employee  
		<set>
			<if test="lastName!=null and lastName!=''">
				 last_name = #{lastName},
			</if>
			<if test="email!=null and email.trim()!=''">
				 email = #{email} ,
			</if>
            <if test=""m".equals(gender) or "f".equals(gender)">
				gender = #{gender} 
			</if>
		</set>
		 where id =#{id}
	</update>

1.4 choose(when、otherwise)

  • choose 主要是用于分支判断,类似于java中的switch case,只会满足所有分支中的一个
<select id="getEmpsByConditionChoose" resultType="net.suncaper.mybatis.domain.Employee">
		select id ,last_name, email,gender from tbl_employee
		<where>
			<choose>
				<when test="id!=null">
					id = #{id}
				</when>
				<when test="lastName!=null">
					last_name = #{lastName}
				</when>
				<when test="email!=null">
					email = #{email}
				</when>
				<otherwise>
					 gender = 'm'
				</otherwise>
			</choose>
		</where>
</select>

1.5 foreach

  • foreach 主要用于循环迭代
    • collection: 要迭代的集合
    • item: 当前从集合中迭代出的元素
    • open: 开始字符
    • close:结束字符
    • separator: 元素与元素之间的分隔符
    • index:
      • 迭代的是List集合: index表示的当前元素的下标
      • 迭代的Map集合: index表示的当前元素的key
<select id="getEmpsByConditionForeach" resultType="net.suncaper.mybatis.domain.Employee">
		 select id , last_name, email ,gender from tbl_employee where  id in 
		 <foreach collection="ids" item="curr_id" open="(" close=")" separator="," >
		 		#{curr_id}
		 </foreach>
</select>

1.6 sql

  • sql 标签是用于抽取可重用的sql片段,将相同的,使用频繁的SQL片段抽取出来,单独定义,方便多次引用.
  • 抽取SQL:
<sql id="selectSQL">
		select id , last_name, email ,gender from tbl_employee
</sql>
  • 引用SQL:
<include refid="selectSQL"></include>
  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我超爱写bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值