更轻量、更灵活、以及更高的性能。Mybatis-Plus相信大家都在用,但是今天要推荐的是功能更强大的MyBatis-Flex。
简介
MyBatis-Flex 是一个优雅的 MyBatis 增强框架,具有轻量、高性能和灵活的特点。通过 MyBatis-Flex,我们可以轻松连接到各种数据库,并利用其内置的 QueryWrapper 大大减少了编写 SQL 的工作量,同时降低了出错的风险。
特征
1、轻量
除了 MyBatis,没有任何第三方依赖轻依赖、没有任何拦截器,其原理是通过 SqlProvider 的方式实现的轻实现。同时,在执行的过程中,没有任何的 Sql 解析(Parse)轻运行。 这带来了几个好处:1、极高的性能;2、极易对代码进行跟踪和调试; 3、更高的把控性。
2、灵活
支持 Entity 的增删改查、以及分页查询的同时,MyBatis-Flex 提供了 Db + Row^灵活 工具,可以无需实体类对数据库进行增删改查以及分页查询。 与此同时,MyBatis-Flex 内置的 QueryWrapper^灵活 可以轻易的帮助我们实现 多表查询、链接查询、子查询 等等常见的 SQL 场景。
3、强大
支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键、逻辑删除、乐观锁配置、数据脱敏、数据审计、 数据填充 等等功能。
MyBatis-Flex 和同类框架「功能」对比
MyBatis-Flex 主要是和 MyBatis-Plus 与 Fluent-MyBatis 对比,内容来源其官网、git 或者 网络文章,若有错误欢迎纠正。
- MyBatis-Plus:老牌的 MyBatis 增强框架,开源于 年。
- 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 和同类框架「性能」对比
测试方法
使用 h2 数据库,在初始化的时候分别为 mybatis-flex 和 mybatis-plus 创建两个不同的数据库, 但是完全一样的数据结构、数据内容和数据量(每个库 2w 条数据)。
开始之前先进行预热,之后通过打印时间戳的方式进行对比,谁消耗的时间越少,则性能越高(每次测试 轮)。
这里直接贴测试结果:
测试源码:
https://gitee.com/mybatis-flex/mybatis-benchmark
具体性能对比测试,移步:
https://mybatis-flex.com/zh/intro/benchmark.html
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 | 星瑞格数据库 |
MyBatis-Flex 视频系列:
https://www.bilibili.com/video/BV1yW4y1Z74j
快速开始
在开始之前,我们假定您已经:
- 熟悉 Java 环境配置及其开发
- 熟悉 关系型 数据库,比如 MySQL
- 熟悉 Spring Boot 及相关框架
- 熟悉 Java 构建工具,比如 Maven
当前章节涉及到的源码已经全部上传到:
https://gitee.com/Suomm/mybatis-flex-test ,在开始之前, 您也可以先下载到本地,导入到 idea 开发工具后,在继续看文档。
Hello World 文档
第 1 步:创建数据库表
CREATE TABLE IF NOT EXISTS `tb_account`
(
`id` INTEGER PRIMARY KEY auto_increment,
`user_name` VARCHAR),
`age` INTEGER,
`birthday` DATETIME
);
INSERT INTO tb_account(id, user_name, age, birthday)
VALUES (1, '张三', , ''),
(2, '李四', , '');
第 2 步:创建 Spring Boot 项目,并添加 Maven 依赖
可以使用 Spring Initializer 快速初始化一个 Spring Boot 工程。需要添加的 Maven 主要依赖示例:
com.mybatis-flex
mybatis-flex-spring-boot-starter
com.mysql
mysql-connector-j
runtime
com.zaxxer
HikariCP
org.springframework.boot
spring-boot-starter-test
test
注意: 如果您当前使用的是 SpringBoot v3.x 版本,需要把依赖
mybatis-flex-spring-boot-starter 修改为:
mybatis-flex-spring-boot3-starter, 如下代码所示:
com.mybatis-flex
mybatis-flex-spring-boot3-starter
com.mysql
mysql-connector-j
runtime
com.zaxxer
HikariCP
org.springframework.boot
spring-boot-starter-test
test
第 3 步:对 Spring Boot 项目进行配置
在 application.yml 中配置数据源:
# DataSource Config
spring:
datasource:
url: jdbc:mysql://localhost:/flex_test
username: root
password:
在 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 {
}
这部分也可以使用 MyBatis-Flex 的代码生成器来生,功能非常强大的。详情进入:代码生成器章节 了解。
第 5 步:开始使用
添加测试类,进行功能测试:
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());
Account account = accountMapper.selectOneByQuery(queryWrapper);
System.out.println(account);
}
}
控制台输出:
Account(id=1, userName=张三, age=, birthday=Sat Jan :: CST )
添删改简单使用
新增数据
INSERT INTO `tb_account`(`user_name`, `birthday`) VALUES ("michael", now())
@Test
public void testInsertWithRaw() {
Account account = new Account();
account.setUserName("michael");
Account newAccount = UpdateWrapper.of(account)
.setRaw(Account::getBirthday, "now()")
.toEntity();
accountMapper.insert(newAccount);
}
删除数据
DELETE FROM `tb_account` WHERE id=;
QueryWrapper queryWrapper = QueryWrapper.create();
queryWrapper.where(ACCOUNT.ID.ge));
accountMapper.deleteByQuery(queryWrapper);
部分字段更新
update tb_account set user_name = null, age = where id =
Account account = UpdateEntity.of(Account.class, );
account.setUserName(null);
account.setAge();
accountMapper.update(account);
更多复杂的功能,详见官方网站:https://mybatis-flex.com/
总结
总而言之,MyBatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。
往期回顾: