热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(十三)Mybatis动态SQL标签使用

注:代码已托管在GitHub上,地址是:https:github.comDamaerMybatis-Learning,项目是

注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-09-DynamicSQL,需要自取,需要配置maven环境以及mysql环境(sql语句在resource下的test.sql中),觉得有用可以点个小星星,小菜鸟在此Thanks~

mybatis有一个强大的特性,其他框架在拼接sql的时候要特别谨慎,比如哪里需要空格,还要注意去掉列表最后一个列名的逗号,mybtis的动态sql可以帮助我们逃离这样的痛苦挣扎,那就是动态SQL.它还可以处理一种情况,当你不确定你的参数不知道是不是为空的时候,我们不需要在业务逻辑中判断,直接在sql中处理,代码无比简洁。主要的动态sql标签如下:

  • (trim,set)
  • (when, otherwise)

注意事项:
在mapper中如果出现大于号&#xff08;>&#xff09;,小于号&#xff08;&#xff09;&#xff0c;大于等于号&#xff08;&#xff09;&#xff0c;小于等于号&#xff08;&#xff09;等,最好需要转换成为实体符号&#xff0c;这是因为mapper是XML文件&#xff0c;xml文件本身就含有较多的<>这样的尖括号&#xff0c;所以解析的时候可能会解析出错。

原符号<<&#61;>>&#61;&"
替换符号<<&#61;>>&#61;&'"

我们经常需要根据where后面的条件筛选出需要的数据&#xff0c;当多个条件拼接的时候&#xff0c;我们一般使用&#xff0c;如果if里面的条件成立&#xff0c;那么就会使用标签的语句&#xff0c;但是我们可以知道where句子第一个标签是没有and的&#xff0c;而后面的条件都需要and&#xff0c;所以有一种做法是第一个使用where 1 &#61; 1&#xff0c;这个条件恒成立&#xff0c;后面的所有子语句都加上and&#xff0c;如果增加判断&#xff0c;那么我们只需要加标签就可以了。

<!-- 动态sql if标签--><!-- &可以使用and来代替 &#xff0c;注意&#xff01;&#61;需要连在一起写--><select id&#61;"selectStudentByDynamicSQL" resultType&#61;"Student"><!--最常用的&#xff08;动态参数&#xff09; select id,name,age,score from student where name like &#39;%&#39; #{name} &#39;%&#39; --><!-- 下面的是字符串拼接 &#xff0c;只能写value&#xff0c;了解即可&#xff0c;容易sql注入&#xff0c;执行效率低&#xff0c;不建议使用-->select id,name,age,scorefrom studentwhere 1&#61;1<if test&#61;"name !&#61; null and name !&#61; &#39;&#39;">and name like &#39;%&#39; #{name} &#39;%&#39;</if><if test&#61;"age > 0">and age > #{age}</if></select>

当有两个查询条件的时候&#xff0c;sql语句是&#xff1a;select * from student where 1&#61;1 and name like ‘%’ ? ‘%’ and age > ?

当有一个查询条件的时候&#xff1a;sql语句就变成&#xff1a;select * from student where 1&#61;1 and name like ‘%’ ? ‘%’

当没有查询条件的时候&#xff0c;sql语句是&#xff1a;
select * from student where 1&#61;1

标签需要手动在where后面添加1&#61;1语句&#xff0c;这是因为如果后面的条件都是false的时候&#xff0c;where后面如果没有1&#61;1语句&#xff0c;sql就剩下一个空空的where,sql就会报错。所以在where后面需要加上永真句子1&#61;1&#xff0c;但是这样有一个问题&#xff0c;当数据量比较大的时候&#xff0c;会严重影响sql的查询效率。

,,

使用标签&#xff0c;在有查询语句的时候&#xff0c;自动补上where子句&#xff0c;在没有查询条件的时候&#xff0c;不会加上where子句&#xff0c;这也就解决了我们上面所涉及到的问题&#xff0c;剩下的就是标签的and子句&#xff0c;第一个&#xff0c;片段里面可以不包含and&#xff0c;也可以包含&#xff0c;系统会自动去掉and&#xff0c;但是其他的片段里面的and&#xff0c;必须写上&#xff0c;否则会出错。下面的写法中&#xff0c;如果name为null&#xff0c;第二个if标签中的if也会被去掉&#xff0c;不会报错。

<select id&#61;"selectStudentByDynamicSQLWhere" resultType&#61;"Student"><!--最常用的&#xff08;动态参数&#xff09; select id,name,age,score from student where name like &#39;%&#39; #{name} &#39;%&#39; --><!-- 下面的是字符串拼接 &#xff0c;只能写value&#xff0c;了解即可&#xff0c;容易sql注入&#xff0c;执行效率低&#xff0c;不建议使用-->select id,name,age,scorefrom student<where><if test&#61;"name !&#61; null and name !&#61; &#39;&#39;">and name like &#39;%&#39; #{name} &#39;%&#39;</if><if test&#61;"age > 0">and age > #{age}</if></where></select>

如果where里面是不规范的&#xff0c;那我们可以通过来自定义where元素的功能,标签主要有以下属性&#xff1a;

  • prefix:在包含的内容前加上前缀&#xff0c;不是百分之百会加&#xff0c;会根据需要自动加
  • suffix&#xff1a;在包含的内容后面加上后缀&#xff0c;不是百分之百会加&#xff0c;会根据需要自动加
  • prefixOverrides&#xff1a;可以把包含内容的首部某些内容忽略&#xff08;不能自己增加&#xff09;&#xff0c;不一定会忽略&#xff0c;根据需要自动忽略
  • suffixOverrides&#xff1a;也可以把包含内容的尾部的某些内容忽略&#xff08;不能自己增加&#xff09;&#xff0c;同上

下面这样的是错误的&#xff0c;当传入的name不为空&#xff0c;而且age大于0的时候

<select id&#61;"selectStudentByDynamicSQLWhere" resultType&#61;"Student">select id,name,age,scorefrom student<trim prefix&#61;"where" prefixOverrides&#61;"and"><if test&#61;"name !&#61; null and name !&#61; &#39;&#39;">name like &#39;%&#39; #{name} &#39;%&#39;</if><if test&#61;"age > 0">age > #{age}</if></trim></select>

不会自己增加and在第二个age前面&#xff1a;



下面的是正确的,我们在两个标签前面都增加了and&#xff0c;第二个and会自动去掉&#xff1a;


下面是后缀模式,prefix&#61;"set"表示在整个语句前面加上前缀set&#xff0c;suffixoverride&#61;","表示每一个语句后面的后缀","可以被忽略&#xff0c;如果是需要的话suffix&#61;" where id &#61; #{id}表示在整个语句后面增加where id &#61; #{id},&#xff1a;

update user
0"> name&#61;#{name} , age&#61;#{age} ,

当然&#xff0c;我们对上面的语句还有动态解决的方案,那就是标签&#xff1a;

update student name&#61;#{name},age&#61;#{age}, score&#61;#{score},where id&#61;#{id}

, ,

有时候&#xff0c;我们只想去匹配第一个条件&#xff0c;或者第一个条件不匹配的时候才会去匹配第二个条件&#xff0c;不像标签里面的一样会去判断所有的子语句是否可以匹配&#xff0c;而是遇到一个匹配的就会执行跳出


标签就像是switch语句&#xff0c;每一个都像是case,后面默认跟上break语句&#xff0c;只要满足一个就不会判断后面的子语句了&#xff0c;当前面所有的都不执行的时候&#xff0c;就会执行标签的内容&#xff0c;这个内容也就像是switch语句里面的default。

foreach

动态SQL要有一个比较多的操作是对一个集合进行遍历&#xff0c;通常是在构建IN条件语句的时候。需要注意的点&#xff1a;

  • collection 表示需要遍历的集合类型&#xff0c;array表示需要遍历的数组
  • open&#xff0c;close&#xff0c;separator是对遍历内容的SQL拼接
  • foreach 元素的功能非常强大&#xff0c;它允许你指定一个集合&#xff0c;声明可以在元素体内使用的集合项&#xff08;item&#xff09;和索引&#xff08;index&#xff09;变量。它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符。
  • 你可以将任何可迭代对象&#xff08;如 List、Set 等&#xff09;、Map 对象或者数组对象传递给 foreach 作为集合参数。当使用可迭代对象或者数组时&#xff0c;index 是当前迭代的次数&#xff0c;item 的值是本次迭代获取的元素。当使用 Map 对象&#xff08;或者 Map.Entry 对象的集合&#xff09;时&#xff0c;index 是键&#xff0c;item 是值。

1.比如我们需要查找学生的id为1&#xff0c;2&#xff0c;3的学生信息&#xff0c;我们不希望分开一次査一个&#xff0c;而是希望将数组id一次传进去&#xff0c;查出来一个学生的集合。

sql接口可以这样写,传入一个对象的数组&#xff1a;

public ListselectStudentByDynamicSQLForeachArray(Object[]studentIds);

sql语句如下,遍历array数组的时候&#xff0c;指定左边符号是左括号&#xff0c;右边是右括号&#xff0c;元素以逗号分隔开&#xff1a;


2.当遍历的是一个类型为int的list列表时&#xff1a;

public ListselectStudentByDynamicSQLForeachList(ListstudentIds);

sql语句如下,colleaction指定为list&#xff1a;


3.当遍历的是一个类型为对象的list&#xff1a;

public ListselectStudentByDynamicSQLForeachListStudent(Liststudents);

sql语句里面与上面相似&#xff0c;只是在使用属性的时候不太一样&#xff1a;



用于定义sql片段&#xff0c;方便在其他SQL标签里面复用&#xff0c;在其他地方复用的时候需要使用子标签&#xff0c;可以定义sql的任何部分&#xff0c;所以标签可以放在动态SQL的任何位置。

select id,name,age,scorefrom student

动态sql让SQL写起来更加简洁&#xff0c;减少了很多重复代码&#xff0c;动态sql之间可以相互拼接&#xff0c;只要符合sql语句规范即可。

此文章仅代表自己&#xff08;本菜鸟&#xff09;学习积累记录&#xff0c;或者学习笔记&#xff0c;如有侵权&#xff0c;请联系作者删除。人无完人&#xff0c;文章也一样&#xff0c;文笔稚嫩&#xff0c;在下不才&#xff0c;勿喷&#xff0c;如果有错误之处&#xff0c;还望指出&#xff0c;感激不尽~

技术之路不在一时&#xff0c;山高水长&#xff0c;纵使缓慢&#xff0c;驰而不息。

公众号&#xff1a;秦怀杂货店


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
author-avatar
风行汽车-赣州景通4S店
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有