Mybatis @SelectProvider注解详解
@SelectProvider(type=xxxx.class,method=”xxxx”)
个人理解:
用自定义的provider类构造SQL语句
属性详解:
type 属性用于指定获取sql语句的指定类
method 属性用于指定类中要执行获取sql语句的方法
例1(单个参数):
mapper中
@SelectProvider(type=BaseUserProvider.class,method="selectUserById")
public BaseUser selectById(@Param(value="id")Integer id);
例1注意:
当mapper中传入的参数是使用@param 注解修饰,在xxxProvider类中必须使用Map对象接收参数。
BaseUserProvider类中
这是一个简单的类,不继承任何父类。有两点需要注意:
-
必须要有无参的构造函数;
-
生成SQL的方法必须是public的,返回值类型必须为String,可以为static。
public String selectUserById(Map<String, Object> para){
return new SQL(){{
SELECT("*");
FROM(“base_user”);
WHERE(“id=”+para.get(“id”));
}}.toString();
}
此时:以上代码是借助org.apache.ibatis.jdbc.SQL类 使用固定的select from where 格式,也可以直接使用return “select * from base_user where id =” +para.get(“id”); 来实现sql拼接
例2(多个参数并加入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 (";
Mybatis的@UpdateProvider注解的使用
@UpdateProvider(type = AppProvider.class, method = “updateApp”)
Integer updateApp(@Param(“appModel”) AppModel appModel);
type:生成sql语句的类,method:类中对应的方法。
public class AppProvider extends SQL {
private static final String TABLE_NAME = "t_application";
public String updateApp(@Param("appModel") AppModel appModel) {
return new SQL(){{
UPDATE(TABLE_NAME);
if (!StringUtils.isEmpty(appModel.getName())) {
SET("name = #{appModel.name,javaType=String,jdbcType=VARCHAR}");
}
if (!StringUtils.isEmpty(appModel.getPic())) {
SET("pic= #{appModel.pic,javaType=String,jdbcType=VARCHAR}");
}
if (!ObjectUtils.isEmpty(appModel.getIntroduce())) {
SET("type= #{appModel.type,javaType=Long,jdbcType=BIGINT}");
SET("type_name= #{appModel.typeName,javaType=String,jdbcType=VARCHAR}");
}
if (!StringUtils.isEmpty(appModel.getIntroduce())) {
SET("introduce= #{appModel.introduce,javaType=String,jdbcType=VARCHAR}");
}
WHERE("id = #{appModel.id,javaType=Long,jdbcType=BIGINT}" );
}}.toString();
}
}
UPDATE(TABLE_NAME):要更新的表名;
update table_name;
SET(“name = #{appModel.name,javaType=String,jdbcType=VARCHAR}”);
appModel.name:appModel类name字段的值;
javaType=String:java语言中的数据类型;
jdbcType=VARCHAR:数据库对应的数据类型;
“set name = appModel_name”
WHERE(“id = #{appModel.id,javaType=Long,jdbcType=BIGINT}” );
“where id = appModel_id”;