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相关推荐

  1. 《MyBatis技术原理与实战》之SqlSession的用途

    1.Mybatis中SqlSession主要有两种用途: 获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果 直接通过命名信息去执行SQL返回结果,这是IBatis ...

  2. Mybatis学习日记(四)——动态SQL第一部分

    Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...

  3. mybatis if test 用法_SpringBoot整合Mybatis-Plus 实战之动态SQL,Mybatis拿得出手的功能之一...

    MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础! 面试常问问题 : Mybatis 中$与#的区别? 是将传入的值当做字符串的形式, ...

  4. Mybatis最拿得出手的功能之一 SpringBoot整合Mybatis-Plus 实战之动态SQL

    MyBatis的动态SQL是最令人喜欢的功能 在了解 动态SQL之前,你首先得知道一个表达式 OGNL,这个是基础! 面试常问问题 : Mybatis 中$与#的区别? #是将传入的值当做字符串的形式 ...

  5. 【Mybatis 之应用篇】 4_动态SQL、缓存

    文章目录 Mybatis 十二.动态SQL 1.IF 2.choose(when,otherwise) 3.where,set 4.SQL片段 5.Foreach 十三.缓存 (了解) 1.简介 2. ...

  6. mybatis的注解开发之三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  7. MyBatis学习笔记(六)动态sql

    在一些情况下,如查询参数不确定时,需要用到动态sql 例子,根据动态输入的查询条件查询student. 一.if语句 1.StudentTMapper [html] view plain copy p ...

  8. 【MyBatis】学习纪要六:动态SQL

    2019独角兽企业重金招聘Python工程师标准>>> 引言 动态SQL:Dynamic SQL. 本节我们来通过 MyBatis 的官方文档进行学习. Description(描述 ...

  9. mybatis入门(四)之动态SQL

    转载自  mybatis 动态SQL 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦. ...

最新文章

  1. 2.7、Android Studio使用翻译编辑器本地化UI
  2. canvas 中的元素拖拽
  3. Java基础02 方法与数据成员
  4. python怎么安装tensorflow-Python使用pip安装TensorFlow模块
  5. win7rc 序列号- 10/21之前
  6. Calendar、Date、long类型的时间,三者之间如何转化
  7. python 类和对象 有必要学吗_类与对象-python学习19
  8. Find the Difference(leetcode389)
  9. print的小白用法
  10. 信息学奥赛一本通(1221:分成互质组)
  11. requestmapping里面的参数_golang web开发——参数绑定(上)之用Go实现简单的Trie
  12. c语言 时间函数,C/C+时间相关的函数
  13. 商品包含资源和劳动两部分内容
  14. 三个月的试用期终于结束了
  15. MATLAB算术均值滤波器
  16. 计算机查用户名,怎样查自己电脑用户名_查自己电脑用户名命令
  17. 出场顺序很重要下一句_年少有为一夜刷爆朋友圈:人生的出场顺序真的很重要...
  18. 自然语言处理从零到入门 自然语言理解NLU
  19. 【人工智能 Open AI】解释一下 Raft 分布式一致性协议算法,并用伪代码实例说明。
  20. Java实现XLS和XLSX之间的相互转换

热门文章

  1. C/C++ 宏定义中#、##、#@的区别
  2. Python之pandas,series,可视化
  3. 手机突然电量消耗很快_手机突然出现这些故障!我来教你快速解决!
  4. python 语言教程(4)元组
  5. 跨链(5)“蚂蚁区块链”之跨链系统框架
  6. 区块链系统之《基于区块链的PKI数字证书系统》
  7. BUUCTF firmware
  8. 最长递增子序列 最长连续递增序列
  9. 一和零(二维01背包)
  10. MMU关闭时Cache的缓存策略是怎样的