本文共 3798 字,大约阅读时间需要 12 分钟。
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的编写。
12 org.mybatis.scripting 3mybatis-velocity 41.3 5
注意:
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 ListfindsysUserbyvelocity(@Param("username") String username);
除了velocity的指令,mybatis-velocity项目为mybatis定义了一些内建的velocity指令:
#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 ListfindsysUserbyvelocity2(@Param("username") String username);
#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 ListfindsysUserbyvelocity3(@Param("username") String username);
#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( 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 ListfindsysUserbyvelocity4(@Param("ids") List ids);
#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 ListfindsysUserbyvelocity5(@Param("ids") List ids);
github :
转载地址:http://zggfm.baihongyu.com/