SpringBoot中MyBatis-Flex的集成和使用實現(xiàn)
一、MyBatis-Flex 是什么?
MyBatis-Flex是一個基于MyBatis的數(shù)據(jù)訪問框架,專門為Flex應(yīng)用程序而設(shè)計的。它提供了一種靈活而高效的方式來處理Flex應(yīng)用程序中的數(shù)據(jù)訪問,可以輕松地連接到各種數(shù)據(jù)源,并提供了一些方便的工具和功能,包括對象關(guān)系映射(ORM)、動態(tài)查詢、分頁、事務(wù)處理等等。它的主要目的是簡化數(shù)據(jù)訪問的過程,使得開發(fā)人員可以更加專注于業(yè)務(wù)邏輯的開發(fā),而不是一些瑣碎的數(shù)據(jù)訪問細(xì)節(jié)。
總而言之,MyBatis-Flex 能夠極大地提高我們的開發(fā)效率和開發(fā)體驗,讓我們有更多的時間專注于自己的事情。
二、特征?
1、輕量型
- 輕依賴:除了 MyBatis,沒有任何第三方依賴輕依賴、沒有任何攔截器
- 輕實現(xiàn):原理是通過 SqlProvider 的方式實現(xiàn)
- 輕運行:沒有任何的 Sql 解析,帶來了這么幾個好處:1、極高的性能;2、方便對代碼進(jìn)行跟蹤和調(diào)試; 3、更高的把控性
2、使用靈活
- 支持 Entity 的增刪改查、以及分頁查詢
- MyBatis-Flex 提供了 Db + Row^靈活 工具,可以無需實體類對數(shù)據(jù)庫進(jìn)行增刪改查以及分頁查詢
- MyBatis-Flex 內(nèi)置的 QueryWrapper^靈活 可以輕易的幫助我們實現(xiàn)多表查詢、子查詢和鏈接查詢等常見的 SQL 查詢場景
3、功能強大
- 支持任意關(guān)系型數(shù)據(jù)庫,還可以通過方言持續(xù)擴展
- 支持多主鍵,邏輯刪除、數(shù)據(jù)脫敏、數(shù)據(jù)填充和樂觀鎖配置等
三、MyBatis Flex的使用
1、創(chuàng)建數(shù)據(jù)庫表
創(chuàng)建sql如下:
CREATE TABLE IF NOT EXISTS `tb_account`
(
`id` INTEGER PRIMARY KEY auto_increment,
`user_name` VARCHAR(100),
`age` INTEGER,
`birthday` DATETIME
);
INSERT INTO tb_account(id, user_name, age, birthday)
VALUES (1, '張三', 18, '2020-01-11'),
(2, '李四', 19, '2021-03-21');2、創(chuàng)建 Spring Boot 項目,添加 依賴
可以使用 Spring Initializer 快速初始化一個 Spring Boot 工程。
需要添加的 Maven 主要依賴示例:
pom.xml配置如下:
<dependencies>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<!-- for test only -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>3、對 Spring Boot 項目進(jìn)行配置
在 application.yml 中配置數(shù)據(jù)源:
# DataSource Config
spring:
datasource:
url: jdbc:mysql://localhost:3306/flex_test
username: root
password: 12345678在 Spring Boot 啟動類中添加 @MapperScan 注解,掃描 Mapper 文件夾:
@SpringBootApplication
@MapperScan("com.mybatisflex.test.mapper")
public class MybatisFlexTestApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisFlexTestApplication.class, args);
}
}4、編寫實體類和 Mapper 接口
這里使用了 Lombok 注解來簡化代碼,類代碼如下:
@Data
@Table("tb_account")
public class Account {
@Id(keyType = KeyType.Auto)
private Long id;
private String userName;
private Integer age;
private Date birthday;
}- 使用
@Table("tb_account")設(shè)置實體類與表名的映射關(guān)系 - 使用
@Id(keyType = KeyType.Auto)標(biāo)識主鍵為自增
Mapper 接口繼承 BaseMapper 接口:
public interface AccountMapper extends BaseMapper<Account> {
}這部分也可以使用 MyBatis-Flex 的代碼生成器來生,功能非常強大的。詳情進(jìn)入:代碼生成器章節(jié) 了解。
5、開始使用
添加測試類,進(jìn)行功能測試:
import static com.mybatisflex.test.entity.table.AccountTableDef.ACCOUNT;
@SpringBootTest
class MybatisFlexTestApplicationTests {
@Autowired
private AccountMapper accountMapper;
@Test
void contextLoads() {
QueryWrapper queryWrapper = QueryWrapper.create()
.select()
.where(ACCOUNT.AGE.eq(18));
Account account = accountMapper.selectOneByQuery(queryWrapper);
System.out.println(account);
}
}控制臺輸出:
Account(id=1, userName=張三, age=18, birthday=Sat Jan 11 00:00:00 CST 2020)
以上的 示例 中, ACCOUNT 為 MyBatis-Flex 通過 APT 自動生成,只需通過靜態(tài)導(dǎo)入即可,無需手動編碼。
點擊查看更多APT文檔 APT 文檔。
若覺得 APT 使用不習(xí)慣,也可以使用代碼生成器來生成。點擊 代碼生成器文檔 了解。
四、同類框架「功能」對比
MyBatis-Flex 主要是和 MyBatis-Plus 與 Fluent-MyBatis 對比,內(nèi)容來源其官網(wǎng)、git 或者 網(wǎng)絡(luò)文章,若有錯誤歡迎糾正。
- MyBatis-Plus:老牌的 MyBatis 增強框架,開源于 2016 年。
- Fluent-MyBatis:阿里云開發(fā)的 MyBatis 增強框架(來自于阿里云·云效產(chǎn)品團隊)
功能對比:
| 功能或特點 | MyBatis-Flex | MyBatis-Plus | Fluent-MyBatis |
|---|---|---|---|
| 對 entity 的基本增刪改查 | ? | ? | ? |
| 分頁查詢 | ? | ? | ? |
| 分頁查詢之總量緩存 | ? | ? | ? |
| 分頁查詢無 SQL 解析設(shè)計(更輕量,及更高性能) | ? | ? | ? |
| 多表查詢: from 多張表 | ? | ? | ? |
| 多表查詢: left join、inner join 等等 | ? | ? | ? |
| 多表查詢: union,union all | ? | ? | ? |
| 單主鍵配置 | ? | ? | ? |
| 多種 id 生成策略 | ? | ? | ? |
| 支持多主鍵、復(fù)合主鍵 | ? | ? | ? |
| 字段的 typeHandler 配置 | ? | ? | ? |
| 除了 MyBatis,無其他第三方依賴(更輕量) | ? | ? | ? |
| QueryWrapper 是否支持在微服務(wù)項目下進(jìn)行 RPC 傳輸 | ? | ? | 未知 |
| 邏輯刪除 | ? | ? | ? |
| 樂觀鎖 | ? | ? | ? |
| SQL 審計 | ? | ? | ? |
| 數(shù)據(jù)填充 | ? | ? | ? |
| 數(shù)據(jù)脫敏 | ? | ?? (收費) | ? |
| 字段權(quán)限 | ? | ?? (收費) | ? |
| 字段加密 | ? | ?? (收費) | ? |
| 字典回寫 | ? | ?? (收費) | ? |
| Db + Row | ? | ? | ? |
| Entity 監(jiān)聽 | ? | ? | ? |
| 多數(shù)據(jù)源支持 | ? | 借助其他框架或收費 | ? |
多數(shù)據(jù)源是否支持 Spring 的事務(wù)管理,比如 @Transactional 和 TransactionTemplate 等 | ? | ? | ? |
| 多數(shù)據(jù)源是否支持 "非Spring" 項目 | ? | ? | ? |
| 多租戶 | ? | ? | ? |
| 動態(tài)表名 | ? | ? | ? |
| 動態(tài) Schema | ? | ? | ? |
以上內(nèi)容來自第三方相關(guān)產(chǎn)品的官方文檔或第三方平臺,若有錯誤,歡迎糾正。
五、同類框架「性能」對比
本文主要是展示了 MyBatis-Flex 和 Mybaits-Plus 的「性能」對比。Mybaits-Plus 是一個非常優(yōu)秀 Mybaits 增強框架, 其開源于 2016 年,有很多的成功案例。
測試方法:
使用 h2 數(shù)據(jù)庫,在初始化的時候分別為 mybatis-flex 和 mybatis-plus 創(chuàng)建兩個不同的數(shù)據(jù)庫, 但是完全一樣的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)內(nèi)容和數(shù)據(jù)量(每個庫 2w 條數(shù)據(jù))。
開始之前先進(jìn)行預(yù)熱,之后通過打印時間戳的方式進(jìn)行對比,誰消耗的時間越少,則性能越高(每次測試 10 輪)。
1、測試單條數(shù)據(jù)查詢?
MyBatis-Flex 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.where(FLEX_ACCOUNT.ID.ge(100)
.or(FLEX_ACCOUNT.USER_NAME.eq("admin" + ThreadLocalRandom.current().nextInt(10000))));
mapper.selectOneByQuery(queryWrapper);MyBatis-Plus 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.ge("id", 100);
queryWrapper.or();
queryWrapper.eq("user_name", "admin" + ThreadLocalRandom.current().nextInt(10000));
queryWrapper.last("limit 1");
mapper.selectOne(queryWrapper);10 輪的測試結(jié)果:
---------------
>>>>>>>testFlexSelectOne:134
>>>>>>>testPlusSelectOneWithLambda:989
>>>>>>>testPlusSelectOne:830
---------------
>>>>>>>testFlexSelectOne:75
>>>>>>>testPlusSelectOneWithLambda:732
>>>>>>>testPlusSelectOne:795
---------------
>>>>>>>testFlexSelectOne:65
>>>>>>>testPlusSelectOneWithLambda:938
>>>>>>>testPlusSelectOne:714
---------------
>>>>>>>testFlexSelectOne:105
>>>>>>>testPlusSelectOneWithLambda:740
>>>>>>>testPlusSelectOne:669
---------------
>>>>>>>testFlexSelectOne:57
>>>>>>>testPlusSelectOneWithLambda:691
>>>>>>>testPlusSelectOne:773
---------------
>>>>>>>testFlexSelectOne:65
>>>>>>>testPlusSelectOneWithLambda:693
>>>>>>>testPlusSelectOne:695
---------------
>>>>>>>testFlexSelectOne:56
>>>>>>>testPlusSelectOneWithLambda:754
>>>>>>>testPlusSelectOne:665
---------------
>>>>>>>testFlexSelectOne:56
>>>>>>>testPlusSelectOneWithLambda:714
>>>>>>>testPlusSelectOne:717
---------------
>>>>>>>testFlexSelectOne:57
>>>>>>>testPlusSelectOneWithLambda:696
>>>>>>>testPlusSelectOne:671
---------------
>>>>>>>testFlexSelectOne:59
>>>>>>>testPlusSelectOneWithLambda:739
>>>>>>>testPlusSelectOne:659
測試結(jié)論
MyBatis-Flex 的查詢單條數(shù)據(jù)的速度,大概是 MyBatis-Plus 的 5 ~ 10+ 倍。
2、測試列表(List)數(shù)據(jù)查詢?
要求返回的數(shù)據(jù)為 10 條數(shù)據(jù)。
MyBatis-Flex 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.where(FLEX_ACCOUNT.ID.ge(100).or(FLEX_ACCOUNT.USER_NAME
.eq("admin" + ThreadLocalRandom.current().nextInt(10000))))
.limit(10);
mapper.selectListByQuery(queryWrapper);MyBatis-Plus 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.ge("id", 100);
queryWrapper.or();
queryWrapper.eq("user_name", "admin" + ThreadLocalRandom.current().nextInt(10000));
queryWrapper.last("limit 10");
mapper.selectList(queryWrapper);10 輪的測試結(jié)果:
---------------
>>>>>>>testFlexSelectTop10:90
>>>>>>>testPlusSelectTop10WithLambda:743
>>>>>>>testPlusSelectTop10:678
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:692
>>>>>>>testPlusSelectTop10:684
---------------
>>>>>>>testFlexSelectTop10:84
>>>>>>>testPlusSelectTop10WithLambda:692
>>>>>>>testPlusSelectTop10:670
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:737
>>>>>>>testPlusSelectTop10:667
---------------
>>>>>>>testFlexSelectTop10:85
>>>>>>>testPlusSelectTop10WithLambda:691
>>>>>>>testPlusSelectTop10:684
---------------
>>>>>>>testFlexSelectTop10:97
>>>>>>>testPlusSelectTop10WithLambda:760
>>>>>>>testPlusSelectTop10:666
---------------
>>>>>>>testFlexSelectTop10:80
>>>>>>>testPlusSelectTop10WithLambda:673
>>>>>>>testPlusSelectTop10:637
---------------
>>>>>>>testFlexSelectTop10:81
>>>>>>>testPlusSelectTop10WithLambda:653
>>>>>>>testPlusSelectTop10:639
---------------
>>>>>>>testFlexSelectTop10:82
>>>>>>>testPlusSelectTop10WithLambda:659
>>>>>>>testPlusSelectTop10:636
---------------
>>>>>>>testFlexSelectTop10:81
>>>>>>>testPlusSelectTop10WithLambda:654
>>>>>>>testPlusSelectTop10:656
測試結(jié)論
MyBatis-Flex 的查詢 10 條數(shù)據(jù)的速度,大概是 MyBatis-Plus 的 5~10 倍左右。
3、分頁查詢?
MyBatis-Flex 的代碼如下:
QueryWrapper queryWrapper = new QueryWrapper()
.where(FLEX_ACCOUNT.ID.ge(100));
mapper.paginate(page, pageSize, 20000, queryWrapper);MyBatis-Plus 的代碼如下:
LambdaQueryWrapper<PlusAccount> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ge(PlusAccount::getId, 100);
queryWrapper.eq(PlusAccount::getEmail, "michael@gmail.com");
Page<PlusAccount> p = Page.of(page, pageSize, 20000, false);
mapper.selectPage(p, queryWrapper);10 輪的測試結(jié)果:
---------------
>>>>>>>testFlexPaginate:90
>>>>>>>testPlusPaginate:671
---------------
>>>>>>>testFlexPaginate:78
>>>>>>>testPlusPaginate:643
---------------
>>>>>>>testFlexPaginate:80
>>>>>>>testPlusPaginate:638
---------------
>>>>>>>testFlexPaginate:79
>>>>>>>testPlusPaginate:613
---------------
>>>>>>>testFlexPaginate:75
>>>>>>>testPlusPaginate:627
---------------
>>>>>>>testFlexPaginate:72
>>>>>>>testPlusPaginate:606
---------------
>>>>>>>testFlexPaginate:69
>>>>>>>testPlusPaginate:585
---------------
>>>>>>>testFlexPaginate:70
>>>>>>>testPlusPaginate:589
---------------
>>>>>>>testFlexPaginate:69
>>>>>>>testPlusPaginate:586
---------------
>>>>>>>testFlexPaginate:68
>>>>>>>testPlusPaginate:585
測試結(jié)論
Mybatis-Flex 的分頁查詢速度,大概是 Mybatis-Plus 的 5~10 倍左右。
4、數(shù)據(jù)更新?
Mybatis-Flex 的代碼如下:
FlexAccount flexAccount = new FlexAccount();
flexAccount.setUserName("testInsert" + i);
flexAccount.setNickname("testInsert" + i);
flexAccount.addOption("key1", "value1");
flexAccount.addOption("key2", "value2");
flexAccount.addOption("key3", "value3");
flexAccount.addOption("key4", "value4");
flexAccount.addOption("key5", "value5");
QueryWrapper queryWrapper = QueryWrapper.create()
.where(FLEX_ACCOUNT.ID.ge(9200))
.and(FLEX_ACCOUNT.ID.le(9300))
.and(FLEX_ACCOUNT.USER_NAME.like("admin"))
.and(FLEX_ACCOUNT.NICKNAME.like("admin"));
mapper.updateByQuery(flexAccount, queryWrapper);Mybatis-Plus 的代碼如下:
PlusAccount plusAccount = new PlusAccount();
plusAccount.setUserName("testInsert" + i);
plusAccount.setNickname("testInsert" + i);
plusAccount.addOption("key1", "value1");
plusAccount.addOption("key2", "value2");
plusAccount.addOption("key3", "value3");
plusAccount.addOption("key4", "value4");
plusAccount.addOption("key5", "value5");
LambdaUpdateWrapper<PlusAccount> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.ge(PlusAccount::getId, 9000);
updateWrapper.le(PlusAccount::getId, 9100);
updateWrapper.like(PlusAccount::getUserName, "admin");
updateWrapper.like(PlusAccount::getNickname, "admin");
mapper.update(plusAccount, lambdaUpdateWrapper);10 輪的測試結(jié)果:
---------------
>>>>>>>testFlexUpdate:58
>>>>>>>testPlusUpdate:524
---------------
>>>>>>>testFlexUpdate:51
>>>>>>>testPlusUpdate:503
---------------
>>>>>>>testFlexUpdate:49
>>>>>>>testPlusUpdate:490
---------------
>>>>>>>testFlexUpdate:45
>>>>>>>testPlusUpdate:472
---------------
>>>>>>>testFlexUpdate:48
>>>>>>>testPlusUpdate:470
---------------
>>>>>>>testFlexUpdate:44
>>>>>>>testPlusUpdate:460
---------------
>>>>>>>testFlexUpdate:43
>>>>>>>testPlusUpdate:459
---------------
>>>>>>>testFlexUpdate:44
>>>>>>>testPlusUpdate:461
---------------
>>>>>>>testFlexUpdate:40
>>>>>>>testPlusUpdate:444
---------------
>>>>>>>testFlexUpdate:41
>>>>>>>testPlusUpdate:444
測試結(jié)論
Mybatis-Flex 的數(shù)據(jù)更新速度,大概是 Mybatis-Plus 的 5~10+ 倍。
總之性能測試結(jié)果:
不論是MyBatis-Flex 單條查詢分頁查詢還是數(shù)據(jù)更新,速度均是 MyBatis-Plus 的 5~10 倍左右!??!
六、MyBatis-Flex 支持的數(shù)據(jù)庫
MyBatis-Flex 支持的數(shù)據(jù)庫類型,如下表格所示,我們還可以通過自定義方言的方式,持續(xù)添加更多的數(shù)據(jù)庫支持。
| 數(shù)據(jù)庫 | 描述 |
|---|---|
| mysql | MySQL 數(shù)據(jù)庫 |
| mariadb | MariaDB 數(shù)據(jù)庫 |
| oracle | Oracle11g 及以下數(shù)據(jù)庫 |
| oracle12c | Oracle12c 及以上數(shù)據(jù)庫 |
| db2 | DB2 數(shù)據(jù)庫 |
| H2 | H2 數(shù)據(jù)庫 |
| hsql | HSQL 數(shù)據(jù)庫 |
| sqlite | SQLite 數(shù)據(jù)庫 |
| postgresql | PostgreSQL 數(shù)據(jù)庫 |
| sqlserver2005 | SQLServer2005 數(shù)據(jù)庫 |
| sqlserver | SQLServer 數(shù)據(jù)庫 |
| dm | 達(dá)夢數(shù)據(jù)庫 |
| xugu | 虛谷數(shù)據(jù)庫 |
| kingbasees | 人大金倉數(shù)據(jù)庫 |
| phoenix | Phoenix HBase 數(shù)據(jù)庫 |
| gauss | Gauss 數(shù)據(jù)庫 |
| clickhouse | ClickHouse 數(shù)據(jù)庫 |
| gbase | 南大通用(華庫)數(shù)據(jù)庫 |
| gbase-8s | 南大通用數(shù)據(jù)庫 GBase 8s |
| oscar | 神通數(shù)據(jù)庫 |
| sybase | Sybase ASE 數(shù)據(jù)庫 |
| OceanBase | OceanBase 數(shù)據(jù)庫 |
| Firebird | Firebird 數(shù)據(jù)庫 |
| derby | Derby 數(shù)據(jù)庫 |
| highgo | 瀚高數(shù)據(jù)庫 |
| cubrid | CUBRID 數(shù)據(jù)庫 |
| goldilocks | GOLDILOCKS 數(shù)據(jù)庫 |
| csiidb | CSIIDB 數(shù)據(jù)庫 |
| hana | SAP_HANA 數(shù)據(jù)庫 |
| impala | Impala 數(shù)據(jù)庫 |
| vertica | Vertica 數(shù)據(jù)庫 |
| xcloud | 行云數(shù)據(jù)庫 |
| redshift | 亞馬遜 redshift 數(shù)據(jù)庫 |
| openGauss | 華為 openGauss 數(shù)據(jù)庫 |
| TDengine | TDengine 數(shù)據(jù)庫 |
| informix | Informix 數(shù)據(jù)庫 |
| greenplum | Greenplum 數(shù)據(jù)庫 |
| uxdb | 優(yōu)炫數(shù)據(jù)庫 |
| Doris | Doris數(shù)據(jù)庫 |
| Hive SQL | Hive 數(shù)據(jù)庫 |
| lealone | Lealone 數(shù)據(jù)庫 |
| sinodb | 星瑞格數(shù)據(jù)庫 |
到此這篇關(guān)于SpringBoot中MyBatis-Flex的集成和使用實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot MyBatis-Flex集成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入分析Android系統(tǒng)中SparseArray的源碼
這篇文章主要介紹了深入分析Android系統(tǒng)中SparseArray的源碼,SparseArray為Java實現(xiàn),需要的朋友可以參考下2015-07-07
解決mapstruct在eclipse生成不了mapper的實現(xiàn)類問題
這篇文章主要介紹了解決mapstruct在eclipse生成不了mapper的實現(xiàn)類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
ExecutorService Callable Future多線程返回結(jié)果原理解析
這篇文章主要為大家介紹了ExecutorService Callable Future多線程返回結(jié)果,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Java編譯錯誤信息提示java.lang.ExceptionInInitializer解決
這篇文章主要介紹了Java編譯錯誤信息提示java.lang.ExceptionInInitializer的分析講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Spring實戰(zhàn)之Bean銷毀之前的行為操作示例
這篇文章主要介紹了Spring實戰(zhàn)之Bean銷毀之前的行為操作,結(jié)合實例形式分析了spring在bean銷毀之前的行為相關(guān)設(shè)置與使用技巧,需要的朋友可以參考下2019-11-11

