EasyMybatis v1.0.0 釋出——更便捷的 Mybatis 外掛

2022-01-11 09:00:43

easy-mybatis是一個對Mybatis的增強框架(外掛)。在Spring整合Mybatis的基礎上,將專案開發中對資料庫的常用操作統一化。使用本框架可以很便捷的對資料庫進行操作,提高開發效率,減少機械行為。


框架初衷

這個框架的初衷是,減少Java程式設計師千篇一律的資料庫操作。

對於開發人員來說:

  • 精力應該花費在業務邏輯上,而非機械式的「技術」上。
  • 專案中減少無關痛癢的程式碼,從抽象的角度看實現。
  • 各司其職,各勞其力,追求專案角度的服務流水線。

服務分離的時代

如今已很難看到單體架構的專案(感興趣的可以檢視我對架構演變的描述《淺談微服務》),目前的專案大都是通過RESTfulMQSocket的方式(協定)進行資料傳輸。

這讓我開始質疑傳統JavaWeb專案中的資料庫操作模式——即Model(DTO)存在的意義。理論上,資料庫設計是不可能完全遵循檢視模型的,這就導致「正確」的做法是在專案中引入VO,由多個DTO來組裝。

那麼,為什麼不能用靈活的Map來替代呢?

對一個Map的方法進行拓展,增加其對Json的解析能力,那麼是不是就可以擺脫POJO的各種麻煩組裝。

思考框架設計

我在思考如何設計這個框架的時候,被需要考慮的方方面面給阻擋住了。

因為一個資料庫框架需要考慮的東西實在太多了,比如:

  1. 事務機制
  2. 型別轉換
  3. 對談管理

···

思來想去,發現自己方向跑偏了,我只是希望統一資料庫操作的介面 + 擺脫Model,沒必要重新平地起牆,完全可以在一個現有的框架基礎上進行封裝。

那麼,對這個現有框架的選擇就尤為重要了。

現有框架的選擇

目前Java中主流的資料庫操作框架:

  • Spring JDBC
  • Spring Data JPA
  • Mybatis
  • Hibernate

選擇現有框架有一個原則——「統一資料庫操作的介面 + 擺脫Model」是對該框架的加強,而非變異;不能因為「統一資料庫操作的介面 + 擺脫Model」而無法使用原框架的部分功能。

擺脫Model」這個特點,首先就要排除重度ORM框架,也就是支援JPA操作的資料庫——Spring Data JPAHibernate;原因很簡單,這兩個框架的強大之處恰恰就在它完全面向Model操作。

剩下的就只有兩個框架了,Spring JDBCMybatis。其中,Spring JDBC留給了開發人員大量的可操作空間,更加自由,但恰恰是這種自由使得它更加繁瑣。而Mybatis是一個輕量ORM框架,準確來說Mybatis不能稱為ORM框架,因為它並不是面向Model運算元據庫,僅僅是將資料庫欄位與Model欄位互相賦值,並沒有做到ORM定義的關係對映。

抉擇

由以上各框架的特點,結合國內Java語言中資料庫操作框架的熱度,毫無疑問的選擇了Mybatis

考慮到SpringBootMybatis優秀的支援級別,我決定基於mybatis-spring-boot-starter開發這款框架,準備來說應該稱其為「外掛」。

框架特性

  • 更便捷

摒棄傳統mybatismodelxmldao資料庫操作模式,避繁就簡,快速開發。

  • 更高效

採用預編譯SQL,拒絕執行期間反射生成SQL,效能更高效。

  • 無侵入

只是對Mybatis-Spring的增強外掛,對已有工程不做任何修改,仍可使用原生框架的功能,僅僅是簡化了開發階段對資料庫的操作。

  • 統一操作介面

對資料庫的所有操作共用一個介面,降低使用門檻,輕鬆運算元據庫。

  • 統一操作物件

使用JsonObject為資料物件,提供一系列操作方法,方便從持久化物件組裝為檢視物件。

  • 易上手

整個框架只提供了一個介面、一個註解、兩個物件,僅僅一行設定便可完成對資料庫進行常用操作。

  • ...

安利

  • mybatis-spring-boot環境下,使用該框架(外掛),可以減少傳統Mybatis使用中對modelxmldao的機械式開發。

  • 所有的資料庫操作均使用MapperRepository介面,通過註解@Magic("xxx")標記介面的資料表歸屬,即可直接使用。

  • 該框架(外掛)不妨礙同時使用傳統Mybatismodelxmldao的資料庫開發方式。

快速上手

安裝

  • 安裝mybatis-spring-boot環境

mybatis-spring-boot的Maven依賴

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>${spring-boot.version}</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot.version}</version>
        </dependency>
    </dependencies>

mybatis-spring-boot的Gradle依賴

    plugins {
    id 'org.springframework.boot' version '${springBootVersion}'
    id 'io.spring.dependency-management' version '${springManagementVersion}'
    id 'java'
    }

    dependencies {
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:${mybatisSpringVersion}'
    }
  • 安裝本框架(外掛)

Maven依賴引入


<!-- https://mvnrepository.com/artifact/top.zuoyu.mybatis/easy-mybatis-spring-boot-starter -->
<dependency>
    <groupId>top.zuoyu.mybatis</groupId>
    <artifactId>easy-mybatis-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

Gradle依賴引入


// https://mvnrepository.com/artifact/top.zuoyu.mybatis/easy-mybatis-spring-boot-starter
implementation 'top.zuoyu.mybatis:easy-mybatis-spring-boot-starter:1.0.0'

設定

這裡以MySQL資料庫為例,Oracle資料庫設定請參考設定說明

  1. 設定spring-boot-jdbc資料庫

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://172.0.0.1:3306/xxxx
    username: xxxx
    password: xxxx

關於springBoot的設定,這裡不多贅述,更多移步。

  1. 設定easy-mybatis支援的表名(例子)

easy-mybatis:
  table-names: teacher, student

這裡的table-names設定,表示需要easy-mybatis框架支援的資料表名,多個表名使用逗號隔開。

即可使用easy-mybatis框架操作teacherstudent兩個資料表,如果需要支援其他資料表,需要在此設定

運算元據庫(例子)


@SpringBootTest
class DemoApplicationTests {

    // 表示該介面用來操作名稱為'teacher'的資料表
    @Magic("teacher")
    private MapperRepository teacherRepository;

    // 表示該介面用來操作名稱為'student'的資料表
    @Magic("student")
    private MapperRepository studentRepository;


    // 查詢teacher表下所有資料
    @Test
    void teacherTest() {
        teachertRepository.selectList().forEach(System.out::println);
    }

    // 查詢student表下符合特定條件的資料
    @Test
    void studentTest() {
        studentRepository.selectListByExample(
          new JsonObject().put("birthday", "2009/12/12 12:12:12")
          ).forEach(System.out::println);
    }

}

使用MapperRepository介面對資料庫進行操作,需要使用@Magic("表名稱")標記該介面的資料表歸屬。

在本例中,@Magic("teacher")表示該MapperRepository"teacher"資料表的操作介面,可以通過teacherRepository呼叫一系列方法完成對"teacher"資料表的操作。


相關連結

easy-mybatis的詳細介紹::

Gitee地址https://gitee.com/zuoyuip/easy-mybatis

展開閱讀全文