2019独角兽企业重金招聘Python工程师标准>>>

MyBatis 提供使用 ognl 表达式动态生成 SQL的功能。

1. if

2. where

where 可以自动处理掉第一个拼接条件里的 and

<!-- 动态 sql 查询用户信息 --><select id="findUserByDynamicSql" parameterType="user" resultType="user">select * from users<!-- where 可以自动处理第一个 and --><where><!-- 注意:要做不为null 和 '' 校验 --><if test="userId != null and userId != ''">and users.userId = #{userId}</if><if test="username != null and username != ''">and users.username like '%${username}%'</if></where></select>

3. foreach

foreach 可以向 SQL 传递数组、List<E> 等,下面介绍一个数组的例子

<!-- 动态 sql 查询用户信息 --><select id="findUserByDynamicSql" parameterType="user" resultType="user">select * from users<!-- where 可以自动处理第一个 and --><where><!-- 解析传递过来的多个 userId --><!-- ids 是结合;item 是集合中的项目变量 --><foreach collection="ids" item="id" open="userId in(" close=")" separator=",">#{id}</foreach><!-- 注意:要做不为null 和 '' 校验 --><if test="userId != null and userId != ''">and users.userId = #{userId}</if><if test="username != null and username != ''">and users.username like '%${username}%'</if></where></select>

运行结果:

如果上面传递的数组中是 pojo 对象,那么collection 属性名称必须是 array(如果是传递 List 对象,

那么collection属性名称是 list),而传递到 sql 当中的参数则是

pojo.属性名。如下:

index:为数组的下标, item:数组中每个元素的名称,随便定义

open:循环开始, close:循环结束         separator:中间分隔输出

<select id="selectUserByArray" parameterType="Object[]" resultType="user">select * from user <where> <!-- 传递数组 --><if test="array!=null"><foreach collection="array" index="index" item="item" open="and id in(" separator="," close=")" >#{item.id} </foreach></if></where>
</select>

4. SQL 片段

按照上面的 动态SQL 写法,可能会产生很多重复的 sql。为了重用这些 sql 减少代码,可以将重复的 sql

提取出来,使用时通过 include 引用。

a. 定义 SQL 片段,将 重复的 sql 抽取出来

<!-- 定义SQL 片段 --><sql id="query_user_ByUserName"><if test="username != null and username != ''">and users.username like '%${username}%'</if></sql><sql id="query_user_ByUserId"><!-- 注意:要做不为null 和 '' 校验 --><if test="userId != null and userId != ''">and users.userId = #{userId}</if></sql><sql id="query_user_ByIdArray"><!-- 解析传递过来的多个 userId --><!-- ids 是结合;item 是集合中的项目变量 --><foreach collection="ids" item="id" open="userId in(" close=")" separator=",">#{id}</foreach></sql>

b. 在 SQL 中引用 sql 片段,可以对比上面所举得例子中的代码

<!-- 动态 sql 查询用户信息 --><select id="findUserByDynamicSql" parameterType="user" resultType="user">select * from users<!-- where 可以自动处理第一个 and --><where><include refid="query_user_ByIdArray"></include><include refid="query_user_ByUserId"></include><include refid="query_user_ByUserName"></include></where></select>

转载于:https://my.oschina.net/u/1757476/blog/507994

MyBatis 之 动态SQL相关推荐

  1. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有:   if choose(when,otherwis ...

  2. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  3. MyBatis中动态sql实现时间范围比较的查询

    场景 前端传递两个时间参数,开始时间和结束时间,然后从数据库中筛选出某个时间属性在此范围的数据. Mybatis的动态sql的写法. 注: 博客: https://blog.csdn.net/bada ...

  4. MyBatis中动态sql的模糊搜索、foreach实现In集合的用法

    场景 在使用MyBatis的动态sql时,常见的是传递一个ID的数组,查询记录的 ID在这个数组中的记录和模糊搜索这两种场景. 注: 博客: https://blog.csdn.net/badao_l ...

  5. mybatis的动态sql的一些记录

    动态sql的作用:传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if ...

  6. MyBatis(三)——动态SQL

    文章目录 1. 简介 2. 搭建环境 2.1 在MySQL中创建blog表 2.2 编写实体类 2.3 编写实体类对应Mapper接口 2.4 编写Mapper接口对应的Mapper.xml文件 2. ...

  7. 9、mybatis中动态sql的使用

    对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来.首先大家需要了解mybatis是什么.用mybatis来做什么.为什么要用mybatis.有什么优缺点:当知道了为什么的时候 ...

  8. 利用MyBatis的动态SQL特性抽象统一SQL查询接口

    1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...

  9. java day55【 Mybatis 连接池与事务深入 、 Mybatis 的动态 SQL 语句、 Mybatis 多表查询之一对多 、 Mybatis 多表查询之多对多】...

    第1章 Mybatis 连接池与事务深入 1.1 Mybatis 的连接池技术 1.1.1 Mybatis 连接池的分类 1.1.2 Mybatis 中数据源的配置 1.1.3 Mybatis 中 D ...

  10. 2022/5/1 Mybatis框架动态SQL

    目录 1丶动态 SQL 2丶if标签 3丶choose.when.otherwise 4丶trim.where.set 5丶foreach 6丶script 7丶bind 8丶多数据库支持 9丶动态 ...

最新文章

  1. Cell Press | 研究人员致力于创建COVID-19病毒表位图
  2. 厦大计算机研究生和福大,考研:只知道厦门大学?福建还有这些211值得你了解...
  3. SAP CRM Fiori My note应用 add to -append Frontend implementation
  4. java 日期操作工具类_java8操作日期的工具类
  5. java日志与业务分离_java日志分开打印
  6. 二叉搜索树的删除_LeetCode109.有序链表转换二叉搜索树
  7. singleton pattern的推荐实现
  8. 忍者X2简介+安装包+安装环境说明 [复制链接]
  9. 南加大计算机硕士学制,2020年南加州大学硕士读几年
  10. 如何使用以太网将 Mac 接入互联网?
  11. Android app 开发环境搭建
  12. 台式计算机装机软件选择,装机软件哪个好?小编教你最好的装机软件推荐
  13. FPGA实现千兆以太网发送
  14. 微信小程序tab切换,(scroll-view + swiper)可滑动切换,导航栏跟随滚动实现
  15. CPT203-Software Engineering
  16. Android 永久保存数据
  17. 个人项目-数独(Python实现)——从解数独到写游戏
  18. JS - 解决鼠标单击、双击事件冲突问题(同时实现两种事件响应)
  19. 腾讯云COS全球加速让全球用户加速访问
  20. static修饰的特点

热门文章

  1. 杭电多校第六场-J-Ridiculous Netizens
  2. .net平台下C#socket通信(中)
  3. vue 使用element 菜单与tab页联动
  4. s := time.Now().Format(20060102) go格式化
  5. Android 自定义View 三板斧之二——组合现有控件
  6. 清楚xcode缓存(老是忘记所有记下来方便以后查阅)
  7. ActionScript工程如何使用Flash CS的fl包中的UI组件(转)
  8. 十一课堂|通过小游戏学习Ethereum DApps编程(4)
  9. 中国人工智能学会通讯——搜狗搜索:从搜索到问答 1.1 引言
  10. 数据库中间件 MyCAT源码分析:【单库单表】插入【推荐阅读】