贵阳市网站建设,找人搭建网站多少钱,精品课程网站建设方案,宁波网站建设电话咨询之前的例子都巧妙地避开了一个臭名昭著的动态SQL挑战。考虑一下如果我们回到之前的“if”例子#xff0c;但这次我们将“ACTIVE 1”也作为一个动态条件。
select idfindActiveBlogLikeresultTypeBlogSELECT * FROM BLOGWHEREif test但这次我们将“ACTIVE 1”也作为一个动态条件。
select idfindActiveBlogLikeresultTypeBlogSELECT * FROM BLOGWHEREif teststate ! nullstate #{state}/ifif testtitle ! nullAND title like #{title}/ifif testauthor ! null and author.name ! nullAND author_name like #{author.name}/if
/select
如果没有满足任何条件会发生什么你最终会得到类似于下面的SQL语句
SELECT * FROM BLOG
WHERE
如果只有第二个条件满足最终的SQL语句将如下所示
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
这也会失败。这个问题不容易通过条件语句解决如果你曾经不得不写过它那么你很可能再也不想这样做了。
MyBatis 在大多数情况下有一个简单的答案可能在 90% 的情况下都能起作用。而在它无法满足要求的情况下你可以自定义它来达到目的。只需要一个简单的改变一切都会正常工作
select idfindActiveBlogLikeresultTypeBlogSELECT * FROM BLOGwhereif teststate ! nullstate #{state}/ifif testtitle ! nullAND title like #{title}/ifif testauthor ! null and author.name ! nullAND author_name like #{author.name}/if/where
/select
如果 where元素中的嵌套标签返回任何内容它会知道只在查询条件非空时插入 WHERE 关键字。此外如果条件的内容以 AND 或 OR 开头它会自动去掉这些关键字。
如果where元素的行为不符合您的要求您可以通过定义自己的trim元素来进行自定义。例如与where元素相对应的trim元素可以是
trim prefixWHERE prefixOverridesAND |OR ...
/trim
trim元素的 prefixOverrides属性接受一个使用管道符分隔的文本列表其中空格是有关的。结果是删除 prefixOverrides属性中指定的内容并插入 prefix属性中指定的内容。
对于动态更新语句也有一个类似的解决方案称为set元素。set元素可以用于动态包含要更新的列以及排除其他列。例如
update idupdateAuthorIfNecessaryupdate Authorsetif testusername ! nullusername#{username},/ifif testpassword ! nullpassword#{password},/ifif testemail ! nullemail#{email},/ifif testbio ! nullbio#{bio}/if/setwhere id#{id}
/update
在这个例子中set元素将动态添加 SET 关键字并且在应用条件后消除任何多余的逗号。
另外您也可以通过使用trim元素来实现相同的效果
trim prefixSET suffixOverrides,...
/trim
请注意在这种情况下我们覆盖的是后缀而仍然附加前缀。