< select id = "queryByIdAndTitle"
resultType = "Blog" >
SELECT * FROM BLOG
WHERE 1=1
< if test = "id!= null and title!=null" >
AND id=#{id} and id="codetool">
注:if标签一般用于非空验证,如上例,若id为空,if标签里的代码,将不会执行,反之,则会执行。
2.2 choose(when,otherwise)标签:直接上代码
?
1
2
3
4
5
6
7
8
9
10
11
12
|
< select id = "queryBy"
resultType = "Blog" >
SELECT * FROM BLOG WHERE 1=1
< choose >
< when test = "title != null" >
AND title like #{title}
</ when >
< otherwise >
AND id= 1
</ otherwise >
</ choose >
</ select >
|
注:choose(when,otherwise)标签相当于switch(case,default) ,如上例,若title 为空,when标签里的代码,将不会执行,默认执行otherwise标签里面的代码。
2.3 trim(where,set)标签:直接上代码
?
1
2
3
4
5
6
7
8
|
< select id = "queryBy" resultType = "com.scme.pojo.User" parameterType = "com.scme.pojo.User" >
select * from user
< where >
< if test = "username!=null and password!=null" >
and username=#{username} and password=#{password}
</ if >
</ where >
</ select >
|
注:假设上例传入的username,password不为空,代码就可以运行成功!但朋友们可能有疑问了,实际上执行的sql语句是什么呢?其实,sql为:select * from user
where username=? and password=? 朋友们是否发现,where标签代替了sql中where关键字,但if中的and不见了。其实where标签可以自动去除是“AND”或“OR”开头的sql中的“AND”或“OR”关键字。
如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制sql,实现where标签的效果。代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
< select id = "queryBy" resultType = "com.scme.pojo.User" parameterType = "com.scme.pojo.User" >
select * from user
< trim prefix = "WHERE" prefixOverrides = "AND |OR " >
< if test = "username!=null and password!=null" >
and username=#{username} and password=#{password}
</ if >
</ trim >
</ select >
|
set标签,代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
< update id = "updateUser" parameterType = "com.scme.pojo.User" >
update user
< set >
< if test = "username!=null" >
username=#{username}
</ if >
</ set >
< where >
< if test = "id!=null" >
id=#{id}
</ if >
</ where >
</ update >
|
注:set标签功能和where标签差不多,set标签代替了sql中set关键字,set标签可以自动去除sql中的多余的“,”
同理,trim标签也可以实现set标签的功能
?
1
2
3
4
5
6
7
8
9
10
11
12
|
< update id = "updateUser" parameterType = "com.scme.pojo.User" >
update user
< trim prefix = "set" prefixOverrides = "," >
< if test = "username!=null" > username=#{username} </ if >
</ trim >
< where >
< if test = "id!=null" > id=#{id} </ if >
</ where >
</ update >
|
2.4 foreach标签:foreach标签实现批量删除,直接上代码
?
1
2
3
4
5
6
7
8
|
< delete id = "batchDelete" parameterType = "java.lang.String" >
delete from user
where id in
< foreach item = "id" index = "index" collection = "list"
open = "(" separator = "," close = ")" >
#{id}
</ foreach >
</ delete >
|
注:foreach标签可迭代任何对象(如列表、集合等)和任何的字典或者数组对象传递给foreach作为集合参数,当使用可迭代对象或者数组时,index是当前迭代的次数,item的值是本次迭代获取的元素。当使用字典(或者Map.Entry对象的集合)时,index是键,item是值。collection标签可以填('list','array','map')。
foreach元素的属性主要有 item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名;
index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置;
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔符;
close表示以什么结束。
3.bind
bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:
?
1
2
3
4
5
|
< select id = "selectBlogsLike" resultType = "Blog" >
< bind name = "pattern" value = "'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</ select >
|
4.Multi-db vendor support
一个配置了“_databaseId”变量的 databaseIdProvider 对于动态代码来说是可用的,这样就可以根据不同的数据库厂商构建特定的语句。比如下面的例子:
?
1
2
3
4
5
6
7
8
9
10
11
|
< insert id = "insert" >
< selectKey keyProperty = "id" resultType = "int" order = "BEFORE" >
< if test = "_databaseId == 'oracle'" >
select seq_users.nextval from dual
</ if >
< if test = "_databaseId == 'db2'" >
select nextval for seq_users from sysibm.sysdummy1"
</ if >
</ selectKey >
insert into users values (#{id}, #{name})
</ insert >
|
动态 SQL 中可插拔的脚本语言
MyBatis 从 3.2 开始支持可插拔的脚本语言,因此你可以在插入一种语言的驱动(language driver)之后来写基于这种语言的动态 SQL 查询。
可以通过实现下面接口的方式来插入一种语言:
?
1
2
3
4
5
|
public interface LanguageDriver {
ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);
SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType);
SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType);
}
|
一旦有了自定义的语言驱动,你就可以在 mybatis-config.xml 文件中将它设置为默认语言:
?
1
2
3
4
5
6
|
< typeAliases >
< typeAlias type = "org.sample.MyLanguageDriver" alias = "myLanguage" />
</ typeAliases >
< settings >
< setting name = "defaultScriptingLanguage" value = "myLanguage" />
</ settings >
|
除了设置默认语言,你也可以针对特殊的语句指定特定语言,这可以通过如下的 lang 属性来完成:
?
1
2
3
|
< select id = "selectBlog" lang = "myLanguage" >
SELECT * FROM BLOG
</ select >
|
或者在你正在使用的映射中加上注解 @Lang 来完成:
?
1
2
3
4
|
public interface Mapper {
@Lang (MyLanguageDriver. class )
@Select ( "SELECT * FROM BLOG" )
List<Blog> selectBlog();
|
注意 可以将 Apache Velocity 作为动态语言来使用,更多细节请参考 MyBatis-Velocity 项目。
到此这篇关于MyBatis动态SQL标签的用法详解的文章就介绍到这了,更多相关MyBatis动态SQL标签内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.cnblogs.com/zjl6/p/6965361.html
- Java教程
这篇文章主要介绍了在java的基础上学习上传Excel文件并导出到数据库,感兴趣的小伙伴不要错过奥...
4522021-12-14
- Java教程
开发中不免会遇到需要所有子线程执行完毕通知主线程处理某些逻辑的场景。或者是线程 A 在执行到某个条件通知线程 B 执行某个操作。下面我们来一起学...
6342021-12-21
- Java教程
这篇文章主要介绍了java web支持jsonp的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...
5212021-06-17
- Java教程
本篇文章主要介绍了详解快速搭建Spring Boot+Spring MVC,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...
7592021-10-06
- Java教程
lombok是一个可以帮助我们简化java代码编写的工具类,这篇文章主要介绍了lombok注解介绍小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一...
12552021-06-17
- Java教程
这篇文章主要介绍了Java多线程的死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来...
5052022-03-01
- Java教程
本篇文章主要介绍了Java 处理图片与base64 编码的相互转换的示例,具有一定的参考价值,有兴趣的可以了解一下...
4082020-12-15
- Java教程
这篇文章主要介绍了通过Spring Security魔幻山谷讲解获取认证机制核心原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习...
5742021-09-06
|