Mybatis动态sql之@provider使用

目录

1.简单介绍

2.@SelectProvider

3.@InsertProvider

4.@UpdateProvider

5.@DeleteProvider

6.参数传递问题


1.简单介绍

  • @provider包括@SelectProvider,@InsertProvider,@UpdateProvider,@DeleteProvider

  • 主要有两个参数:

    • type:sql类的Class对象(写动态的sql的类的类名)

    • method:类中该方法名

  • 统一用法(基于注解)
DemoDao中:
​
@对应的注解名(type=类名.class,method="方法名"):通过调用Class上的这个方法来获得sql语句    
public 方法的返回值 方法名(参数类型 参数);  
DemoSqlProvider中
public class 类型 {  
    /** 
     * 查询语句. 
     * @param demo 
     * @return 
     */  
    public String select5(参数类型 参数){  
       return new SQL(){{ 
       SELECT("*");
       FROM("student")
       if(参数.getName() != null){  
           WHERE("name=#{name}");
       }  
       if(参数.getEmail() != null){  
           WHERE("email=#{email}")
       }   
    }}.toString();  
     
}  

2.@SelectProvider

StudentDao中:
​
@SelectProvider(type=StudentSqlProvider.class,method="select5")  
public List<Demo> select5(Student demo);  
StudentemoSqlProvider中:
public cStudent StudentSqlProvider {  
​
    /** 
     * 查询语句. 
     * @param demo 
     * @return 
     */  
    public String Studentct5(Student demo){  
       public String select5(参数类型 参数){  
       return new SQL(){{ 
       SELECT("*");
       FROM("student")
       if(参数.getName() != null){  
           WHERE("name=#{name}");
       }  
       if(参数.getEmail() != null){  
           WHERE("email=#{email}")
       }   
    }}.toString();  
}  

3.@InsertProvider

@InsertProvider(type=StudentSqlProvider.class,method="save3")  
public void save3(Student demo);  
​
/** 
     * 查询语句.使用SQL 
     * @param demo 
     * @return 
     */  
    public String save3(final Student demo){  
       return new SQL(){{  
           INSERT_INTO("sutdent");  
           //多个写法.  
           INTO_COLUMNS("name","email");  
           INTO_VALUES("#{name}","#{email}");  
            
           //条件写法.  
//         if(demo.getName() != null){  
//            VALUES("name","#{name}");  
//         }  
//         if(demo.getEmail() != null){  
//            VALUES("email","#{email}");  
//         }  
            
       }}.toString();  
    }  

4.@UpdateProvider

/** 
     * @param demo 
     * @return 
     */  
    public String update2(final Student demo){  
       return new SQL(){{  
           UPDATE("sutdent");  
           //条件写法.  
           if(demo.getName() != null){  
              SET("name=#{name}");  
           }  
           if(demo.getEmail() != null){  
              SET("email=#{email}");  
           }  
           WHERE("id=#{id}");  
       }}.toString();  
    }  
    
@UpdateProvider(type=StudentSqlProvider.class,method="update2")  
public int update2(Student demo);  

5.@DeleteProvider

 /** 
     * @param id 
     * @return 
     */  
    public String delete2(@param("id") long id){  
       return new SQL(){{  
           DELETE_FROM("sutdent");  
           WHERE("id=#{id}");  
       }}.toString();  
    }  
    
@UpdateProvider(type=StudentSqlProvider.class,method="delete2")  
public int delete2(int id);  

6.参数传递问题

  • 对于只有一个参数的情况(不加param),可以直接使用,参见前面的部分。但是,如果在dao方法中,对参数使用了@Param注解的话,那么相应selectUser方法必须接受Map<String, Object>做为参数

  • 在超过一个参数的情况下,@SelectProvide方法必须接受Map<String, Object>做为参数,如果参数使用了@Param注解,那么参数在Map中以@Param的值为key

上一篇:Python又爆重大漏洞,你的电脑可能正在被攻击


下一篇:接口倒置原则