一、MyBatis-Flex 是什么?
????????MyBatis-Flex是一個基于MyBatis的數據訪問框架,專門為Flex應用程序而設計的。它提供了一種靈活而高效的方式來處理Flex應用程序中的數據訪問,可以輕松地連接到各種數據源,并提供了一些方便的工具和功能,包括對象關系映射(ORM)、動態查詢、分頁、事務處理等等。它的主要目的是簡化數據訪問的過程,使得開發人員可以更加專注于業務邏輯的開發,而不是一些瑣碎的數據訪問細節。
????????總而言之,MyBatis-Flex 能夠極大地提高我們的開發效率和開發體驗,讓我們有更多的時間專注于自己的事情。
官方文檔:MyBatis Flex官方網站
二、特征?
1、輕量型
- 輕依賴:除了 MyBatis,沒有任何第三方依賴輕依賴、沒有任何攔截器
- 輕實現:原理是通過 SqlProvider 的方式實現
- 輕運行:沒有任何的 Sql 解析,帶來了這么幾個好處:1、極高的性能;2、方便對代碼進行跟蹤和調試; 3、更高的把控性
2、使用靈活
- 支持 Entity 的增刪改查、以及分頁查詢
- MyBatis-Flex 提供了 Db + Row^靈活?工具,可以無需實體類對數據庫進行增刪改查以及分頁查詢
- MyBatis-Flex 內置的 QueryWrapper^靈活?可以輕易的幫助我們實現多表查詢、子查詢和鏈接查詢等常見的 SQL 查詢場景
3、功能強大
- 支持任意關系型數據庫,還可以通過方言持續擴展
- 支持多主鍵,邏輯刪除、數據脫敏、數據填充和樂觀鎖配置等
三、MyBatis Flex的使用
1、創建數據庫表
創建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、創建 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 項目進行配置
在 application.yml 中配置數據源:
# DataSource Config
spring:datasource:url: jdbc:mysql://localhost:3306/flex_testusername: rootpassword: 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")
?設置實體類與表名的映射關系 - 使用?
@Id(keyType = KeyType.Auto)
?標識主鍵為自增
Mapper 接口繼承 BaseMapper 接口:
public interface AccountMapper extends BaseMapper<Account> {}
這部分也可以使用 MyBatis-Flex 的代碼生成器來生,功能非常強大的。詳情進入:代碼生成器章節?了解。
5、開始使用
添加測試類,進行功能測試:
import static com.mybatisflex.test.entity.table.AccountTableDef.ACCOUNT;@SpringBootTest
class MybatisFlexTestApplicationTests {@Autowiredprivate AccountMapper accountMapper;@Testvoid 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 自動生成,只需通過靜態導入即可,無需手動編碼。
點擊查看更多APT文檔?APT 文檔。
若覺得 APT 使用不習慣,也可以使用代碼生成器來生成。點擊?代碼生成器文檔?了解。
四、同類框架「功能」對比
MyBatis-Flex 主要是和?MyBatis-Plus
?與?Fluent-MyBatis
?對比,內容來源其官網、git 或者 網絡文章,若有錯誤歡迎糾正。
- MyBatis-Plus:老牌的 MyBatis 增強框架,開源于 2016 年。
- Fluent-MyBatis:阿里云開發的 MyBatis 增強框架(來自于阿里云·云效產品團隊)
功能對比:
功能或特點 | MyBatis-Flex | MyBatis-Plus | Fluent-MyBatis |
---|---|---|---|
對 entity 的基本增刪改查 | ? | ? | ? |
分頁查詢 | ? | ? | ? |
分頁查詢之總量緩存 | ? | ? | ? |
分頁查詢無 SQL 解析設計(更輕量,及更高性能) | ? | ? | ? |
多表查詢: from 多張表 | ? | ? | ? |
多表查詢: left join、inner join 等等 | ? | ? | ? |
多表查詢: union,union all | ? | ? | ? |
單主鍵配置 | ? | ? | ? |
多種 id 生成策略 | ? | ? | ? |
支持多主鍵、復合主鍵 | ? | ? | ? |
字段的 typeHandler 配置 | ? | ? | ? |
除了 MyBatis,無其他第三方依賴(更輕量) | ? | ? | ? |
QueryWrapper 是否支持在微服務項目下進行 RPC 傳輸 | ? | ? | 未知 |
邏輯刪除 | ? | ? | ? |
樂觀鎖 | ? | ? | ? |
SQL 審計 | ? | ? | ? |
數據填充 | ? | ? | ? |
數據脫敏 | ? | ???(收費) | ? |
字段權限 | ? | ???(收費) | ? |
字段加密 | ? | ???(收費) | ? |
字典回寫 | ? | ???(收費) | ? |
Db + Row | ? | ? | ? |
Entity 監聽 | ? | ? | ? |
多數據源支持 | ? | 借助其他框架或收費 | ? |
多數據源是否支持 Spring 的事務管理,比如?@Transactional ?和?TransactionTemplate ?等 | ? | ? | ? |
多數據源是否支持 "非Spring" 項目 | ? | ? | ? |
多租戶 | ? | ? | ? |
動態表名 | ? | ? | ? |
動態 Schema | ? | ? | ? |
以上內容來自第三方相關產品的官方文檔或第三方平臺,若有錯誤,歡迎糾正。
五、同類框架「性能」對比
????????本文主要是展示了 MyBatis-Flex 和 Mybaits-Plus 的「性能」對比。Mybaits-Plus 是一個非常優秀 Mybaits 增強框架, 其開源于 2016 年,有很多的成功案例。
測試方法:
????????使用 h2 數據庫,在初始化的時候分別為 mybatis-flex 和 mybatis-plus 創建兩個不同的數據庫, 但是完全一樣的數據結構、數據內容和數據量(每個庫 2w 條數據)。
????????開始之前先進行預熱,之后通過打印時間戳的方式進行對比,誰消耗的時間越少,則性能越高(每次測試 10 輪)。
1、測試單條數據查詢?
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 輪的測試結果:
---------------
>>>>>>>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
測試結論
MyBatis-Flex 的查詢單條數據的速度,大概是 MyBatis-Plus 的 5 ~ 10+ 倍。
2、測試列表(List)數據查詢?
要求返回的數據為 10 條數據。
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 輪的測試結果:
---------------
>>>>>>>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
測試結論
MyBatis-Flex 的查詢 10 條數據的速度,大概是 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 輪的測試結果:
---------------
>>>>>>>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
測試結論
Mybatis-Flex 的分頁查詢速度,大概是 Mybatis-Plus 的 5~10 倍左右。
4、數據更新?
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 輪的測試結果:
---------------
>>>>>>>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
測試結論
Mybatis-Flex 的數據更新速度,大概是 Mybatis-Plus 的 5~10+ 倍。
總之性能測試結果:
不論是MyBatis-Flex 單條查詢分頁查詢還是數據更新,速度均是 MyBatis-Plus 的 5~10 倍左右!!!
六、MyBatis-Flex 支持的數據庫
MyBatis-Flex 支持的數據庫類型,如下表格所示,我們還可以通過自定義方言的方式,持續添加更多的數據庫支持。
數據庫 | 描述 |
---|---|
mysql | MySQL 數據庫 |
mariadb | MariaDB 數據庫 |
oracle | Oracle11g 及以下數據庫 |
oracle12c | Oracle12c 及以上數據庫 |
db2 | DB2 數據庫 |
H2 | H2 數據庫 |
hsql | HSQL 數據庫 |
sqlite | SQLite 數據庫 |
postgresql | PostgreSQL 數據庫 |
sqlserver2005 | SQLServer2005 數據庫 |
sqlserver | SQLServer 數據庫 |
dm | 達夢數據庫 |
xugu | 虛谷數據庫 |
kingbasees | 人大金倉數據庫 |
phoenix | Phoenix HBase 數據庫 |
gauss | Gauss 數據庫 |
clickhouse | ClickHouse 數據庫 |
gbase | 南大通用(華庫)數據庫 |
gbase-8s | 南大通用數據庫 GBase 8s |
oscar | 神通數據庫 |
sybase | Sybase ASE 數據庫 |
OceanBase | OceanBase 數據庫 |
Firebird | Firebird 數據庫 |
derby | Derby 數據庫 |
highgo | 瀚高數據庫 |
cubrid | CUBRID 數據庫 |
goldilocks | GOLDILOCKS 數據庫 |
csiidb | CSIIDB 數據庫 |
hana | SAP_HANA 數據庫 |
impala | Impala 數據庫 |
vertica | Vertica 數據庫 |
xcloud | 行云數據庫 |
redshift | 亞馬遜 redshift 數據庫 |
openGauss | 華為 openGauss 數據庫 |
TDengine | TDengine 數據庫 |
informix | Informix 數據庫 |
greenplum | Greenplum 數據庫 |
uxdb | 優炫數據庫 |
Doris | Doris數據庫 |
Hive SQL | Hive 數據庫 |
lealone | Lealone 數據庫 |
sinodb | 星瑞格數據庫 |