if

<select id="findActiveBlogWithTitleLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null">AND title like #{title}</if>
</select>

如果想可选地通过"title"和"author"两个条件搜索,首先,改变语句的名称让它更具实际意义;然后只要加入另一个条件即可。

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if>
</select>

choose, when, otherwise

MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。提供了"title"就按"title"查找,提供了"author"就按"author"查找,若两者都没有提供,就返回所有符合条件的BLOG

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><when test="author != null and author.name != null">AND author_name like #{author.name}</when><otherwise>AND featured = 1</otherwise></choose>
</select>

 trim, where, set

MyBatis 有一个简单的处理,这在90%的情况下都会有用。

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG <where> <if test="state != null">state = #{state}</if> <if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where>
</select>

where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除。

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。比如,和 where 元素等价的自定义 trim 元素为:

<trim prefix="WHERE" prefixOverrides="AND |OR ">...
</trim>

<select id="selectEmps" resultType="Emp"><!-- SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno -->select * from emp e<!-- <if test="ename != null"> where e.ename like #{ename} </if> --><trim prefix="where" prefixOverrides="and|or"><if test="ename != null">and e.ename like #{ename}</if><if test="sal != null">and e.sal > #{sal}</if><if test="empnoList != null">and e.empno in<foreach collection="empnoList" item="empno" open="(" close=")"separator=", " index="a">#{empno}</foreach></if></trim>
</select>

prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除,并且插入 prefix 属性中指定的内容。

类似的用于动态更新语句的解决方案叫做 set。set 元素可以被用于动态包含需要更新的列,而舍去其他的。

<update id="updateEmp" parameterType="Emp">update emp e <set><if test="ename != null">e.ename=#{ename},</if><if test="job != null">e.job=#{job},</if><if test="mgr != null">e.mgr=#{mgr},</if><if test="hiredate != null">e.hiredate=#{hiredate},</if><if test="sal != null">e.sal=#{sal},</if><if test="comm != null">e.comm=#{comm},</if></set><where>e.empno=#{empno}</where></update>

这里,set 元素会动态前置 SET 关键字,同时也会消除无关的逗号,因为用了条件语句之后很可能就会在生成的赋值语句的后面留下这些逗号。

foreach

动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如:

<select id="selectPostIn" resultType="domain.blog.Post">SELECT *FROM POST PWHERE ID in<foreach item="item" index="index" collection="list"open="(" separator="," close=")">#{item}</foreach>
</select>

foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串以及在迭代中间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。

注意 你可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以"list"作为键,而数组实例的键将是"array"。

<select id="selectEmpsByList" resultType="Emp">select e.*,sq_test.nextval from emp e<trim prefix="where" prefixOverrides="and|or">and e.empno in<foreach collection="list" item="empno" open="(" close=")"separator=", " index="a">#{empno}</foreach></trim>
</select>

转载于:https://www.cnblogs.com/zuo72/p/8408609.html

Mybatis的动态sql语句的查询相关推荐

  1. 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 ...

  2. Mybatis映射文件SQL语句模糊查询,#和$的区别和注意事项

    Mybatis映射文件SQL语句模糊查询 1. "%"#{value}"%" 在参数中不需要添加 %_ 推荐使用 2. '%${value}%' 在参数中不需要 ...

  3. MyBatis中动态sql语句标签详解

    动态 SQL 通常写在mapper包下面的地址映射配置文件(.xml)中.根据条件的不同, SQL 语句也会随之动态的改变. MyBatis 中,提供了一组标签用于实现动态 SQL. 动态SQL语句标 ...

  4. mybatis实现动态sql语句

    [注意点] choose与if区别,只取第一个符合条件password并没有进入sql语句中 //[请注意]增删改必须提交事务................. 在批量更新中需要将deconfig的配 ...

  5. mybatis之动态SQL操作之查询

    1)  查询条件不确定,需要根据情况产生SQL语法,这种情况叫动态SQL /*** 持久层* @author AdminTC*/ public class StudentDao {/*** 动态SQL ...

  6. mybatis的动态sql及模糊查询

    1.动态sql 使用类似于jstl表达式来实现 2.模糊查找 用一个对象来封装条件 步骤: 1)新建一个条件实体 package com.hy.mybatis.entity;public class ...

  7. Mybatis中动态Sql语句的拼接分析

    一.动态查询 1.方式一: <!--if标签--><!--if中的test属性必须录入,其内部为ognl表达式,不需要#{}.如果test内满足,则主体语句执行--><s ...

  8. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

  9. 【转】mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if ...

最新文章

  1. LeetCode简单题之Excel 表中某个范围内的单元格
  2. docker运行gerrit(代码审查工具)
  3. public/private/protected/默认 的各种理论上的区别
  4. 字符串转换成ascii码
  5. 函数传参和实际应用—JS学习笔记2015-6-5(第49天)
  6. mysql innodb引擎--范围查询优化
  7. C++ STL string的输出
  8. 小米9京东预约破百万!明日正式首销:售价2999元起
  9. Pyhton网络爬虫实例_豆瓣电影排行榜_Xpath方法爬取
  10. linux进程挂起的原因6,linux – 如何找出ssh进程挂起的原因?
  11. 旅游信息管理后台(SSM后台管理系统)
  12. mysql创建table
  13. python将时间戳转换成北京时间、标准格式
  14. python提速网站资源_三分钟学会Django缓存,让你的网站提速十倍以上
  15. Python每日一练-----快乐数
  16. 灭火机器人C语言程序,- 一款基于STM32的智能灭火机器人设计
  17. java程序笑脸怎么打_Java程序运行后出现一张笑脸,鼠标点击一次则变成哭脸,再点击一次又变成笑脸,依次轮换。...
  18. PCB线路板塞孔工艺的那些事儿~
  19. 怎么将mov格式的视频转换成MP4?
  20. TensorRT cublasStatus == CUBLAS_STATUS_SUCCESS

热门文章

  1. ThinkPHP6项目基操(11.实战部分 部署后台静态页面模板及后台登录页面)
  2. selenium java封装_selenium2.0的初步封装(java版本)
  3. QML工作笔记-在Row布局中如何进行稍许移动(图片Row布局会遇到)
  4. Spring中使用XML方式导入Spring配置文件,Boot中使用全注解导入Spring配置
  5. Java获取方法信息(某一函数,方法也是一个对象)
  6. Qt文档阅读笔记-QSet官方解析及实例
  7. Qt/C++工作笔记-对vector与QVector中erase操作的进一步认识(区别与联系)
  8. Qt工作笔记-在ListWidget中多线程检索数据
  9. mysql数据库deptno_mysql数据库的 select查询
  10. thread local性能 c++_MySQL 5.7 amp; MySQL 8.0 性能对比