Mybatis Plus 使用詳解
Mybatis Plus 是Mybatis的增強插件,對數據庫操作Mybatis Plus提供了抽象層次比Mybatis更高的操作方法。
Wrapper是Mybatis Plus裏拼接sql的包裝類。具體的各種查詢功能可以查看Mybatis Plus 條件構造器官方文檔
一、自定義查詢字段
EntityWrapper 的setSqlSelect可以定義需要查詢的庫表字段。但是很多時候我們查詢的數據可能來自不同的表,我們這時候可能需要用到子查詢,那麽這時候該怎麽使用EntityWrapper 呢?
答案是直接寫在setSqlSelect裏面。例
Wrapper<Res> ew = new EntityWrapper<>(); ew.eq("deleted", 0); ew.setSqlSelect("*", "(select name from res_type where id=res_type_id) as res_type_name", "(select name from probe where id=probe_id) as probe_name");
二、條件查詢
一個很常見的場景是查詢某字段的時候如果值不為空則查詢,否則不查詢。Mybatis Plus的拼接sql方法有一個條件拼接。
ew.eq(boolean condition,String column,Object params)
public List<Person> findPersonList(String age,String gender){ Wrapper<Res> ew = new EntityWrapper<>(); ew.eq(!"".equals(gender),"gender", 0); ew.eq(!"".equals(age),"age",age); }
條件拼接sql的源碼如下:
public Wrapper<T> and(boolean condition, String sqlAnd, Object... params) {
if (condition) {
((SqlPlus)this.sql.AND()).WHERE(this.formatSql(sqlAnd, params));
}
return this;
}
我們可以看到是只有條件為true的情況下才拼接sql,否則是不會拼接的。絕大部分Mybatis Plus的操作都支持條件的查詢。這樣可以節省大量的代碼。
三、分頁查詢
Mybatis Plus分頁查詢的重點在於Page這個包裝類。
- Wrapper查詢方式分頁
在Controller
層我們先構建一個Page包裝類,這個包裝類的類型應該跟你需要分頁的數據類型是一致。例如我們希望返回一個List<Map<String,Object>>
格式的數據,我們需要構建一個Page<Map<String,Object>>
的page類。
/* 設置頁大小,當前頁,排序字段,排序方式是否是asc */
Page<Map<String, Object>> page = new Page<>(currentPage, pageSize, "update_time" , false);
Map<String, Object> condition = Maps.newHashMap();
condition.put("age", 23);
/* 如果有查詢參數,我們可以放到condition裏面去,然後在Service裏面獲取條件再進行查詢*/
page.setCondition(condition);
/* 把分頁查詢的數據放入records,Mybatis Plus會自動查詢出總數據量*/
page.setRecords(this.dataService.findPageData(page));
先new一個page包裝類。如果有查詢參數,我們可以放到condition裏面去,然後在Service裏面獲取條件再進行查詢。註意,把分頁查詢的數據放入records,Mybatis Plus會自動查詢出總數據量,無需再用sql查詢總個數之後setTotal。具體的查詢我們可以放在Service裏面編寫。
public List<Map<String, Object>> findPageData(Page<Map<String, Object>> page) {
Wrapper<Res> ew = new EntityWrapper<>();
ew.ge("age", 23);
ew.eq("gender",1)
return baseMapper.selectMapsPage(page, ew);
}
2.自定義sql方式
如果你的sql語句比較特殊,需要自己寫sql的話。你的分頁可以寫到mapper裏,或者mapping.xml裏面。
public interface PersonMapper{
@Select("select * from person where gender=${gender} oder by age")
List<Person> selectPersonList(Pagination page, @Param("gender") String gender);
}
Service裏面直接調用mapper裏的方法,如果條件比較復雜,則使用page中的condition來獲取字段。
public Page<Person> getTestData(Page<Person> page,String gender){
return page.setRecords(this.baseMapper.selectPersonList(page,gender));
}
Controller裏調用Service,相比於上一種方法這個方法簡化了Controller層的部分代碼。
/* 設置頁大小,當前頁,排序字段,排序方式是否是asc */
Page<Person> page = new Page<>(currentPage, pageSize);
page.setCondition(condition);
return this.dataService.getTestData(page,"1");
Mybatis Plus 使用詳解