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中添加
<dependency>
<groupId>org.mybatis.scripting</groupId>
<artifactId>mybatis-velocity</artifactId>
<version>1.3</version>
</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来作为前缀引用。例如:
@Select(" #set( $pattern = $_parameter.username + '%' ) " +
" SELECT * FROM sys_user WHERE username LIKE @{pattern}")
@Lang(org.mybatis.scripting.velocity.Driver.class)
List<sysUser> findsysUserbyvelocity(@Param("username") String username);
mybatis-velocity内建的指令
除了velocity的指令,mybatis-velocity项目为mybatis定义了一些内建的velocity指令:
trim
#trim( prefix prefixOverrides suffix suffixOverrides ) body #end
其中的参数含义同XML的trim参数含义相同;
@Select("SELECT * FROM sys_user " +
"#trim('WHERE' 'AND|OR')" +
"#if($_parameter.username)" +
" #set($_username = '%'+$_parameter.username +'%')" +
" AND username LIKE @{_username}" +
" #end" +
"#end")
@Lang(org.mybatis.scripting.velocity.Driver.class)
List<sysUser> findsysUserbyvelocity2(@Param("username") String username);
where
#where() body #end
#where()同XML中的<where>相同,可以替换条件前的AND/OR,替换为WHERE;注意一定是where()有括号的;
@Select("SELECT * FROM sys_user #where()" +
" #if($_parameter.username)" +
" #set($_username = '%'+$_parameter.username+'%')" +
" AND username LIKE @{_username}" +
" #end" +
" #end")
@Lang(org.mybatis.scripting.velocity.Driver.class)
List<sysUser> findsysUserbyvelocity3(@Param("username") String username);
mset
#mset() body #end
#mset前面加一个m,为的是和velocity本身的#set指令区别,#mset等同于XML中的<set>元素,可以在条件前加上set语句,并且去掉set块最后的分号;
@Update("update sys_user " +
"#mset() " +
" #if(!$name) name=@{name},#end " +
"#end " +
"WHERE id = @{id}")
@Lang(org.mybatis.scripting.velocity.Driver.class)
int updateUser3(sysUser sysuser);
repeat
#repeat( collection var separator open close ) body #end
#repeat指令和XML中的<foreach>元素相同,能够方便的遍历集合/数组类型元素,并使用其中的每一个元素:
@Select("SELECT * FROM sys_user #where() " +
" #repeat( $_parameter.ids $id ',' 'id IN (' ')' )" +
" @{id}" +
" #end" +
"#end")
@Lang(org.mybatis.scripting.velocity.Driver.class)
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语句之前生成的字段名称;
@Select("SELECT *FROM sys_user " +
"#where() " +
" #in( $_parameter.ids $id 'id') " +
" @{id} " +
" #end" +
"#end")
@Lang(org.mybatis.scripting.velocity.Driver.class)
List<sysUser> findsysUserbyvelocity5(@Param("ids") List<String> ids);
GITHUB
github : https://github.com/nbfujx/learn-java-demo/tree/master/Goku.MybatisDemo.Annotation
Mybatis基于接口注解配置SQL映射器(二)的更多相关文章
- Mybatis基于接口注解配置SQL映射器(一)
上文已经讲解了基于XML配置的SQL映射器,在XML配置的基础上MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码. Mybat ...
- MyBatis 3 使用注解配置SQL映射器
l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l 动态SQL @Sel ...
- MyBatis 3(中文版) 第四章 使用注解配置SQL映射器
本章将涵盖以下话题: l 在映射器Mapper接口上使用注解 l 映射语句 @Insert,@Update,@Delete,@SeelctStatements l 结果映射 一对一映射 一对多映射 l ...
- 使用注解配置SQL映射器
在上一章,我们看到了我们是怎样在映射器Mapper XML配置文件中配置映射语句的.MyBatis也支持使用注解来配置映射语句.当我们使用基于注解的映射器接口时,我们不再需要在XML配置文件中配置了. ...
- Mybatis基于XML配置SQL映射器(二)
Mybatis之XML注解 之前已经讲到通过 mybatis-generator 生成mapper映射接口和相关的映射配置文件: 下面我们将详细的讲解具体内容 首先我们新建映射接口文档 sysUse ...
- 小峰mybatis(5)mybatis使用注解配置sql映射器--动态sql
一.使用注解配置映射器 动态sql: 用的并不是很多,了解下: Student.java 实体bean: package com.cy.model; public class Student{ pri ...
- 小峰mybatis(4)mybatis使用注解配置sql映射器
主流开发还是使用xml来配置:使用注解配置比较快,但是不支持所有功能:有些功能还是得用配置文件: 一.基本映射语句: @Inert @Update @Delete @Select 二.结果集映射语句 ...
- Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器
关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务 ...
- MyBatis学习笔记3--使用XML配置SQL映射器
<resultMap type="Student" id="StudentResult"> <id property="id&quo ...
随机推荐
- boost timer
Boost.Timer provides clocks to measure code performance. At first, it may seem like this library com ...
- Sql server 2008 的完成备份和差异备份还原
当数据库数据量不大的情况下用 Sqlserver 的完全备份就完全可以了 步骤为: 1.在需要还原的数据库上右键选择如图 2.在“常规”选项中点击“源设备”选取磁盘上备份好的.bak文件后,勾上“还原 ...
- 实验1 C语言环境使用和数据类型 运算符 表达式
Part1 经过练习我发现自己经长会漏掉分号,有时输入法不同,打出来的括号前后不同,还有转义字符的使用,大小写转化之间的表达.还有打字速度比较慢. Part2 #include<stdio.h& ...
- BZOJ 5137: [Usaco2017 Dec]Standing Out from the Herd(后缀自动机)
传送门 解题思路 这个似乎和以前做过的一道题很像,只不过这个是求本质不同子串个数.肯定是先把广义\(SAM\)造出来,然后\(dfs\)时把子节点的信息合并到父节点上,看哪个只被一个串覆盖,\(ans ...
- CF 1172E Nauuo and ODT ——LCT
题目:http://codeforces.com/contest/1172/problem/E LCT好题. 考虑对每个颜色求出 “不是该颜色的点组成的连通块的 siz2 之和” .每个颜色用 LCT ...
- PWA 应用
1. 使用例子,vue官网,在手机浏览器器打开时,保存在桌面那个应用.还有饿了么网站也是PWA应用.
- (转)JVM运行时数据区
转:http://www.cnblogs.com/myna/p/7567208.html java虚拟机运行时数据区,具体分为如下几个区域 程序计数器(Program Counter Register ...
- 104、Tensorflow 的变量重用
import tensorflow as tf # 在不同的变量域中调用conv_relu,并且声明我们想创建新的变量 def my_image_filter(input_images): with ...
- git使用记录六:对commit的message做处理
修改最新commit的message git commit --amend 修改老旧commit的message 查询最新的三个log soaeon@DESKTOP-FUJJTHR MINGW64 / ...
- 关于toString()的一些事情
Java上输出一个数组的时候,不可以直接输出 System.out.println(arr); 直接输出数据的名称会输出数组的内存地址.换句话说,他的输出是: getClass().getName() ...