easy-mybatis
是一個對Mybatis
的增強框架(外掛)。在Spring
整合Mybatis
的基礎上,將專案開發中對資料庫的常用操作統一化。使用本框架可以很便捷的對資料庫進行操作,提高開發效率,減少機械行為。
框架初衷
這個框架的初衷是,減少Java程式設計師千篇一律的資料庫操作。
對於開發人員來說:
- 精力應該花費在業務邏輯上,而非機械式的「技術」上。
- 專案中減少無關痛癢的程式碼,從抽象的角度看實現。
- 各司其職,各勞其力,追求專案角度的服務流水線。
服務分離的時代
如今已很難看到單體架構的專案(感興趣的可以檢視我對架構演變的描述《淺談微服務》),目前的專案大都是通過RESTful
、MQ
、Socket
的方式(協定)進行資料傳輸。
這讓我開始質疑傳統JavaWeb
專案中的資料庫操作模式——即Model(DTO)
存在的意義。理論上,資料庫設計是不可能完全遵循檢視模型的,這就導致「正確」的做法是在專案中引入VO
,由多個DTO
來組裝。
那麼,為什麼不能用靈活的Map來替代呢?
對一個Map
的方法進行拓展,增加其對Json
的解析能力,那麼是不是就可以擺脫POJO
的各種麻煩組裝。
思考框架設計
我在思考如何設計這個框架的時候,被需要考慮的方方面面給阻擋住了。
因為一個資料庫框架需要考慮的東西實在太多了,比如:
- 事務機制
- 型別轉換
- 對談管理
···
思來想去,發現自己方向跑偏了,我只是希望統一資料庫操作的介面 + 擺脫Model,沒必要重新平地起牆,完全可以在一個現有的框架基礎上進行封裝。
那麼,對這個現有框架的選擇就尤為重要了。
現有框架的選擇
目前Java中主流的資料庫操作框架:
- Spring JDBC
- Spring Data JPA
- Mybatis
- Hibernate
選擇現有框架有一個原則——「統一資料庫操作的介面 + 擺脫Model」是對該框架的加強,而非變異;不能因為「統一資料庫操作的介面 + 擺脫Model」而無法使用原框架的部分功能。
「擺脫Model」這個特點,首先就要排除重度ORM
框架,也就是支援JPA
操作的資料庫——Spring Data JPA
、Hibernate
;原因很簡單,這兩個框架的強大之處恰恰就在它完全面向Model
操作。
剩下的就只有兩個框架了,Spring JDBC
和Mybatis
。其中,Spring JDBC
留給了開發人員大量的可操作空間,更加自由,但恰恰是這種自由使得它更加繁瑣。而Mybatis
是一個輕量ORM
框架,準確來說Mybatis
不能稱為ORM
框架,因為它並不是面向Model
運算元據庫,僅僅是將資料庫欄位與Model
欄位互相賦值,並沒有做到ORM
定義的關係對映。
抉擇
由以上各框架的特點,結合國內Java語言中資料庫操作框架的熱度,毫無疑問的選擇了Mybatis
。
考慮到SpringBoot
對Mybatis
優秀的支援級別,我決定基於mybatis-spring-boot-starter
開發這款框架,準備來說應該稱其為「外掛」。
框架特性
- 更便捷
摒棄傳統mybatis
的model
、xml
、dao
資料庫操作模式,避繁就簡,快速開發。
- 更高效
採用預編譯SQL
,拒絕執行期間反射生成SQL
,效能更高效。
- 無侵入
只是對Mybatis-Spring的增強外掛,對已有工程不做任何修改,仍可使用原生框架的功能,僅僅是簡化了開發階段對資料庫的操作。
- 統一操作介面
對資料庫的所有操作共用一個介面,降低使用門檻,輕鬆運算元據庫。
- 統一操作物件
使用JsonObject
為資料物件,提供一系列操作方法,方便從持久化物件組裝為檢視物件。
- 易上手
整個框架只提供了一個介面、一個註解、兩個物件,僅僅一行設定便可完成對資料庫進行常用操作。
- ...
安利
-
在
mybatis-spring-boot
環境下,使用該框架(外掛),可以減少傳統Mybatis
使用中對model
、xml
、dao
的機械式開發。 -
所有的資料庫操作均使用
MapperRepository
介面,通過註解@Magic("xxx")
標記介面的資料表歸屬,即可直接使用。 -
該框架(外掛)不妨礙同時使用傳統
Mybatis
中model
、xml
、dao
的資料庫開發方式。
快速上手
安裝
- 安裝
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
資料庫設定請參考設定說明
- 設定
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
的設定,這裡不多贅述,更多移步。
- 設定
easy-mybatis
支援的表名(例子)
easy-mybatis:
table-names: teacher, student
這裡的table-names
設定,表示需要easy-mybatis
框架支援的資料表名,多個表名使用逗號隔開。
即可使用easy-mybatis
框架操作teacher
和student
兩個資料表,如果需要支援其他資料表,需要在此設定。
運算元據庫(例子)
@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的詳細介紹::
:
: