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 的使用应该是有一定的了解了,在实际开发中应该没有问题了。之后,编写的文章中,更多的是对于一些原理性的底层性的知识介绍,有兴趣的同学可以继续。
9、mybatis中动态sql的使用相关推荐
- Mybatis中动态sql小结
这篇文章讲述的是Mybatis中动态sql小结,如有错误或不当之处,还望各位大神批评指正. 什么是动态sql MyBatis 的强大特性之一便是它的动态 SQL,它极大的简化了我们拼接SQL的操作. ...
- MyBatis中动态sql实现时间范围比较的查询
场景 前端传递两个时间参数,开始时间和结束时间,然后从数据库中筛选出某个时间属性在此范围的数据. Mybatis的动态sql的写法. 注: 博客: https://blog.csdn.net/bada ...
- MyBatis中动态sql的模糊搜索、foreach实现In集合的用法
场景 在使用MyBatis的动态sql时,常见的是传递一个ID的数组,查询记录的 ID在这个数组中的记录和模糊搜索这两种场景. 注: 博客: https://blog.csdn.net/badao_l ...
- c++ 传入动态参数_一文了解Mybatis中动态SQL的实现
一.动态SQL简介 MyBatis的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的 ...
- MyBatis中动态SQL
01为什么使用sql语句的动态拼接 目前学习的内容sql语句都是直接写死的,但是在实际的开发过程中很多的sql语句都是根据不同的业务情况进行不同的改变的 02 解决的方案 sql语句的动态拼接 03学 ...
- SQL 拼接语句输出_一文了解Mybatis中动态SQL的实现
一.动态SQL简介 MyBatis的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的 ...
- MyBatis中动态sql语句标签详解
动态 SQL 通常写在mapper包下面的地址映射配置文件(.xml)中.根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 动态SQL语句标 ...
- mybatis中动态sql常用的标签
用来循环容器的标签forEach,查看例子 //mapper中我们要为这个方法传递的是一个容器,将容器中的元素一个一个的 //拼接到xml的方法中就要使用这个forEach这个标签了 public L ...
- MyBatis中动态sql实现传递多个参数并使用if进行参数的判断和实现like模糊搜索以及foreach实现in集合
场景 在mapper接口层方法参数有id的数组和姓名的模糊搜索和类型的三个参数. 现在需要将这三个参数传递在动态sql的xml中接受并进行判断不为空. 然后查询数据库中记录在第一个参数id数组中的并且 ...
最新文章
- img 隐藏_CSS3界面样式和溢出文字隐藏overflow
- 成功解决 class 'AttributeError' : 'Editor' object has no attribute '_Editor__markerMap'
- 全球及中国食品行业发展潜力与投资机会评估报告2022版
- MS Lync2010客户端开发体会
- 10 计算机组成原理第六章 总线 总线的概念与分类 总线性能指标 总线仲裁 总线操作和定时 总线标准
- 超18万人次下载使用的 Cloud Toolkit 的成长历程
- C# DataTable学习
- css 实现居中的五种方式
- 汽车平顺性与仿真分析matlab,基于matlab的汽车平顺性的建模与仿真.docx
- jQuery.获取子节点
- 【面试】JavaEE基础
- phpcmsv9 更换域名出现页面无法访问后怎么办
- python编写网络防火墙_firewall防火墙
- Springboot创建webService接口时的cxfconfi文件报错出现DispatcherServletPath不能找到
- Netty学习之读netty权威指南(三)
- iOS 蓝牙扫描枪功能
- Python eval() 函数看这里就够了
- linux查看目录是不是btrfs,Linux之btrfs详解2015082901
- html英文排版怎么对齐方式,HTML排版中文英文标点不对齐
- 华为服务器做系统密码,华为服务器默认密码是多少
热门文章
- ufo帧率测试网站_一加7游戏续航测试 满电开始玩猜猜能玩多久
- linux服务器查配置信息失败,查看Linux服务器的配置信息
- html点击图片弹出大图特效代码,Jquery 点击图片在弹出层显示大图
- 7-34 任务调度的合理性 (25 分)(思路加详解+兄弟们冲呀)
- [设计模式]合成复用原则
- SQL5 将查询后的列重新命名(数据库的几种去重方法)
- 二级c语言作答文件不存在,全国计算机等级考试二级C语言上机考试题库及答案...
- python面向对象语言_Python语言基础之——面向对象编程
- word List18
- Linux下软件安装和卸载