Mybatis-Plus學習.,簡化你的開發,提升開發效率.


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內


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM