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类中

这是一个简单的类,不继承任何父类。有两点需要注意:

1. 必须要有无参的构造函数;

2. 生成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";
 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值