《MyBatis技术原理与实战》之动态SQL
Mybatis有两种方式配置SQL
方式一:使用XML文件配置
方式二:在注解中配置SQL
通常,使用第一种方式,这里也只阐述第一种方式中SQL的用法
Mybatis动态的SQL常用的几个元素
元素 | 作用 | 备注 |
---|---|---|
if | 判断语句 | 单条件分之判断 |
choose(when、otherwise) | 相当于java中的case when语句 | 多条件分之判断 |
trim(where、set) | 辅助元素 | 用于处理一些SQL拼装问题 |
foreach | 循环语句 | 在in语句等列举条件常用 |
动态SQL用法
(1)if元素
if相当于java中的if判断语句,常常与test属性联合使用。实例如下:
查询要求:根据角色名称模糊查询角色,但是角色名称可填可不填。
<select id="findRoles" parameterType="string" resultMap="roleResultMap">select role_no,role_name,note from t_role where 1=1<if test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName},'%')</if>
</select>
备注:roleName是传进的参数,参数名称必须要对应。
(2)choose、when、otherwise元素
这三个元素是多条件判断语句,相当于java中的switch…case…default语句。
查询要求:
- 当角色编号不为空,则根据角色编号查询
- 当角色编号为空,而角色名称不为空,则根据角色名称模糊查询
- 当角色编号和角色名称均为空,则要求角色备注不为空
<select id="findRoles" parameterType="role" resultMap="roleResultMap">select role_no,role_name,note from t_role where 1=1<choose><when test="roleNo != null and roleNo != ''">and role_no = #{roleNo}</when><when test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName},'%')</when><otherwise>and note is not null</otherwise></choose>
</select>
(3)trim、where、set元素
细心的读者可以发现上面的查询加入了一个条件”1=1“。若没有这个条件,可能会出问题。
如果我们使用<where>
就可以轻松解决这个问题了,当where中元素条件成立时,会给SQL语句自动加上where关键字,否则不加入。
<select id="findRoles" parameterType="string" resultMap="roleResultMap">select role_no,role_name,note from t_role <where><if test="roleName != null and roleName != ''">role_name like concat('%',#{roleName},'%')</if></where></select>
当然,方式不止一种,除了使用where标签外,还可以使用trim进行处理。
<select id="findRoles" parameterType="string" resultMap="roleResultMap">select role_no,role_name,note from t_role <trim prefix="where" prefixOverrides="and"><if test="roleName != null and roleName != ''">and role_name like concat('%',#{roleName},'%')</if></trim>
</select>
备注:prefix代表语句的前缀,当trim中元素条件成立时,会加上where关键zi
prefixOverrides代表是需要去掉的没用字样,比如这里的and。当当条件成立时,不去掉and,语句后半部分后变成where and and role_name like concat(‘%’,#{roleName},’%’),此时多个一个and。
set标签一般用户更新数据时使用。
<update id="updateRole" parameterType="role">update t_role<set><if test="roleName != null and roleName != ''">role_name = #{roleName},</if><if test="note != null and note != ''">note = #{note},</if></set>where role_no = #{roleNo}
</update>
备注:set元素遇到逗号,会把对应的逗号去掉。
该语句也可以使用trim进行处理
<trim prefix="set" suffixOverrides=",">...</trim>
备注:suffixOverrides与prefixOverrides类似,前者是表示后缀,后者表示前缀。
1.where作用
a.当where标签内有条件成立时,添加where关键字,反之,不加where关键字
b.当where内条件成立时,添加的条件最前面有多余的and,or等关键字时,会自动去除2.set作用
a.添加set关键字
b.去除结尾多余的逗号
(4) foreach元素
该元素的作用是遍历集合。Mybatis可以很好的支持数组和List、Set接口的集合。
查询要求:根据性别查询,性别参数是个集合,是由男、女、未知三种组成。
<select id="findUserBySex" resultType="user">select * from t_user where sex in<foreach item="sex" index="index" collection="sexList" open="(" separator="," close=")">#{sex}</foreach>
</select>
备注:
- collection配置的sexList是传递进的参数名称,他可以是数组或者List,Set等集合
- item配置的是循环中当前的元素
- index配置的是当前元素在集合中的位置下标
- open和close配置的是以什么符号将这些集合元素包装起来。
- separator是各个元素之间的间隔符。
注意:sql查询中in一般会消耗大量的性能,同时一些数据库对于sql的长度也有限制。
《MyBatis技术原理与实战》之动态SQL相关推荐
- 《MyBatis技术原理与实战》之SqlSession的用途
1.Mybatis中SqlSession主要有两种用途: 获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果 直接通过命名信息去执行SQL返回结果,这是IBatis ...
- Mybatis学习日记(四)——动态SQL第一部分
Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...
- mybatis if test 用法_SpringBoot整合Mybatis-Plus 实战之动态SQL,Mybatis拿得出手的功能之一...
MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础! 面试常问问题 : Mybatis 中$与#的区别? 是将传入的值当做字符串的形式, ...
- Mybatis最拿得出手的功能之一 SpringBoot整合Mybatis-Plus 实战之动态SQL
MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础! 面试常问问题 : Mybatis 中$与#的区别? #是将传入的值当做字符串的形式 ...
- 【Mybatis 之应用篇】 4_动态SQL、缓存
文章目录 Mybatis 十二.动态SQL 1.IF 2.choose(when,otherwise) 3.where,set 4.SQL片段 5.Foreach 十三.缓存 (了解) 1.简介 2. ...
- mybatis的注解开发之三种动态sql
脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...
- MyBatis学习笔记(六)动态sql
在一些情况下,如查询参数不确定时,需要用到动态sql 例子,根据动态输入的查询条件查询student. 一.if语句 1.StudentTMapper [html] view plain copy p ...
- 【MyBatis】学习纪要六:动态SQL
2019独角兽企业重金招聘Python工程师标准>>> 引言 动态SQL:Dynamic SQL. 本节我们来通过 MyBatis 的官方文档进行学习. Description(描述 ...
- mybatis入门(四)之动态SQL
转载自 mybatis 动态SQL 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦. ...
最新文章
- 2.7、Android Studio使用翻译编辑器本地化UI
- canvas 中的元素拖拽
- Java基础02 方法与数据成员
- python怎么安装tensorflow-Python使用pip安装TensorFlow模块
- win7rc 序列号- 10/21之前
- Calendar、Date、long类型的时间,三者之间如何转化
- python 类和对象 有必要学吗_类与对象-python学习19
- Find the Difference(leetcode389)
- print的小白用法
- 信息学奥赛一本通(1221:分成互质组)
- requestmapping里面的参数_golang web开发——参数绑定(上)之用Go实现简单的Trie
- c语言 时间函数,C/C+时间相关的函数
- 商品包含资源和劳动两部分内容
- 三个月的试用期终于结束了
- MATLAB算术均值滤波器
- 计算机查用户名,怎样查自己电脑用户名_查自己电脑用户名命令
- 出场顺序很重要下一句_年少有为一夜刷爆朋友圈:人生的出场顺序真的很重要...
- 自然语言处理从零到入门 自然语言理解NLU
- 【人工智能 Open AI】解释一下 Raft 分布式一致性协议算法,并用伪代码实例说明。
- Java实现XLS和XLSX之间的相互转换