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