博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis基于接口注解配置SQL映射器(二)
阅读量:7237 次
发布时间:2019-06-29

本文共 3798 字,大约阅读时间需要 12 分钟。

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 
2
org.mybatis.scripting
3
mybatis-velocity
4
1.3
5
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
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
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
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
findsysUserbyvelocity4(@Param("ids") List
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
findsysUserbyvelocity5(@Param("ids") List
ids);
View Code

GITHUB

github : 

转载地址:http://zggfm.baihongyu.com/

你可能感兴趣的文章
DIV 拖动效果高级篇
查看>>
SQL SERVER 2012链接到SQL SERVER 2000的问题解决案例
查看>>
Web性能--TCP的构成
查看>>
(十七)java冒泡排序和compareto
查看>>
linux内存查看方式
查看>>
Java魔法堂:String.format详解-
查看>>
线性重复动画
查看>>
炒冷饭系列:设计模式 建造者模式
查看>>
BAT解密:互联网技术发展之路(2)- 业务如何驱动技术发展
查看>>
bat脚本自动扫描制定文件夹下shp文件,并导入数据库,然后执行空间操作
查看>>
关于AsyncHttpClient的cz.msebera.android.httpclient.Header
查看>>
Codekit - 为Web前端打造的全能型神器(附推荐各种工具)
查看>>
JSP JSTL SQL标签操作数据库
查看>>
compare python use py-postgresql & direct pgbench's performance
查看>>
【hibernate框架】核心开发接口-update方法
查看>>
Android过场动画基础教程
查看>>
实现指定任意数量的方块EditText容器BlockEditTextViewGroup
查看>>
PostCSS 常用插件与语法介绍
查看>>
计算机是如何存储数据的?
查看>>
Decorator:从原理到实践,我一点都不虚~
查看>>