mybatis 3 增加注解@SelectProvider
mybatis 3中增加了使用注解来配置Mapper的新特性,其中@Provider的使用方式较为复杂。@provide主要分为四种:
@InsertProvider
@DeleteProvider
@UpdateProvider
// @SelectProvide指定一个Class及其方法,并且通过调用Class上的这个方法来获得sql语句
// @SelectProvider是声明在方法上的,这个方法定义在Mapper对应的的interface上
// type:指定获取sql语句的指定类
// method:sql语句方法
@SelectProvider(type=xxx.class,method="xxx")
例1 参数带@Param或者多参
// 当mapper中传入的参数是使用@param 注解修饰,在xxxProvider类中必须使用Map对象接收参数
// 在超过一个参数的情况下,@SelectProvide方法必须接受Map<String, Object>做为参数。
@SelectProvider(type=BaseUserProvider.class,method="selectUserById")
public BaseUser selectById(@Param(value="id")Integer id);
// 可以直接使用 return "select * from base_user where id ="+para.get("id")
public String selectUserById(Map<String, Object> para){
return new SQL(){{
SELECT("*");
FROM("base_user");
WHERE("id="+para.get("id"));
}}.toString();
}
// 多个参数加入if判断
public String selectUserById(Map<String, Object> para){
return new SQL(){{
SELECT("*");
FROM("base_user");
WHERE("id="+para.get("id"));
if(StringUtils.isNotBlank((String)para.get("username"))){
WHERE("username="+para.get("username"));
}
}}.toString();
}
// 此时的sql写法在拼接sql中不需要在使用 and 进行连接 ,在where 方法中已拼入where 源码如下:
private static final String AND = ") \nAND (";
private static final String OR = ") \nOR (";
例2 空参或者一个参数不加@Param
// 接口
public interface UserMapper
{
@SelectProvider(type = SqlProvider.class, method = "selectUser")
@ResultMap("userMap")
public User getUser(long userId);
}
// 类
public class SqlProvider
{
public String selectUser(long userId)
{
return "select * from user where userId=" + userId;
}
}
参考优秀博客:
http://www.mybatis.cn/archives/709.html
https://blog.csdn.net/qq_36872046/article/details/80291939