mybatis作为一款应用非常广泛的持久层框架,随之又出现了mybatis的增强框架。mybatis的增强框架就是在mybatis 的基础上又添加了许多的功能,目的就是为简化开发,提供效率而生。mybatis-plus就是一款很流行的增加框架,在 mybatis-plus 上既可以使用自身特有的功能,还可以使用 mybatis 的原生功能。最近又发现了一款新的开源的mybatis增强框架,mybatis-flex,下面将体验过程记录分享出来。
1、MyBatis-Flex简介
Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 亮点帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。
(官网地址:https://mybatis-flex.com/)
总而言之,MyBatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。
2、Mybatis-Flex特点
- 轻量: 除了 MyBatis,没有任何第三方依赖轻依赖、没有任何拦截器,其原理是通过 SqlProvider 的方式实现的轻实现。同时,在执行的过程中,没有任何的 Sql 解析(Parse)轻运行。这带来了几个好处:1、极高的性能;2、极易对代码进行跟踪和调试;3、把控性更高。
- 灵活: 支持 Entity 的增删改查、以及分页查询的同时,Mybatis-Flex 提供了 Db + Row 灵活 工具,可以无需实体类对数据库进行增删改查以及分页查询。与此同时,Mybatis-Flex 内置的 QueryWrapper 灵活 可以轻易的帮助我们实现 多表查询、链接查询、子查询 等等常见的 SQL 场景。
- 强大: 支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键、逻辑删除、乐观锁配置、数据脱敏、数据审计、 数据填充 等等功能。
3、Mybatis-Flex和同类框架对比
1)功能对比:
(来自其官网)
2)性能对比:
这里直接贴测试结果:
MyBatis-Flex 的查询单条数据的速度,大概是 MyBatis-Plus 的 5 ~ 10+ 倍。
MyBatis-Flex 的查询 10 条数据的速度,大概是 MyBatis-Plus 的 5~10 倍左右。
Mybatis-Flex 的分页查询速度,大概是 Mybatis-Plus 的 5~10 倍左右。
Mybatis-Flex 的数据更新速度,大概是 Mybatis-Plus 的 5~10+ 倍。
4、Mybatis-Flex支持的数据库类型
MyBatis-Flex 支持的数据库类型,如下表格所示,我们还可以通过自定义方言的方式,持续添加更多的数据库支持。
5、快速开始
5.1、创建数据库表
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');
5.2、创建 Spring Boot 项目,并添加 Maven 依赖
springboot的版本为2.7.x,pom.xml依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<excludes>
<exclude>
*.properties
</exclude>
</excludes>
</resource>
<resource>
<directory>target/generated-sources</directory>
</resource>
</resources>
</build>
注意:target/generated-sources的配置,否则影响APT 自动生成类的引用。
5.3、配置
在 application.yml 中配置数据源:
# DataSource Config
spring:
datasource:
url: jdbc:mysql://localhost:3306/flex_test
username: root
password: 123456
在启动类中
添加 @MapperScan 注解,扫描 Mapper 文件夹:
@SpringBootApplication
@MapperScan("com.*.*.mapper")
public class SpringbootMybatisFlexApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisFlexApplication.class, args);
}
}
5.4、编写实体类和 Mapper 接口
@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) 标识主键为自增
public interface AccountMapper extends BaseMapper<Account> {
}
这部分也可以使用 MyBatis-Flex 的代码生成器来生,功能非常强大的。详情进入:https://mybatis-flex.com/zh/others/codegen.html
5.5、测试
测试类如下:
import static com.*.*.model.table.AccountTableDef.ACCOUNT;
@SpringBootTest
class SpringbootMybatisFlexApplicationTests {
@Autowired
private AccountMapper accountMapper;
@Test
void contextLoads() {
QueryWrapper queryWrapper = QueryWrapper.create()
.select()
//.where("age = 18");
.where(ACCOUNT.AGE.eq(18));
Account account = accountMapper.selectOneByQuery(queryWrapper);
System.out.println(account);
}
}
注意,添加静态引入import static com...model.table.AccountTableDef.ACCOUNT;
控制台输出如下:
以上的 示例 中, ACCOUNT 为 MyBatis-Flex 通过 APT 自动生成,只需通过静态导入即可,无需手动编码。
6、小结
整体来讲,这个框架是Mybatis的增强版,几乎集成了mybatis plus、jooq、fluent mybatis的所有优点,大家可以探索一番,官方网站:https://mybatis-flex.com/。
尤其是QueryWrapper 的使用,若体验遇到问题,还可以参考官方实例:https://gitee.com/mybatis-flex/mybatis-flex-samples/tree/master