关于mybatis动态SQL(SQLProvider)

 

 

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

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

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

 

  public class TeacherSqlProvider {
  
  
  public String queryStudentByTeacher(Map<String,Object> map){
    BEGIN();
    SELECT("sname,s.sex,tname");
    FROM("student s");
    INNER_JOIN("teacher t on s.tid=t.tid");
    if(map.get("sname")!=null)
       WHERE("sname=#{sname}");
    if(map.get("sex")!=null){
       WHERE("t.sex=#{sex}");
    }
    return SQL();
  }
 
 }

 

 

2、在TeacherDao加入查询方法:

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

3、在JUnit中测试

 

 @Test
         public void testMap(){
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("sname", "小明");
            map.put("sex", "男");
            List<Map<String,Object>> res = session.getMapper(StudentDao.class).queryScoreByStudent(map);
            System.out.println(res);
        }

 

下面说说@InsertProvider 直接贴上代码吧

 

    public String save3(final Demo demo){  
         return new SQL(){{  
             INSERT_INTO("demo");  
             //多个写法.  
             INTO_COLUMNS("name","email");  
             INTO_VALUES("#{name}","#{email}");  
              
             //条件写法.  
  //         if(demo.getName() != null){  
  //            VALUES("name","#{name}");  
  //         }  
  //         if(demo.getEmail() != null){  
  //            VALUES("email","#{email}");  
  //         }  
             
        }}.toString();  
     }  

 

 

 @InsertProvider(type=DemoSqlProvider.class,method="save3")  
 @Options(keyProperty="id",keyColumn="id",useGeneratedKeys=true)  
 public void save3(Demo demo);  

 

@UpdateProvider

 

   public String update2(final Demo demo){  
         return new SQL(){{  
             UPDATE("demo");  
          
             //条件写法.  
             if(demo.getName() != null){  
                SET("name=#{name}");  
             }  
             if(demo.getEmail() != null){  
               SET("email=#{email}");  
             }  
             WHERE("id=#{id}");  
         }}.toString();  
     }  

 

 

 @UpdateProvider(type=DemoSqlProvider.class,method="update2")  
 public int update2(Demo demo); 

 

@DeleteProvider

 public String delete2(){  
        return new SQL(){{  
            DELETE_FROM("demo");  
            WHERE("id=#{id}");  
        }}.toString();  
     }  

 

 @UpdateProvider(type=DemoSqlProvider.class,method="delete2")  
 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版本导致的,升级版本即可。

 

 <dependency>  
     <groupId>com.github.pagehelper</groupId>  
     <artifactId>pagehelper</artifactId>  
    <version>4.2.1</version>  
 </dependency>  

转自:https://www.cnblogs.com/zyxs/p/8419378.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值