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 <dependency> 2 <groupId>com.github.pagehelper</groupId> 3 <artifactId>pagehelper</artifactId> 4 <version>4.2.1</version> 5 </dependency>
-