若用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