• 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

  • 相关阅读:
    05 单例模式
    04 volatile关键字实现原理
    03 synchronized
    02 java内存模型
    spark性能调优06-数据倾斜处理
    redis缓存架构-03-redis下的replication以及master+slave
    SpringBoot webSocket搭建示例
    Httpclient-(get、post(application/json)、post(application/form-data)、download、upload)
    CentOS-Java 依赖安装
    Git使用教程
  • 原文地址:https://www.cnblogs.com/nbfujx/p/7725986.html
Copyright © 2020-2023  润新知