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. 1 <dependency>
      2 <groupId>com.github.pagehelper</groupId>
      3 <artifactId>pagehelper</artifactId>
      4    <version>4.2.1</version>
      5 </dependency>

MyBatis注解-动态SQL 一个 SqlProvider的demo的更多相关文章

  1. mybatis注解动态sql

    @Insert("INSERT INTO user (name, age, gender, experience) VALUES (<a href="http://www.o ...

  2. 4.Spring注解+SpringMVC注解+MyBatis注解(动态sql)

    1.创建如图所示项目结构 2.在项目的

  3. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  4. Java-MyBatis:MyBatis 3 动态 SQL

    ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ...

  5. 一分钟带你了解下MyBatis的动态SQL!

    MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...

  6. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

  7. mybatis 使用动态SQL

    RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...

  8. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  9. 使用Mybatis实现动态SQL(一)

    使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:        *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...

随机推荐

  1. HQL知识点一

    Hive创表语法 create [external] table [if not exists] [db_name.]table_name (col1_name data_type,col2_name ...

  2. 上传文件代码报错,java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory

    2018-09-11 11:11:08.235 ERROR 14352 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : ...

  3. jmeter 上传附件脚本报Non HTTP response code: java.io.FileNotFoundException

    如果上传附件报如下错误,就需要把附件放到和脚本同一路径下就解决了

  4. 百战程序员——EL、JSTL

    1.EL表达式可以操作作用域中的属性,也可以操作普通的局部变量.对吗? 不对 El表达式一般支持作用域(application.session.request.pagecontext)中的属性.EL变 ...

  5. Java第五周总结

    Java抽象类与接口的区别 很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看 ...

  6. delphi的流操作的语法

    Delphi在这两方面都做的相当出色.在Delphi的早期版本Turbo Pascal 中就曾有流(Stream).群(Collection)和资源(Resource)等专门用于对象式数据管理的类.在 ...

  7. 【转载】 spring事物配置,声明式事务管理和基于@Transactional注解的使用

    https://blog.csdn.net/bao19901210/article/details/41724355

  8. Eclipse导入已有的项目后项目报错的解决办法

    第一种:jsp报错 选择windows-->preference-->列表找到Validation-->点击Disable All ->> Apply ->> ...

  9. 【步步为营 Entity Framework+Reporting service开发】-(2) Code Fir

    也许有人问,为什么要用EF创建爱你数据表,code first好处是什么? 使用EF创建数据库/表,只需要设计简单的C#类,再表内容变化的时候他会自动更新数据库结构,并且保留原有数据. EF很强大,支 ...

  10. c/c++的常用函数和STL使用

    一个超好用的c++网站:http://www.cplusplus.com/reference/string/string/erase/ 一.函数头中包含的函数 1.qsort函数对数组.结构体等进行排 ...