大家好,我是鱼皮。最近马上又要带大家做一个新项目了,为了让大家学习到更多技术,我也在不断学习,这次的新项目不仅会涉及很多 AI 技术,还会包括很多新技术和开发模式。比如这次不再使用 MyBatis Plus 来操作数据库,而是用一个更新的技术 MyBatis-Flex。
正好这两天看到 Guide 哥也在介绍这个技术,就给大家分享一下,先简单了解就好,新项目中我会带大家实践。
在 Java 持久层框架的世界里,MyBatis 以其灵活性和对 SQL 的强大控制力,赢得了广大开发者的青睐。然而,在实际开发中,我们常常需要编写大量重复的 CRUD 代码,这促使了一系列 MyBatis 增强框架的诞生。今天,我们要介绍的主角是 MyBatis-Flex,一个设计优雅、轻量且拥有卓越性能的 MyBatis 增强框架。
MyBatis-Flex 旨在极大地提升开发效率和编码体验,让开发者能将更多精力投入到核心业务逻辑中。它通过内置的 QueryWrapper 实现了类型安全的查询构建,显著减少了手写 SQL 的工作量和出错的可能性。同时,它保持了对原生 MyBatis 功能的完全兼容,做到了“只增强,不限制”。
MyBatis-Flex 主要是和 MyBatis-Plus
与 Fluent-MyBatis
对比,内容来源其官网、git 或者网络文章,若有错误欢迎纠正。
功能或特点 | 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 | ✅ | ❌ | ❌ |
这里直接贴测试结果,还挺惊艳的:
具体性能对比测试,移步:
https://mybatis-flex.com/zh/intro/benchmark.html
MyBatis-Flex 支持的数据库类型,如下表格所示(只列举了一部分,几乎所有数据库都支持),我们还可以通过自定义方言的方式,持续添加更多的数据库支持。
数据库 | 描述 |
---|---|
mysql | MySQL 数据库 |
mariadb | MariaDB 数据库 |
oracle | Oracle11g 及以下数据库 |
oracle12c | Oracle12c 及以上数据库 |
db2 | DB2 数据库 |
hsql | HSQL 数据库 |
sqlite | SQLite 数据库 |
postgresql | PostgreSQL 数据库 |
sqlserver2005 | SQLServer2005 数据库 |
sqlserver | SQLServer 数据库 |
dm | 达梦数据库 |
xugu | 虚谷数据库 |
第 1 步:创建数据库表
CREATE TABLEIFNOTEXISTS`tb_account`
(
`id` INTEGER PRIMARY KEY auto_increment,
`user_name`VARCHAR(),
`age` INTEGER,
`birthday` DATETIME
);
INSERTINTO tb_account(id, user_name, age, birthday)
VALUES (, '张三', , '2020-01-11'),
(, '李四', , '2021-03-21');
第 2 步:创建 Spring Boot 项目,并添加 Maven 依赖
TIP:可以使用 Spring Initializer 快速初始化一个 Spring Boot 工程。
需要添加的 Maven 主要依赖示例:
<dependencies>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.5.3</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_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<Account> {
}
这部分也可以使用 MyBatis-Flex 的代码生成器来生,功能非常强大的。详情进入:
https://mybatis-flex.com/zh/others/codegen.html
第 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=18, birthday=Sat Jan 11 00:00:00 CST 2020)
以上的 示例 中, ACCOUNT
为 MyBatis-Flex 通过 APT 自动生成,只需通过静态导入即可,无需手动编码。
MyBatis-Flex 以其极致轻量、功能强大、无与伦比的高性能以及纯粹增强不限制的设计理念,为 MyBatis 生态注入了新的活力。它不仅提供了开发人员日常所需的大部分便捷功能,还免费开放了如多数据源、数据脱敏、字段加密等诸多企业级特性。感兴趣的同学也可以尝试一下 MyBatis-Flex(不过老项目中谨慎使用哦)。