Eclipsejava
java8mysql
SpringBoot + mavengit
這裏只是配置運行一下簡單的Mybatis-plus項目,試驗的對象只有一張表,完成對齊的CURD.github
初始化一個SpringBoot或者複製SpringBoot項目,初始化的時候能夠去springBoot提供的網址進行初始化 Spring Initializrspring
<!-- 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>
生成Entity,基本的Entity和Mybatis的一致,有個主鍵的註解能夠注意下,影響不大.sql
Mapper裏面不須要添加其餘內容,新建一個空的class,而後繼承BaseMapper
public interface ByReconcileDepartMapper extends BaseMapper<ByReconcileDepart>{}
Service也不須要添加,繼承IService
public interface IByReconcileDepartService extends IService<ByReconcileDepart> {}
ServiceImpl也不須要添加,須要繼承ServiceImpl,實現IByReconcileDepartService,註解爲@Servicemybatis
public class ByReconcileDepartServiceImpl extends ServiceImpl<ByReconcileDepartMapper, ByReconcileDepart> implements IByReconcileDepartService {}
到這裏一個表的對應的實體,service,mapper已經構建完成,仍是很是方便的,代碼也看起來挺簡潔.app
這裏只介紹一下經常使用的幾個方法,詳細的介紹須要自行去官網查看.
由於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); }
之前使用的是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()); }
<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包方法爲解壓便可.
官網的代碼複製下來更改一下數據庫鏈接,就能夠直接生成看一下結果,正式用的話須要更改一下包名以及公共類型的代碼.
這裏全都是用的默認提供的生成規則,若是須要自定義模板的話本身去官網查看
同時須要本身手動添加數據庫驅動.
多層or/and嵌套推薦手寫sql,Mybatis-plus只有在簡單查詢中好用,複雜查詢推薦手寫sql,便於之後的修改.
@Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); }
僅支持 updateById(id) 與 update(entity, wrapper) 方法
在 update(entity, wrapper) 方法下, wrapper 不能複用!!!
newVersion 會回寫到 entity 中
若是樂觀鎖衝突的話不會報錯,會返回0,這樣就不如Hibernate好,Hibernate會報出一個指定的錯誤,這裏只能根據返回的來作判斷,這樣就不能判斷是樂觀鎖衝突返回的0,仍是由於不符合條件不能更新返回的0.
樂觀鎖衝突出現後須要進行重試,從新獲取對象,而後從新更新.