zoukankan      html  css  js  c++  java
  • 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. 1 <dependency>  
        2     <groupId>com.github.pagehelper</groupId>  
        3     <artifactId>pagehelper</artifactId>  
        4    <version>4.2.1</version>  
        5 </dependency>  
  • 相关阅读:
    场景调研
    12.8
    12.7
    12.6
    12.5
    12.4
    12.3
    重启oracle数据库的操作方法
    oracle创建dblink方法
    SQL*Loader 详解
  • 原文地址:https://www.cnblogs.com/zyxs/p/8419378.html
Copyright © 2011-2022 走看看