张先生~

导航

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>  

posted on 2018-02-05 20:45  张先生~  阅读(9807)  评论(1编辑  收藏  举报