Mybatis之增强型注解
MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码。但是注解对动态SQL的支持一直差强人意,即使MyBatis提供了InsertProvider等*Provider注解来支持注解的Dynamic SQL,也没有降低SQL的编写难度,甚至比XML格式的SQL语句更难编写和维护。注解的优势在于能清晰明了的看见接口所使用的SQL语句,抛弃了繁琐的XML编程方式。但没有良好的动态SQL支持,往往就会导致所编写的DAO层中的接口冗余,所编写的SQL语句很长,易读性差……
Mybatis在3.2版本之后,提供了LanguageDriver接口,我们可以使用该接口自定义SQL的解析方式。故在这里向大家介绍下以此来实现注解方式下的动态SQL。
Mybatis-velocity项目可以允许你方便的使用velocity作为脚本语言来完成Mapper文件中各种动态sql的编写。
在maven中添加
1 <dependency> 2 <groupId>org.mybatis.scripting</groupId> 3 <artifactId>mybatis-velocity</artifactId> 4 <version>1.3</version> 5 </dependency>
注意:
1.如果使用了velocity,参数要使用@{}来引用,因为velocity的指令就是以#开头的,比如#set #if等;
2.使用velocity脚本,在参数中也可以配置对应的javaType和jdbcType;配置格式为:@{ property, attr1=val1, attr2=val2, ... };可配置项有javaType, jdbcType, mode, numericScale, resultMap, typeHandler, jdbcTypeName;
3.在velocity的指令中使用context中的变量,需要使用$_parameter来作为前缀引用。例如:
1 @Select(" #set( $pattern = $_parameter.username + '%' ) " + 2 " SELECT * FROM sys_user WHERE username LIKE @{pattern}") 3 @Lang(org.mybatis.scripting.velocity.Driver.class) 4 List<sysUser> findsysUserbyvelocity(@Param("username") String username);
mybatis-velocity内建的指令
除了velocity的指令,mybatis-velocity项目为mybatis定义了一些内建的velocity指令:
trim
#trim( prefix prefixOverrides suffix suffixOverrides ) body #end
其中的参数含义同XML的trim参数含义相同;
1 @Select("SELECT * FROM sys_user " + 2 "#trim('WHERE' 'AND|OR')" + 3 "#if($_parameter.username)" + 4 " #set($_username = '%'+$_parameter.username +'%')" + 5 " AND username LIKE @{_username}" + 6 " #end" + 7 "#end") 8 @Lang(org.mybatis.scripting.velocity.Driver.class) 9 List<sysUser> findsysUserbyvelocity2(@Param("username") String username);
where
#where() body #end
#where()同XML中的<where>相同,可以替换条件前的AND/OR,替换为WHERE;注意一定是where()有括号的;
1 @Select("SELECT * FROM sys_user #where()" + 2 " #if($_parameter.username)" + 3 " #set($_username = '%'+$_parameter.username+'%')" + 4 " AND username LIKE @{_username}" + 5 " #end" + 6 " #end") 7 @Lang(org.mybatis.scripting.velocity.Driver.class) 8 List<sysUser> findsysUserbyvelocity3(@Param("username") String username);
mset
#mset() body #end
#mset前面加一个m,为的是和velocity本身的#set指令区别,#mset等同于XML中的<set>元素,可以在条件前加上set语句,并且去掉set块最后的分号;
1 @Update("update sys_user " + 2 "#mset() " + 3 " #if(!$name) name=@{name},#end " + 4 "#end " + 5 "WHERE id = @{id}") 6 @Lang(org.mybatis.scripting.velocity.Driver.class) 7 int updateUser3(sysUser sysuser);
repeat
#repeat( collection var separator open close ) body #end
#repeat指令和XML中的<foreach>元素相同,能够方便的遍历集合/数组类型元素,并使用其中的每一个元素:
1 @Select("SELECT * FROM sys_user #where() " + 2 " #repeat( $_parameter.ids $id ',' 'id IN (' ')' )" + 3 " @{id}" + 4 " #end" + 5 "#end") 6 @Lang(org.mybatis.scripting.velocity.Driver.class) 7 List<sysUser> findsysUserbyvelocity4(@Param("ids") List<String> ids);
in
#in( collection var field ) body #end
#in指令是一个新的指令,能够快速的专门针对SQL中的IN条件生成对应的field IN()语句;参数列表中,collection代表要遍历的IN中的内容;var代表遍历中的每一个对象的临时引用名称;field代表在IN语句之前生成的字段名称;
1 @Select("SELECT *FROM sys_user " + 2 "#where() " + 3 " #in( $_parameter.ids $id 'id') " + 4 " @{id} " + 5 " #end" + 6 "#end") 7 @Lang(org.mybatis.scripting.velocity.Driver.class) 8 List<sysUser> findsysUserbyvelocity5(@Param("ids") List<String> ids);
GITHUB
github : https://github.com/nbfujx/learn-java-demo/tree/master/Goku.MybatisDemo.Annotation