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

Provider动态语言注解

MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是创建动态语言和让MyBatis执行这些语言。git

先贴上代码:这个实现了一个对teacher实体类进行动态的多条件查询github

一、新建一个类 TeacherSqlProvider 这个最好这么命名比较符合规范吧sql

 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 }

 

二、在TeacherDao加入查询方法:apache

1 @SelectProvider(type=TeacherSqlProvider.class,method="queryStudentByTeacher")
2 public List<Map<String,Object>> queryStudentByTeacher(Map<String,Object> map); 
这里注意了 咱们用map来传递参数(map的key-value格式与json数据格式无缝集成),返回的类型也必须是map

三、在JUnit中测试json

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 直接贴上代码吧session

 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); 

 

@UpdateProviderapp

 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这个注解不能一块儿使用。。ide

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版本致使的,升级版本便可。ui

    1. 1 <dependency>  
      2     <groupId>com.github.pagehelper</groupId>  
      3     <artifactId>pagehelper</artifactId>  
      4    <version>4.2.1</version>  
      5 </dependency>  
相关文章
相关标签/搜索