java mybatis 动态_Java-MyBatis:MyBatis 3 动态 SQL
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相关推荐
- java plus方法_Java中MyBatis Plus知识点总结
好程序员Java教程分享MyBatis Plus介绍: 1.MyBatis Plus 介绍 MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不 ...
- java example 去重_Java中mybatis关于example类的使用详解
这几天刚接触example,很多内容都是破碎的,写一篇博文加深理解. 一.什么是example类 mybatis-generator会为每个字段产生如上的Criterion,如果表的字段比较多,产生的 ...
- java时间空值_Java SpringBoot Mybatis 日期类型属性空值保存出现异常
日期字段空导致保存异常 数据库端表结构 可以看到字段 bill_date 是 datetime 日期类型,没有设置为 not null,那么如果前段传递来的对象中该属性为空,应该可以保存. HTTP请 ...
- java封装数组_Java封装数组之动态数组实现方法详解
本文实例讲述了Java封装数组之动态数组实现方法.分享给大家供大家参考,具体如下: 前言:在此之前,我们封装的数组属于静态数组,也即数组空间固定长度,对于固定长度的数组当元素超过容量时会报数组空间不足 ...
- java 反射 动态_java实现反射,动态配置
标签://java 实现反射 //首先定义一个接口Ishow.java public interface Ishow(){ void show(String str); } //建立一个demo.ja ...
- java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署
java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署 java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B ...
- Spring Boot + Mybatis 配合 AOP 和注解实现动态数据源切换配置
Spring Boot + Mybatis 配合 AOP 和注解实现动态数据源切换配置 前言: 1. 数据库准备: 2. 环境准备: 3.代码部分 4. 测试: 5.等等 6.配合注解实现 7 .测试 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. mybatis提供各种标签方法实现动态拼接sql. 1. if&where 1.2 需求 用户信 ...
- Mybatis学习日记(四)——动态SQL第一部分
Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...
- MyBatis研习录(11)——MyBatis动态SQL
C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往--自定义View ...
最新文章
- maya批量命名插件_教你玩转MAYA的四十二精华造诣(第一期)
- 使用 EasyPOI 优雅导出Excel模板数据(含图片)
- Neural Networks神经网络编程入门
- 京东JDHBase异地多活实践
- 上海交通大学计算机专业有调剂吗,上海交通大学2019计算机系考研调剂信息
- 僵尸肖恩黑胶唱片_建立一个非常适合黑胶唱片的DIY放大器套件
- 结合CKFinder,给CKEditor加上上传图片功能
- python笔记03_IO编程
- 【贪心School】机器学习课程笔记
- php读取excel 报错_php读取excel内存溢出
- html设置等宽字体效果
- 深入java虚拟机(圣思园)
- 三极管实现与门、或门和非门操作
- android egl10和egl14
- 气传导耳机排名,值得入手的气传导耳机推荐
- java的向下转型_Java 向上/向下转型浅析
- 嵌入式开发练习(十五)PWM、DAC的使用
- php 图片合成gif,php将多张jpg图片生成gif动态图片的代码
- 系统错误——Required request body is missing:
- 如何修改桌面的存放路径??(将桌面放到D盘或E盘)