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