mybatis3 中 @Provider 的使用方式

 

若用MyBatis注解方式写sql,又想要XML写法的判断入参拼接条件,可以通过@SelectProvider方式实现。

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

新建Provider

public class RateProvider {
    private final String table_name = "rate_finish";

    public String getFinishRate(Map<String, Object> para) {
        String sql = "SELECT create_at FROM rate_finish WHERE 1=1 ";
        if (para.get("deviceType") != null ) {
            sql += "AND device_type = " + para.get("deviceType");
        }       
        sql += "ORDER BY homework_type";
        return sql;
    }
}

这里的 para 可以通过 key 方式或者 index 方式获取对应参数。

新建Entity

public class RateFinish extends AbstractModel {

    private int id;
    private String deviceType;
    private String level;
    private String finishCount;
    private String count;
    private String homeworkType;
    private String createAt;

编写 Mapper 接口,使用注解

    @SelectProvider(type = RateProvider.class, method = "getFinishRate")
    @Results({
            @Result(property = "homeworkType", column = "homework_type"),
            @Result(property = "deviceType", column = "device_type"),
            @Result(property = "level", column = "level"),
            @Result(property = "finishCount", column = "finish_count"),
            @Result(property = "count", column = "count"),
            @Result(property = "createAt", column = "create_at")
    })
    List<RateFinish> getFinishRate(
            @Param("deviceType") String deviceType;

说明:

注解中的参数:

    type参数指定的Class类,必须要能够通过无参的构造函数来初始化;

    method参数指定的方法,必须是public的,返回值必须为String,可以为static。

例二

 @ResultMap注解用于从查询结果集RecordSet中取数据然后拼装实体bean。

public interface UserMapper {
     @SelectProvider(type = SqlProvider.class, method = "selectUser")
     @ResultMap("userMap")
     public User getUser(long userId);
}
public class SqlProvider {

    public String selectUser(long userId){
         SELECT("id, name, email");
          FROM("USER");
          WHERE("ID = #{userId}");

    }
}
public class SqlProvider {
    public String deleteUser(int id) {
        return new SQL() {
            {
                DELETE_FROM("USER");
                WHERE("ID= #{id}");
            }
        }.toString();
    }
}

 上例中定义了一个 Mapper 接口,其中定义了一个 getUser 方法,这个方法根据用户 id 来获取用户信息,并返回相应的 User。而对应的 SQL 语句则写在 SqlProvider 类中。

例三

1)一个参数的@SelectProvide方法
若在getUser方法中,userId使用了@Param注解,那么selectUser方法须以Map<String, Object>为参数:
UserMapper.java:

@SelectProvider(type = SqlProvider.class, method = "selectUser2")
@ResultMap("userMap")
public User getUser(@Param("userId") long userId);

SqlProvider.java:

public String selectUser(Map<String, Object> para) {
    return "select * from user where userId=" + para.get("userId");
}

2)多参数的@SelectProvide方法
以 Map<String, Object> 为参数,
若有 @Param注解,则参数在 Map中以 @Param的值为 key,如下例中的 userId;
若参数未使用 @Param注解,则参数在 Map中以参数的顺序为 key,如下例中的 password:

UserMapper.java:

 @SelectProvider(type = SqlProvider.class, method = "selectUserCheck")
 @ResultMap("userMap")
 public User getUserCheck(@Param("userId") long Id, String password);

SqlProvider.java:

public String selectUserCheck(Map<String, Object> para) {
      return "select * from user where userId=" +
              para.get("userId") + " and password='" + para.get("1") + "'";
}

 

注意:在Mapper接口和@SelectProvide方法类中,不要使用重载,也就是说,不要使用方法名相同参数不同的方法 。

 

转自:

https://my.oschina.net/u/1000241/blog/1608635?nocache=1541480270547

http://www.cnblogs.com/JoeyWong/p/9457118.html

https://www.cnblogs.com/he-px/p/7134524.html

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值