Java知识Mybatis的特性详解动态SQL,拿走不谢
Mybatis的特性详解动态SQL1。MyBatisif标签:条件判断2。MyBatischoose、when和otherwise标签5。MyBatisforeach标签仰天大笑出门去,我辈岂是蓬蒿人
动态SQL是MyBatis的强大特性之一。在JDBC或其它类似的框架中,开发人员通常需要手动拼接SQL语句。根据不同的条件拼接SQL语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态SQL恰好解决了这一问题,可以根据场景动态的构建查询。
动态SQL只有几个基本元素,与JSTL或XML文本处理器相似,十分简单明了,大量的判断都可以在MyBatis的映射XML文件里配置,以达到许多需要大量代码才能实现的功能。
好处::动态SQL大大减少了编写代码的工作量,更体现了MyBatis的灵活性、高度可配置性和可维护性。一、动态sql的元素
MyBatis的动态SQL包括以下几种元素,如下表所示
1。MyBatisif标签:条件判断
MyBatisif类似于Java中的if语句,是MyBatis中最常用的判断语句。使用if标签可以节省许多拼接SQL的工作,把精力集中在XML的维护上。if语句使用方法简单,常常与test属性联合使用。
语法如下:iftest判断条件SQL语句if
当判断条件为true时,才会执行所包含的SQL语句。
最常见的场景是在if语句中包含where子句,例如。selectidselectAllBaseDataresultMapmyResultselectid,namefrombaseDataiftestname!nullwherenamelike{name}ifselect
以上代表表示根据name去查找相应的信息,但是name是一个可填可不填的条件,不填写的时候不作为查询条件。
可多个if语句同时使用。以下语句表示为可以按照name或者id进行模糊查询。如果您不输入,则返回所有的记录。但是,如果你传递了任意一个参数,它就会返回与给定参数相匹配的记录:selectidselectAllBaseDataresultMapmyResultselectid,namefrombaseDataiftestname!nullwherenamelike{name}ififtestid!idANDidlike{id}ifselect2。MyBatischoose、when和otherwise标签
MyBatis中动态语句choosewhenotherwise类似于Java中的switchcasedefault语句。由于MyBatis并没有为if提供对应的else标签,如果想要达到。。。。。。的效果,可以借助、、来实现。
动态语句choosewhenotherwise语法如下。choosewhentest判断条件1SQL语句1whenwhentest判断条件2SQL语句2whenwhentest判断条件3SQL语句3whenotherwiseSQL语句4otherwisechoose
choose标签按顺序判断其内部when标签中的判断条件是否成立,如果有一个成立,则执行相应的SQL语句,choose执行结束;
如果都不成立,则执行otherwise中的SQL语句。
这类似于Java的switch语句;choose为switch,when为case,otherwise则为default。
示例
以下示例要求:
当网站名称不为空时,只用网站名称作为条件进行模糊查询;
当网站名称为空,而网址不为空时,则用网址作为条件进行模糊查询;
当网站名称和网址都为空时,则要求网站年龄不为空。mappernamespacenet。biancheng。mapper。WebsiteMapperselectidselectWebsiteSELECTid,name,url,age,countryFROMwebsiteWHERE11choosewhentestname!nullandname!ANDnameLIKECONCAT(,{name},)whenwhentesturl!nullandurl!ANDurlLIKECONCAT(,{url},)whenotherwiseANDageisnotnullotherwisechooseselectmapper
这样MyBatis就会根据参数的设置进行判断来动态组装SQL,以满足不同业务的要求。远比Hibernate和JDBC中大量判断Java代码要清晰和明确。3。MyBatiswhere标签
where标签
where标签主要用来简化SQL语句中的条件判断,可以自动处理ANDOR条件,语法如下whereiftest判断条件ANDOR。。。ifwhere
if语句中判断条件为true时,where关键字才会加入到组装的SQL里面,否则就不加入。where会检索语句,它会将where后的第一个SQL条件语句的AND或者OR关键词去掉。
示例selectidselectWebsiteresultTypenet。biancheng。po。Websiteselectid,name,urlfromwebsitewhereiftestname!nullANDnamelike{name}ififtesturl!nullANDurllike{url}ifwhereselect4。MyBatisset标签
在Mybatis中,update语句可以使用set标签动态更新列。set标签可以为SQL语句动态的添加set关键字,剔除追加到条件末尾多余的逗号。代码如下。!使用set元素动态修改一个网站记录updateidupdateWebsiteUPDATEwebsitesetiftestname!nullname{name},ififtesturl!nullurl{url},ifsetWHEREid{id}update5。MyBatisforeach标签
对于一些SQL语句中含有in条件,需要迭代条件集合来生成的情况,可以使用foreach来实现SQL条件的迭代。
Mybatisforeach标签用于循环语句,它很好的支持了数据和List、set接口的集合,并对此提供遍历的功能。语法格式如下。foreachitemitemindexindexcollectionlistarraymapkeyopen(separator,close){item}foreach
foreach标签主要有以下属性,说明如下:item:表示集合中每一个元素进行迭代时的别名。index:指定一个名字,表示在迭代过程中每次迭代到的位置。open:表示该语句以什么开始(既然是in条件语句,所以必然以(开始)。separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是in条件语句,所以必然以,作为分隔符)。close:表示该语句以什么结束(既然是in条件语句,所以必然以)开始)。
使用foreach标签时,最关键、最容易出错的是collection属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下3种情况:如果传入的是单参数且参数类型是一个List,collection属性值为list。如果传入的是单参数且参数类型是一个array数组,collection的属性值为array。如果传入的参数是多个,需要把它们封装成一个Map,当然单参数也可以封装成Map。Map的key是参数名,collection属性值是传入的List或array对象在自己封装的Map中的key。
示例
修改array里面id为这些的数据status改为0updateprojectsetstatus0whereidinforeachitemidcollectionarrayopen(separator,close){id}foreach
注意事项:在使用foreach标签时,应提前预估一下collection对象的长度。因为大量数据的in语句会影响性能,且还有一些数据库会限制执行的SQL语句长度。6。MyBatisbind标签
每个数据库的拼接函数或连接符号都不同,例如MySQL的concat函数、Oracle的连接符号等。这样SQL映射文件就需要根据不同的数据库提供不同的实现,显然比较麻烦,且不利于代码的移植。MyBatis提供了bind标签来解决这一问题。
bind标签可以通过OGNL表达式自定义一个上下文变量。
比如,按照网站名称进行模糊查询,SQL映射文件如下。selectidselectWebsitebindnamepatternvalueparameterSELECTid,name,url,age,countryFROMwebsiteWHEREnamelike{pattern}select
bind元素属性如下:value:对应传入实体类的某个字段,可以进行字符串拼接等特殊处理。name:给对应参数取的别名。
以上代码中的parameter代表传递进来的参数,它和通配符连接后,赋给了pattern,然后就可以在select语句中使用这个变量进行模糊查询,不管是MySQL数据库还是Oracle数据库都可以使用这样的语句,提高了可移植性。
大部分情况下需要传递多个参数,下面为传递多个参数时bind的用法示例。
示例mapper文件中入参publicListUserselectUser(Useruser);xml中selectidselectUserresultTypeUserbindnamepatternnamevaluenamebindnamepatternurlvalueurlSELECTid,name,url,age,countryFROMUserWHEREnamelike{patternname}ANDurllike{patternurl}select7。MyBatistrim标签
在MyBatis中除了使用ifwhere实现多条件查询,还有一个更为灵活的元素trim能够替代之前的做法。
trim一般用于去除SQL语句中多余的AND关键字、逗号,或者给SQL语句前拼接where、set等后缀,可用于选择性插入、更新、删除或者条件查询等操作。trim语法格式如下。trimprefix前缀suffix后缀prefixOverrides忽略前缀字符suffixOverrides忽略后缀字符SQL语句trim
trim中属性说明如下
示例selectidselectUserresultTypeUserSELECTid,name,url,age,countryFROMUsertrimprefixwhereprefixOverridesandiftestname!nullandname!ANDnameLIKECONCAT(,{name},)ififtesturl!nullANDurllikeconcat(,{url},)iftrimselect需要Java资料和面试题:转发关注之后,私信【Java】即可!!!