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);
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);
項目中使用了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 <dependency> 2 <groupId>com.github.pagehelper</groupId> 3 <artifactId>pagehelper</artifactId> 4 <version>4.2.1</version> 5 </dependency>