9、mybatis中动态sql的使用

对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点;当知道了为什么的时候就开始了解如何用的问题,如何使用mybatis、有几种使用方式、各种方式的优缺点,在这个阶段也会学习mybatis涉及到的一些标签的用法;当知道了基础用法之后,就开始接触一些高级的用法,例如动态sql的使用、mybatis的缓存使用等;至此,在实战项目中使用mybatis进行开发已经没有问题了。

接下来就开始深入的研究一下mybatis这个持久层的框架,在纯技术的方面进行研究,提高自己的能力。首先,大家需要了解一下mybatis的整体技术架构和工作原理;接下来,就开始了解一下mybatis各大核心组件的具体功能及其工作原理。至此,算是对mybatis的原理简单的了解一下了,由于博主的能力有限,因此对于mybatis的框架技术研究也就到这里算结束了。

最后会了解一些其他的东西,例如:mybatis的逆向工程使用、如何开发一个mybatis插件,在这里会介绍一下mybatis的分页实现等。

至此,mybatis也算是入门了,出去就可以和别人说,你稍微了解mybatis框架,对其也多少有一点自己的理解和看法了。

目录

1、动态sql 如何理解?

1、1 什么是动态sql

1、2 OGNL 表达式        

2、动态sql 如何使用?

2、1 if 、where、set 标签

2、2 choose (when、otherwise)标签

2、3 trim 标签

2、4 foreach 标签


之前的 文章中 已经描述了mybatis进行增、删、改、查基本操作的处理方法,还有如何使用输入映射和输出映射。mybatis 为了提高易用性和灵活性,还提供了动态sql的功能。

1、动态sql 如何理解?

1、1 什么是动态sql

简单一句话,mybatis 可以根据特定的条件实现映射文件中 sql语句的动态拼接,这就是动态sql。

想一种场景,将User 传入到sql映射文件,根据user_name 或者 age 进行数据的查询,如果user_name 或者 age 为空时,则不需要添加这个条件,如何实现呢?带着这个问题继续往下看。

1、2 OGNL 表达式        

mybatis 中动态sql的实现使用的是一系列的标签和属性,这些是基于OGNL 表达式。那么什么是OGNL 表达式呢?

我没有研究过OGNL表达式,这里对此就不做具体描述了,看一下百度百科的介绍:OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。

OGNL 通过链式风格访问对象及其属性。

2、动态sql 如何使用?

mybatis 中动态sql的实现依赖的是一系列的标签,包括:if、choose、when、otherwise、trim、where、set、foreach 等,具体介绍和使用说明如下。

2、1 if 、where、set 标签

if 标签,同java 中的if,进行条件判断,在sql 映射文件中的基本用法如下:

<select id="getUsers" resultType="map">
	select * from user where
	<if test="id != null">
		id = #{id}
	</if>
	<!-- ognl会自动将数字和字符串进行转换 -->
	<if test="age == 0">
		and age = #{age}
	</if>
</select>

例如:上边这个写法,如果id == null,就会到sql 错误,针对于这种情况,有两种处理方式: 

第一种就是流行最广泛的,直接使用万能语句“where 1=1”;

第二种是使用where标签,具体用法如下:

<!-- 此时 and 要写在前边 -->
<where>
	<if test="id != null">
		and id = #{id}
	</if>
	<if test="age == 0">
		and age = #{age}
	</if>
</where>

 第三种是使用trim 自定义标签规则实现,具体用法在 2、3 展示。

set 标签一般用在进行数据修改sql 的拼接上,具体使用如下:

<update id="updateStudent">
	update student
	<!-- 会自动添加set ,并去掉无用的 逗号,类似于 where 标签 -->
	<set>
		<if test="name != null">name = #{name}, </if>
		<if test="age != null">age = #{age}, </if>
		<if test="sex != null">sex = #{sex}, </if>
	</set>
	where id = #{id}
</update>

2、2 choose (when、otherwise)标签

选择标签,类似于java中的 switch,具体使用如下:

<select id="selectUsers" resultType="map">
	<where>
		<choose>
			<!-- 注意:每次只会进入一个分支 -->
			<when test="id != null">
				id=#{id}
			</when>
			<when test="name != null">
				name = #{name}
			</when>
			<otherwise>
				age = #{age}
			</otherwise>
		</choose>
	</where>
</select>

2、3 trim 标签

trim 标签可以用来自定义拼接的规则(或者是指定sql 语句拼接时截取的规则),trim 中返回的内容是整个字符串拼接后的结果使用,接下俩使用trim 标签继续实现 2、1 中的需求,具体如下:

<!-- prefix: 给拼接后的字符串添加一个前缀 where -->
<!-- prefixOverrides:去掉整个字符串前面为and的字符串-->
<!-- suffix:给拼接后的字符串添加一个后缀 and-->
<!-- suffixOverrides:去掉整个字符串后面为 and的字符串-->

<select id="selectUsers" resultType="map">
	<trim prefix="where" suffix="and" suffixOverrides="and">
		<if test="id != null">
			id = #{id}
		</if>
		<if test="age == 0">
			age = #{age}
		</if>
	</trim>
</select>

因为 trim 是自定义拼接的规则,所以,使用trim 也可以实现set 标签的功能,大家可以自己尝试写一下,发到评论区,大家一起看一下,在这里就不写了。 

2、4 foreach 标签

循环拼接时用到的标签,一般用于批量数据添加,对传进来的 list 进行循环拼接查询语句,具体使用方式如下:

<!--  批量添加记录的写法
		使用 foreach 进行批量添加语句的拼接,
		其中collection 是接受的数据类型,
		item 是迭代的每一个元素
		separator 是连接符
-->
<insert id="insertUserList" useGeneratedKeys="true" keyProperty="id">
	insert into oa_user (id, loginName, name) values
	<foreach collection="list" item="user" separator=",">
		(#{user.id}, #{user.loginName}, #{user.name})
	</foreach>
</insert>

好了,如果同学从 第一篇 一直看到这个地方,对于mybatis 的使用应该是有一定的了解了,在实际开发中应该没有问题了。之后,编写的文章中,更多的是对于一些原理性的底层性的知识介绍,有兴趣的同学可以继续。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值