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>  
相關文章
相關標籤/搜索