MyBatis注解-动态SQL 一个 SqlProvider的demo
Provider动态语言注解
MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建立动态语言和让MyBatis执行这些语言。
先贴上代码:这个实现了一个对teacher实体类进行动态的多条件查询
1、新建一个类 TeacherSqlProvider 这个最好这么命名比较符合规范吧
1 public class TeacherSqlProvider {
2
3
4 public String queryStudentByTeacher(Map<String,Object> map){
5 BEGIN();
6 SELECT("sname,s.sex,tname");
7 FROM("student s");
8 INNER_JOIN("teacher t on s.tid=t.tid");
9 if(map.get("sname")!=null)
10 WHERE("sname=#{sname}");
11 if(map.get("sex")!=null){
12 WHERE("t.sex=#{sex}");
13 }
14 return SQL();
15 }
16
17 }
2、在TeacherDao加入查询方法:
1 @SelectProvider(type=TeacherSqlProvider.class,method="queryStudentByTeacher")
2 public List<Map<String,Object>> queryStudentByTeacher(Map<String,Object> map);
这里注意了 我们用map来传递参数(map的key-value格式与json数据格式无缝集成),返回的类型也必须是map
3、在JUnit中测试
1 @Test
2 public void testMap(){
3 Map<String,Object> map = new HashMap<String,Object>();
4 map.put("sname", "小明");
5 map.put("sex", "男");
6 List<Map<String,Object>> res = session.getMapper(StudentDao.class).queryScoreByStudent(map);
7 System.out.println(res);
8 }
下面说说@InsertProvider 直接贴上代码吧
1 public String save3(final Demo demo){
2 return new SQL(){{
3 INSERT_INTO("demo");
4 //多个写法.
5 INTO_COLUMNS("name","email");
6 INTO_VALUES("#{name}","#{email}");
7
8 //条件写法.
9 // if(demo.getName() != null){
10 // VALUES("name","#{name}");
11 // }
12 // if(demo.getEmail() != null){
13 // VALUES("email","#{email}");
14 // }
15
16 }}.toString();
17 }
1 @InsertProvider(type=DemoSqlProvider.class,method="save3")
2 @Options(keyProperty="id",keyColumn="id",useGeneratedKeys=true)
3 public void save3(Demo demo);
@UpdateProvider
1 public String update2(final Demo demo){
2 return new SQL(){{
3 UPDATE("demo");
4
5 //条件写法.
6 if(demo.getName() != null){
7 SET("name=#{name}");
8 }
9 if(demo.getEmail() != null){
10 SET("email=#{email}");
11 }
12 WHERE("id=#{id}");
13 }}.toString();
14 }
1 @UpdateProvider(type=DemoSqlProvider.class,method="update2")
2 public int update2(Demo demo);
@DeleteProvider
1 public String delete2(){
2 return new SQL(){{
3 DELETE_FROM("demo");
4 WHERE("id=#{id}");
5 }}.toString();
6 }
1 @UpdateProvider(type=DemoSqlProvider.class,method="delete2")
2 public int delete2(int id);
sql_@SelectProvider及使用注意:
项目中使用了PageHelper 进行分页,与@@SelectProvider这个注解不能一起使用。。
nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'providerTakesParameterObject' in 'class org.apache.ibatis.builder.annotation.ProviderSqlSource'
出现以上问题,是由于我们使用的PageHelper版本导致的,升级版本即可。
1 <dependency>
2 <groupId>com.github.pagehelper</groupId>
3 <artifactId>pagehelper</artifactId>
4 <version>4.2.1</version>
5 </dependency>
MyBatis注解-动态SQL 一个 SqlProvider的demo的更多相关文章
- mybatis注解动态sql
@Insert("INSERT INTO user (name, age, gender, experience) VALUES (<a href="http://www.o ...
- 4.Spring注解+SpringMVC注解+MyBatis注解(动态sql)
1.创建如图所示项目结构 2.在项目的
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- Java-MyBatis:MyBatis 3 动态 SQL
ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ...
- 一分钟带你了解下MyBatis的动态SQL!
MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- mybatis 使用动态SQL
RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- 使用Mybatis实现动态SQL(一)
使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面: *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...
随机推荐
- 【EMV L2】终端验证结果(Terminal Verification Results,TVR)
终端验证结果,Terminal Verification Results(TVR),Tag95,5bytes: 记录交易过程中,数据认证.处理限制.持卡人验证.终端风险管理.行为分析以及联机处理的结果 ...
- C语言权威指南和书单 - 专家级别
注: 点击标题即可下载 1. Advanced Programming in the UNIX Environment, 3rd Edition 2. Essential C 3. Computer ...
- 服务端渲染时无法获得环境变量的值,一直是undefined
1.服务端渲染时无法获得环境变量的值,一直是undefined 2.ngnix做代理以后无法无法获取node设置的cookie
- java语言入门
Java语言的介绍: Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言. 它最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机.电话.闹钟.烤面包机等家用电器的控 ...
- fiddler 一些不为人知的功能
1. fiddler的ctrl+F查找功能 可以进行正则表达式查找: 勾选Regular Expression,find中出现REGEX:,在这后面输入正则表达式即可进行匹配查找 2. fiddler ...
- 原来你是这样的setTimeout
先上代码 console.log("start"); setTimeout(function(){ console.log("Hello"); },200); ...
- Charles 注册码/破解/激活
Charles 注册码 软件去官网下载安装即可. 适用于Charles任意版本的注册码 Charles 4.2.7 目前是最新版,可用. Registered Name: https://zhil ...
- Error: no override found for 'vtkRenderWindow'
VSK7.1+QT5.10环境下报该错误,应该在mainwindow.cpp中添加如下语句 记住,是在mainwindow.cpp中添加,不是在main.cpp中添加:
- 2018-2019-2 20165313《网络对抗技术》Exp1 缓冲区溢出实验
实践涉及指令 NOP:NOP指令即"空指令".执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令.(机器码:90) JNE:条件转移指令, ...
- redis配置文件说明
redis.conf 配置项说明如下: Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 当Redis以守护进程方式运行时,Redis默认 ...