博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis自动去除多余的逗号,AND , OR
阅读量:5955 次
发布时间:2019-06-19

本文共 1618 字,大约阅读时间需要 5 分钟。

hot3.png

trim, where, set

如果这些条件没有一个能匹配上将会怎样?最终这条 SQL 会变成这样:

SELECT * FROM BLOGWHERE

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

SELECT * FROM BLOGWHERE AND title like ‘someTitle’

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

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

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

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

...

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

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

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

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

若你对等价的自定义 trim 元素的样子感兴趣,那这就应该是它的真面目:

...

 

转载于:https://my.oschina.net/zhongwenhao/blog/3060298

你可能感兴趣的文章
python--class test
查看>>
从零开始理解JAVA事件处理机制(3)
查看>>
HttpURLConnection类的使用
查看>>
linux命令分析---SED (二)
查看>>
MyCat | 分库分表实践
查看>>
黄聪:is_file和file_exists效率比较
查看>>
Linux进程间通信——信号
查看>>
C# 3.0新语言特性和改进(一)
查看>>
MS Sql Server 数据库或表修复(DBCC CHECKDB)
查看>>
用友u8数据库表结构
查看>>
Amazon验证码机器算法识别
查看>>
Java中的抽象函数与C++中的虚函数
查看>>
docker安装执行问题
查看>>
用*号打印直角三角形(正反)
查看>>
Shell case
查看>>
20161120-安全测试
查看>>
[INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
查看>>
python学习笔记(十一):网络编程
查看>>
关于Vue.js的v-for,key的顺序改变,影响过渡动画表现
查看>>
面向对象
查看>>