1. 程式人生 > >Mybatis Plus 使用詳解

Mybatis Plus 使用詳解

需要 字段 操作 @param 支持 操作方法 delet sets string

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這個包裝類。

  1. 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 使用詳解