MyBatis注解-动态SQL 一个 SqlProvider的demo

时间:2022-12-30 16:52:08
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&period;Spring注解&plus;SpringMVC注解&plus;MyBatis注解&lpar;动态sql&rpar;

    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. 【备忘】Conky配置

    贴配置: background yes use_xft yes xftfont Sans:size= xftalpha 0.8 update_interval own_window yes own_w ...

  2. Android开源源码推荐(一)

    1.Android-ViewPagerIndicator http://www.akaifa.com/code/86/android-viewpagerindicator 实现各种样式的滑动视图(Sc ...

  3. 根据Expander的IsExpanded属性值的变化动态设计Control的size

    简要说明: 当Expander 的IsExpanded属性为“True” 时给控件设个尺寸(此处为高度),当为“False”时给控件设另外一个值. 知识点:数据绑定.Style和Trigger &lt ...

  4. codeforces 709A A&period; Juicer&lpar;水题&rpar;

    题目链接: A. Juicer 题意: 给出n个橘子,汁漫出来了就倒出来,反正就是要求要倒几次; 思路: AC代码: #include <iostream> #include <cs ...

  5. cookie&plus;memcached实现单点登陆

    10年的时候在iteye的第一篇文章记录了一下当时怎么实现我们系统的单点登陆.不过那个时候文章写的不好,思路也很浮躁,很难看懂,在csdn的第一篇技术博客打算重新温顾一下当时实现单点登陆的思路.先来看 ...

  6. The dialect was not set&period; Set the property hibernate&period;dialect

    The   dialect   was   not   set.   Set   the   property   hibernate.dialect load hibernate.cfg.xml 出 ...

  7. 问题-&lbrack;delphi2007、2010&rsqb;无法二次启动,报EditorLineEnds&period;ttr被占用,进程一直有bds&period;exe?

    问题现象:delphi2007.2010无法二次启动,报EditorLineEnds.ttr被占用,而且进程中一直有bds.exe的进程? 问题原因:问题处理:方法一:可能是系统更新的东东造在的.KB ...

  8. 一行代码解决Android M新的运行时权限问题

    Android M运行时权限是个啥东西 啥是运行时权限呢?Android M对权限管理系统进行了改版,之前我们的App需要权限,只需在manifest中申明即可,用户安装后,一切申明的权限都可来去自如 ...

  9. iOS中的下载管理器&lpar;支持断点续传&rpar;

    在空闲时间自己编写了一个简单的iOS下载管理器.该管理器实现如下功能: 1.能够支持正常的下载,暂停,继续操作. 2.支持断点续传,实现暂停执行继续操作后,依然能正常将文件下载完成. 3.实现实时状态 ...

  10. FairScheduler的任务调度机制——assignTasks

    首先需要了解FairScheduler是如何在各个Pool之间分配资源,以及每个Pool如何在Job之间分配资源的.FairScheduler的分配资源发生在update()方法中,而该方法由一个线程 ...