再见MyBatis,这款ORM框架确实太优雅!!

java5天前更新 LHNav
13 0 0

大家好,最近马上又要带大家做一个新项目了,为了让大家学习到更多技术,我也在不断学习,这次的新项目不仅会涉及很多 AI 技术,还会包括很多新技术和开发模式。比如这次不再使用 MyBatis Plus 来操作数据库,而是用一个更新的技术 MyBatis-Flex。

再见MyBatis,这款ORM框架确实太优雅!!

在 Java 持久层框架的世界里,MyBatis 以其灵活性和对 SQL 的强大控制力,赢得了广大开发者的青睐。然而,在实际开发中,我们常常需要编写大量重复的 CRUD 代码,这促使了一系列 MyBatis 增强框架的诞生。今天,我们要介绍的主角是 MyBatis-Flex,一个设计优雅、轻量且拥有卓越性能的 MyBatis 增强框架。

MyBatis-Flex 旨在极大地提升开发效率和编码体验,让开发者能将更多精力投入到核心业务逻辑中。它通过内置的 QueryWrapper 实现了类型安全的查询构建,显著减少了手写 SQL 的工作量和出错的可能性。同时,它保持了对原生 MyBatis 功能的完全兼容,做到了“只增强,不限制”。

Mybatis-Flex 的有什么特点?

  1. 轻量: 除了 MyBatis,没有任何第三方依赖轻依赖、没有任何拦截器,其原理是通过 SqlProvider 的方式实现的轻实现。同时,在执行的过程中,没有任何的 Sql 解析(Parse)轻运行。
  2. 灵活: 支持多主键、多表查询、逻辑删除、乐观锁、数据脱敏、数据加密、多数据源、分库分表、字段权限、 字段加密、多租户、事务管理、SQL 审计… 等等等等。 这一切,免费且灵动。
  3. 高性能: 采用独特的技术架构、相比许多同类框架,MyBatis-Flex 的在增删改查等方面的性能均超越其 5~10 倍或以上。
  4. 只增强: 支持 CRUD、分页查询、多表查询、批量操作,但不丢失 MyBatis 原有的任何功能。

Mybatis-Flex 和同类框架对比

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 的查询单条数据的速度,大概是 MyBatis-Plus 的 5 ~ 10+ 倍。
  • MyBatis-Flex 的查询 10 条数据的速度,大概是 MyBatis-Plus 的 5~10 倍左右。
  • Mybatis-Flex 的分页查询速度,大概是 Mybatis-Plus 的 5~10 倍左右。
  • Mybatis-Flex 的数据更新速度,大概是 Mybatis-Plus 的 5~10+ 倍。

具体性能对比测试,移步:

https://mybatis-flex.com/zh/intro/benchmark.html

Mybatis-Flex 支持的数据库类型

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(100),
    `age`       INTEGER,
    `birthday`  DATETIME
);

INSERTINTO tb_account(id, user_name, age, birthday)
VALUES (1, '张三', 18, '2020-01-11'),
       (2, '李四', 19, '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: 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 的代码生成器来生,功能非常强大的。详情进入:

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(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 自动生成,只需通过静态导入即可,无需手动编码。

总结

MyBatis-Flex 以其极致轻量、功能强大、无与伦比的高性能以及纯粹增强不限制的设计理念,为 MyBatis 生态注入了新的活力。它不仅提供了开发人员日常所需的大部分便捷功能,还免费开放了如多数据源、数据脱敏、字段加密等诸多企业级特性。感兴趣的同学也可以尝试一下 MyBatis-Flex(不过老项目中谨慎使用哦)。

  • 官网文档: https://mybatis-flex.com/
  • GitHub: https://github.com/mybatis-flex/mybatis-flex
  • 更多 AI 知识库:https://www.yuque.com/lhyyh/ai
© 版权声明

相关文章

没有相关内容!

暂无评论

none
暂无评论...