springboot整合mybatis-plus,以及mybatis-plus入門使用
mybatis-plus是基於mybatis,相對於mybatis,他有許多特性是比較好用的,比如分頁查詢、表字段自動轉換為實體類屬性等,使用mybatis-plus與Spring Data JPA有點相似的地方,個人覺得mybatis-plus的分頁比JPA的分頁好用。其實在mybatis-plus官網上已經有很詳細的教程了,在這裡寫部落格也是為了自己能夠更好的整理思路。先上一下官網基於springboot教程地址:https://baomidou.oschina.io/mybatis-plus-doc/#/spring-boot
1.新增pom引用
maven的引用很簡單,官方已經給出starter,不需要我們考慮它的依賴關係了,此處使用的是2.3版本。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3</version>
</dependency>
2.配置
官方已經提供了基於springboot的配置,將其拷貝過來放在application.yml中即可使用,此處只是將官方部分的配置刪減過一些。其中column-underline: true特別好用,會自動將下劃線格式的表字段,轉換為以駝峰格式命名的屬性。
mybatis-plus: global-config: db-config: id-type: auto field-strategy: not_empty #駝峰下劃線轉換 column-underline: true #邏輯刪除配置 logic-delete-value: 0 logic-not-delete-value: 1 db-type: mysql refresh: false configuration: map-underscore-to-camel-case: true cache-enabled: false
3.使用
1.建立實體類,建立實體類與JPA特別相似,其中@TableName註解是為了指定此實體類對應資料庫的哪一張表;@TableId指定的是主鍵,type屬性指定的是該主鍵自增的方式,AUTO代表自增,UUID代表使用UUID增加主鍵;還有一個註解@TableFiled,此註解主要用在非主鍵實體屬性上,下面是官方給出的此註解所有屬性。
值 | 描述 |
---|---|
value | 欄位值(駝峰命名方式,該值可無) |
update | 預處理 set 欄位自定義注入 |
condition | 預處理 WHERE 實體條件自定義運算規則 |
el | 詳看註釋說明 |
exist | 是否為資料庫表字段( 預設 true 存在,false 不存在 ) |
strategy | 欄位驗證 ( 預設 非 null 判斷,檢視 com.baomidou.mybatisplus.enums.FieldStrategy ) |
fill | 欄位填充標記 ( FieldFill, 配合自動填充使用 ) |
生成一個實體類例項
@TableName("t_patrol_task")
public class PatrolTaskEntity {
@TableId(value = "id",type = IdType.AUTO)
private Integer id;
private Integer jobId;
Getter…
Setter….
}
2.建立mapper,與JPA有相像之處。使用@Mapper為了把mapper這個DAO交給Spring管理,且可以不再寫mapper對映檔案;繼承BaseMapper可以方便使用mybatis-plus方法,泛型需要寫對用的實體類。此處直接使用slelect * from,mybatis-plus會根據實體類自動駝峰轉下劃線對映到表的欄位中。
@Mapper
public interface PatrolTaskMapper extends BaseMapper<PatrolTaskEntity> {
@Select("select * from t_patrol_task where id = #{id} and deleted_at is null")
PatrolTaskEntity queryByIdAndDeletedAtIsNull(@Param(“id”) Integer id);
}
4.條件構造器
1.查詢單條資料,非主鍵查詢,只要在一個實體內寫入屬性,然後再用mybatis-plus自帶的selectOne()方法即可查詢(注意:查詢的限制條件必須此條資料是唯一的,不然查詢後會報錯)。個人覺得此種查詢使用不便,不如直接使用nativeSql進行查詢來的利索。
PatrolJobLogEntity jobLogEntity = new PatrolJobLogEntity();
jobLogEntity.setJobId(12);
jobLogEntity.setTaskFinished(30);
patrolJobLogMapper.selectOne(jobLogEntity);
2.查詢數量,含有拼接方式查詢。使用mybatis-plus條件查詢需要使用到EntityWrapper構造器,它能新增查詢的條件,如:.eq("job_id",13)表示查詢job_id=13的記錄,isNull("deleted_at")表示deleted_at必須為null(注意:此處查詢的條件是使用的是資料庫表中的欄位名稱)。
EntityWrapper<PatrolTaskEntity> wrapper = new EntityWrapper<>().eq("job_id",13).isNull("deleted_at");
List<PatrolTaskEntity> tasks = patrolTaskMapper.selectCount(wrapper);
3.查詢列表,與上面基本相同,只不過此處使用的是mybatis-plus的selectList()方法
EntityWrapper<PatrolTaskEntity> wrapper = new EntityWrapper<>().eq("job_id",13).isNull("deleted_at");
List<PatrolTaskEntity> tasks = patrolTaskMapper.selectList(wrapper);
拼接sql查詢方式:
查詢方式 |
說明 |
setSqlSelect |
設定 SELECT 查詢欄位 |
where |
WHERE 語句,拼接 + WHERE 條件 |
and |
AND 語句,拼接 + AND 欄位=值 |
andNew |
AND 語句,拼接 + AND (欄位=值) |
or |
OR 語句,拼接 + OR 欄位=值 |
orNew |
OR 語句,拼接 + OR (欄位=值) |
eq |
等於= |
allEq |
基於 map 內容等於= |
ne |
不等於<> |
gt |
大於> |
ge |
大於等於>= |
lt |
小於< |
le |
小於等於<= |
like |
模糊查詢 LIKE |
notLike |
模糊查詢 NOT LIKE |
in |
IN 查詢 |
notIn |
NOT IN 查詢 |
isNull |
NULL 值查詢 |
isNotNull |
IS NOT NULL |
groupBy |
分組 GROUP BY |
having |
HAVING 關鍵詞 |
orderBy |
排序 ORDER BY |
orderAsc |
ASC 排序 ORDER BY |
orderDesc |
DESC 排序 ORDER BY |
exists |
EXISTS 條件語句 |
notExists |
NOT EXISTS 條件語句 |
between |
BETWEEN 條件語句 |
notBetween |
NOT BETWEEN 條件語句 |
addFilter |
自由拼接 SQL |
last |
拼接在最後,例如:last("LIMIT 1") |
5.分頁
1.新增配置檔案,此處配置檔案表示開啟mybatis-plus分頁功能
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
2.寫查詢語句,此出的Pagination必須給出,不然無法完成分頁功能。
@Mapper
public interface BannerLogMapper extends BaseMapper<BannerLogEntity> {
@Select("select * from t_pub_banner_logs")
List<BannerLogEntity> queryLogByPage(Pagination page);
}
3.進行分頁查詢程式碼塊,只需要將要查詢的第幾頁也頁面大小寫入到Page物件中。然後進行查詢,查詢後分頁屬性(當前頁,總頁數、總條數), 是經過外掛自動回寫到傳入page物件中。
Page<BannerLogEntity> page = new Page<>(pageNo,pageSize);
List<BannerLogEntity> bannerLogs = bannerLogMapper.queryLogByPage(page);
page.getTotal();
page.getCurrent();
page.getPages();
6.其他
關於mybatis-plus其他功能,程式碼生成器、效能分析外掛、執行分析外掛、多資料來源處理等可以自行到官網檢視學習。