trim, where, set

前面几个例子已经合宜地解决了一个臭名昭著的动态 SQL 问题。现在回到“if”示例,这次我们将“ACTIVE = 1”也设置成动态的条件,看看会发生什么。

SELECT * FROM BLOG

WHERE

state = #{state}

AND title like #{title}

AND author_name like #{author.name}

如果这些条件没有一个能匹配上会发生什么?最终这条 SQL 会变成这样:

SELECT *FROM BLOG

WHERE

这会导致查询失败。如果仅仅第二个条件匹配又会怎样?这条 SQL 最终会是这样:

SELECT *FROM BLOG

WHERE

AND title like ‘someTitle’

这个查询也会失败。这个问题不能简单地用条件句式来解决,如果你也曾经被迫这样写过,那么你很可能从此以后都不会再写出这种语句了。

MyBatis 有一个简单的处理,这在 90% 的情况下都会有用。而在不能使用的地方,你可以自定义处理方式来令其正常工作。一处简单的修改就能达到目的:

SELECT * FROM BLOG

state = #{state}

AND title like #{title}

AND author_name like #{author.name}

where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。

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

...

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

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

update Author

username=#{username},password=#{password},email=#{email},bio=#{bio}where id=#{id}

这里,set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号,因为用了条件语句之后很可能就会在生成的 SQL 语句的后面留下这些逗号。(译者注:因为用的是“if”元素,若最后一个“if”没有匹配上而前面的匹配上,SQL 语句的最后就会有一个逗号遗留)

若你对 set 元素等价的自定义 trim 元素的代码感兴趣,那这就是它的真面目:

...

注意这里我们删去的是后缀值,同时添加了前缀值。

java mybatis 动态_Java-MyBatis:MyBatis 3 动态 SQL相关推荐

  1. java plus方法_Java中MyBatis Plus知识点总结

    好程序员Java教程分享MyBatis Plus介绍: 1.MyBatis Plus 介绍 MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不 ...

  2. java example 去重_Java中mybatis关于example类的使用详解

    这几天刚接触example,很多内容都是破碎的,写一篇博文加深理解. 一.什么是example类 mybatis-generator会为每个字段产生如上的Criterion,如果表的字段比较多,产生的 ...

  3. java时间空值_Java SpringBoot Mybatis 日期类型属性空值保存出现异常

    日期字段空导致保存异常 数据库端表结构 可以看到字段 bill_date 是 datetime 日期类型,没有设置为 not null,那么如果前段传递来的对象中该属性为空,应该可以保存. HTTP请 ...

  4. java封装数组_Java封装数组之动态数组实现方法详解

    本文实例讲述了Java封装数组之动态数组实现方法.分享给大家供大家参考,具体如下: 前言:在此之前,我们封装的数组属于静态数组,也即数组空间固定长度,对于固定长度的数组当元素超过容量时会报数组空间不足 ...

  5. java 反射 动态_java实现反射,动态配置

    标签://java 实现反射 //首先定义一个接口Ishow.java public interface Ishow(){ void show(String str); } //建立一个demo.ja ...

  6. java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署

    java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署 java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B ...

  7. Spring Boot + Mybatis 配合 AOP 和注解实现动态数据源切换配置

    Spring Boot + Mybatis 配合 AOP 和注解实现动态数据源切换配置 前言: 1. 数据库准备: 2. 环境准备: 3.代码部分 4. 测试: 5.等等 6.配合注解实现 7 .测试 ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql

    mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. mybatis提供各种标签方法实现动态拼接sql. 1. if&where 1.2 需求 用户信 ...

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

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

  10. MyBatis研习录(11)——MyBatis动态SQL

    C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往--自定义View ...

最新文章

  1. maya批量命名插件_教你玩转MAYA的四十二精华造诣(第一期)
  2. 使用 EasyPOI 优雅导出Excel模板数据(含图片)
  3. Neural Networks神经网络编程入门
  4. 京东JDHBase异地多活实践
  5. 上海交通大学计算机专业有调剂吗,上海交通大学2019计算机系考研调剂信息
  6. 僵尸肖恩黑胶唱片_建立一个非常适合黑胶唱片的DIY放大器套件
  7. 结合CKFinder,给CKEditor加上上传图片功能
  8. python笔记03_IO编程
  9. 【贪心School】机器学习课程笔记
  10. php读取excel 报错_php读取excel内存溢出
  11. html设置等宽字体效果
  12. 深入java虚拟机(圣思园)
  13. 三极管实现与门、或门和非门操作
  14. android egl10和egl14
  15. 气传导耳机排名,值得入手的气传导耳机推荐
  16. java的向下转型_Java 向上/向下转型浅析
  17. 嵌入式开发练习(十五)PWM、DAC的使用
  18. php 图片合成gif,php将多张jpg图片生成gif动态图片的代码
  19. 系统错误——Required request body is missing:
  20. 如何修改桌面的存放路径??(将桌面放到D盘或E盘)

热门文章

  1. Tcpdump的用法及使用案例
  2. Android之Camera拍照
  3. ffmpeg(5):SDL相关学习
  4. ffmpeg之PCM转AAC
  5. Tensorflow2.0:使用Keras自定义网络实战
  6. 主板插槽接口相关释义
  7. 解决WordPress无法发送电子邮件
  8. 流程图的虚线是什么意思_这些新标识啥意思?交警教你怎么走
  9. 4 安卓安装路径_安卓逆向——APK安装流程
  10. 服务器做raid bios界面做raid配置