Mybatis基于接口注解配置SQL映射器(二)

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>
View Code

注意:

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);
View Code

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);
View Code

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);
View Code

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);
View Code

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);
View Code

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);
View Code

GITHUB

github :  https://github.com/nbfujx/learn-java-demo/tree/master/Goku.MybatisDemo.Annotation

原文地址:https://www.cnblogs.com/nbfujx/p/7725986.html