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. nodejs之mock与跨域代理的三两事

    emmm...好久没写博客了,都忘了该怎么开始. 那就先说下mockjs.因为一些原因,导致后台接口没有数据,那么我们就开始自己造数据,使用的是比较流行mockjs,根据文档就能简单的配置,然后开始愉 ...

  2. videojs播放直播源rtmp时画面在左上角解决方案

    问题描述:https://stackoverflow.com/questions/30383135/videojs-live-rtmp-stream-player-and-video-size-iss ...

  3. JPA Example 基本使用使用实例

    一.相关接口方法     在继承JpaRepository接口后,自动拥有了按“实例”进行查询的诸多方法.这些方法主要在两个接口中定义,一是QueryByExampleExecutor,一个是JpaR ...

  4. Golang微服务:Micro Trace使用opentracing jaeger

    trace Micro通过Wrapper实现了三种trace接口,aswxray,opencensus,opentracing,这里主要关注opentracing,opentracing已成为行业标准 ...

  5. Vue原理--双向数据绑定

    MVVM MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态 ...

  6. Maven&&Philosophy~

    What is Maven? At first glance Maven can appear to be many things, but in a nutshell Maven is an att ...

  7. MySQL delete语句的问题

    以前遇到过几次这个问题,都觉得问题不大,所以没有记录,但是这次又遇到了,而且没有第一时间想起来,所以还是有记录下的必要 MySQL    delete语句使用子查询操作同一张表的时候会抛出 DELET ...

  8. CentOS7下MySQL5.7安装配置方法图文教程(YUM)

    安装环境:CentOS7 64位,MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ # ...

  9. maya权重拷贝一对一,一对多

    是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送 ...

  10. mint-ui loadmore使用方法和注意事项

    最好按照github里的例子ctrl+c => v 模版.js mint-ui/example/pages/pull-up.vue 注意设置:mt-loadmore组件:auto-fill='a ...