Mybatis-Plus學習.,簡化你的開發,提升開發效率.
- Mybatis-Plus學習以及實踐
- 簡介
- 參考網址
- 開發環境
- 開始開發
- 配置pom.xml
- Dao/Service/Entity
- 基本方法
- 查詢類
- 更新類 - 分頁外掛
- pom.xml
- 程式碼示例 - 生成程式碼
- pom.xml
- 程式碼 - 樂觀鎖外掛
- 配置
- 說明 - Demo
Mybatis-Plus學習以及實踐
簡介
- 即對Mybatis進行了增強,結合了Hiberante的型別,封裝了一些單表的操作,可以對進行單表的操作不需要寫一些sql,直接上手開發,加快了開發效率,不過同時也會造成訪問資料庫的程式碼混雜的情況,有利有弊.
參考網址
- 官網文件,官方文件.
開發環境
Eclipse
java8
SpringBoot + maven
開始開發
這裡只是配置執行一下簡單的Mybatis-plus專案,試驗的物件只有一張表,完成對齊的CURD.
初始化一個SpringBoot或者複製SpringBoot專案,初始化的時候可以去springBoot提供的網址進行初始化 Spring Initializr
配置pom.xml
<!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> <scope>runtime</scope> </dependency>
Dao/Service/Entity
生成Entity,基本的Entity和Mybatis的一致,有個主鍵的註解可以注意下,影響不大.
Mapper裡面不需要新增其他內容,新建一個空的class,然後繼承BaseMapper
public interface ByReconcileDepartMapper extends BaseMapper<ByReconcileDepart>{}
Service也不需要新增,繼承IService
public interface IByReconcileDepartService extends IService<ByReconcileDepart> {}
ServiceImpl也不需要新增,需要繼承ServiceImpl,實現IByReconcileDepartService,註解為@Service
public class ByReconcileDepartServiceImpl extends ServiceImpl<ByReconcileDepartMapper, ByReconcileDepart> implements IByReconcileDepartService {}
到這裡一個表的對應的實體,service,mapper已經構建完成,還是非常方便的,程式碼也看起來挺簡潔.
基本方法
這裡只介紹一下常用的幾個方法,詳細的介紹需要自行去官網檢視.
因為Mapper和Service繼承的父類中已經預設實現了基礎方法,基本包含了單表的CURD,這裡直接使用,不需要新增其他程式碼.
查詢類
提供了條件構造器QueryWrapper,即條件構造,基本的使用方法為allEq,eq等,使用方式基本為先構造一個條件構造器Wrapper,然後賦給其條件,但條件為key-value,多條件為Map,List.然後將其當做引數傳遞給指定的查詢方法.
多個條件查詢
@Test public void listByMap() { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("scenes_name", "大型自助機"); Collection<ByReconcileDepart> listByMap = service.listByMap(map); System.out.println(listByMap); }
得到單個,注意一下第二個引數影響如果查詢出來多個會不會報錯的問題
@Test public void getOne() { HashMap<String,Object> map = new HashMap<String, Object>(); map.put("scenes_name", "大型自助機"); map.put("platform_mch_id","1540492611"); map.put("seq",null); System.out.println(map); QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>(); // 第二個引數為是否關注map中為null的建, 預設為關注,即會新增seq is null, false 會剔除掉為null的鍵 q.allEq(map,false); // 第二個引數為查詢多個是否會報錯, 預設為true 會報錯, 可手動指定為false,不會報錯並且會返回一個 ByReconcileDepart one = service.getOne(q,false); System.out.println(one); }
Group By
@Test public void listGroupBy() { QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>(); q.eq("scenes_name", "大型自助機"); q.groupBy("platform_mch_id"); List<ByReconcileDepart> list = service.list(q); System.out.println(list); }
Order By
@Test public void listOrderBy() { QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>(); q.eq("scenes_name", "大型自助機"); q.orderByDesc("scenes_name","platform_mch_id"); List<ByReconcileDepart> list = service.list(q); System.out.println(list); }
Or,新增Or條件,預設兩個條件是用and連線, 只有手動呼叫or才會用or,例如下面如果不用條件則是and 呼叫了則是or
@Test public void listOr() { QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>(); // 這裡注意,預設兩個條件是用and連線, 只有手動呼叫or才會用or,例如下面如果不用條件則是and 呼叫了則是or q.eq("scenes_name", "大型自助機"); q.or(); q.eq("platform_mch_id", "1540492611"); q.orderByDesc("scenes_name","platform_mch_id"); List<ByReconcileDepart> list = service.list(q); System.out.println(list); }
Or巢狀, 1-2層巢狀可以使用,如果多層巢狀的話不推薦使用,推薦使用手寫sql,如果使用的話會增加後期的維護工作量.
@Test public void listOrAnd() { QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>(); // 巢狀查詢, where ( scenes_name = ? OR ( ( scenes_name = ? AND scenes_name = ? ) ) ) q.eq("scenes_name", "大型自助機"); q.or(i->i.eq("scenes_name", "1").eq("scenes_name", "大型")); List<ByReconcileDepart> list = service.list(q); System.out.println(list); }
And巢狀
@Test public void listOrAnd2() { QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>(); // 巢狀查詢, where ( scenes_name = ? AND ( ( scenes_name = ? AND scenes_name = ? ) ) ) q.eq("scenes_name", "大型自助機"); q.and(i->i.eq("scenes_name", "1").eq("scenes_name", "大型")); List<ByReconcileDepart> list = service.list(q); System.out.println(list); }
apply 手動新增Where條件
@Test public void listapply() { QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>(); // 手動拼接sql條件, 有兩種形式, 一種為直接寫死sql,一種使用佔位符, 後面為可變引數 apply(String applySql, Object... params) q.apply("seq = 5"); List<ByReconcileDepart> list = service.list(q); System.out.println(list); }
更新類
其中還提供了儲存,刪除介面,其使用方法比較簡單,可以根據官網或者自己點進去程式碼檢視即可,下面只介紹一下通過UpdateWrapper來進行更新的方式.
提供了條件構造器UpdateWrapper,其基本使用方法和QueryWrapper一致,不過添加了Set,即設定需要更新的欄位
@Test public void updateWrapper() { // set為設定update set * 的內容,設定where後面的內容和條件選擇器一致 UpdateWrapper<ByReconcileDepart> w = new UpdateWrapper<ByReconcileDepart>(); w.eq("seq", 5); w.set("organization_code", "123"); w.set("omg", "123"); boolean update = service.update(w); System.out.println(update); }
分頁外掛
pom.xml
以前使用的是pagehelper,不過直接引用的話會有jar包衝突,需要剔除一下jar即可.
<!-- pagehelper 解決掉jar包衝突 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> </exclusions> </dependency>
程式碼示例
@Test
public void listPage() {
QueryWrapper<ByReconcileDepart> q = new QueryWrapper<ByReconcileDepart>();
q.eq("scenes_name", "大型自助機");
// 可以整合pagehandler, pom檔案注意剔除, getTotal 獲取總條數, 注意配置檔案的配置方式
Page<ByReconcileDepart> startPage = PageHelper.startPage(5, 3);
List<ByReconcileDepart> list = service.list(q);
long total = startPage.getTotal();
System.out.println(total);
System.out.println(list.size());
}
生成程式碼
pom.xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<!-- 預設模板pom -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
注意pom.xml中新增對應的引擎引用
同時需要手動將 mybatis-plus-generator jar包中的模板檔案copy到自己的專案中,jar包中的模板檔案再resource/template中,開啟jar包方法為解壓即可.
程式碼
官網的程式碼複製下來更改一下資料庫連線,就可以直接生成看一下結果,正式用的話需要更改一下包名以及公共型別的程式碼.
這裡全都是用的預設提供的生成規則,如果需要自定義模板的話自己去官網檢視
同時需要自己手動新增資料庫驅動.
- 在這一步遇到了一個報錯,The server time zone value,即JDBC時區的問題,引起的原因是Mysql驅動的版本過高,解決辦法為在資料庫連線地址後面新增serverTimezone=GMT%2B8,或者降低版本(N多辦法中的其中兩個).
多層or/and巢狀推薦手寫sql,Mybatis-plus只有在簡單查詢中好用,複雜查詢推薦手寫sql,便於以後的修改.
樂觀鎖外掛
- 原生的Mybatis如果需要啟動樂觀鎖的話需要手動再sql中實現,現在提供了內建的控制方法. 這樣的話還是比較好用的,雖然不如Hinerbate那樣只能,還是能解決一些方法.
配置
- 新增配置Bean
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); }
- 對應的欄位新增 @Version 註解
說明
僅支援 updateById(id) 與 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能複用!!!
newVersion 會回寫到 entity 中
如果樂觀鎖衝突的話不會報錯,會返回0,這樣就不如Hibernate好,Hibernate會報出一個指定的錯誤,這裡只能根據返回的來做判斷,這樣就不能判斷是樂觀鎖衝突返回的0,還是因為不符合條件不能更新返回的0.
樂觀鎖衝突出現後需要進行重試,重新獲取物件,然後重新更新.
Demo
- 自己的學習Demo放到demo-github,有需要的可以去看下,具體的使用程式碼再Test內