目 录CONTENT

文章目录

MyBatis-Flex:轻量、高性能的MyBatis增强框架实践指南

允诺
2025-07-15 / 0 评论 / 1 点赞 / 9 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

MyBatis-Flex:轻量、高性能的MyBatis增强框架实践指南

在Java持久层领域,MyBatis以其灵活性和对SQL的精准控制赢得了大量开发者的青睐。然而,在面对复杂查询、多表关联等场景时,原生MyBatis需要开发者编写大量样板代码,效率低下且易出错。这时,增强框架应运而生。MyBatis-Flex作为新一代MyBatis增强工具,不仅解决了传统ORM框架的痛点,更以轻量级设计卓越性能带来了全新的开发体验。

MyBatis-Flex区别于其他增强框架的核心在于其设计理念:只做增强,不做变更。它完全保留MyBatis的所有特性,同时通过极简的API扩展提供了强大的数据操作能力。最令人惊叹的是,整个框架除了MyBatis外没有任何第三方依赖,这种极致轻量化设计使其在性能测试中表现惊人,查询速度可达同类框架的5-10倍16。

作为技术博主,我亲历了从原生MyBatis到各种增强框架的演进过程。而 mybatis - Flex 的横空出世,凭借其独特的设计理念和出色的性能表现,正逐渐在 ORM 领域崭露头角,成为众多 Java 开发者的新宠。今天,就带大家深入了解这款优秀的 ORM 工具。

Mybaits-Flex.PNG

核心特点解析:轻量、灵活与强大的三位一体

1.极致的轻量化设计

MyBatis-Flex的轻量化体现在三个层面,构成了其卓越性能的基础:

  • 依赖轻量化:整个框架仅依赖MyBatis本身,无任何第三方库16。这种纯净的依赖结构避免了常见的JAR包冲突问题,提高了系统稳定性。
  • 架构轻量化:摒弃了传统ORM框架常用的拦截器机制,通过SqlProvider方式实现核心功能6。这种设计减少了调用链深度,使代码更易于跟踪和调试。
  • 运行时轻量化:执行过程中不进行SQL解析,直接传递原生SQL语句到数据库47。这种零解析设计消除了传统框架在SQL解析上的性能开销,使操作响应更加迅速。
// 基于SqlProvider的查询示例
public class AccountSqlProvider {
    public String selectByUserName(String userName) {
        return QueryWrapper.create()
                .select()
                .from(ACCOUNT)
                .where(ACCOUNT.USER_NAME.eq(userName))
                .toSQL();
    }
}

这种轻量化设计带来的实际效益非常显著。官方测试数据显示,在相同硬件环境下,MyBatis-Flex的单条数据查询速度是MyBatis-Plus的5-10倍,分页查询性能提升同样高达5-10倍27。

2.革命性的灵活性提升

MyBatis-Flex通过精心设计的API解决了复杂查询场景下的灵活性问题:

  • 多功能QueryWrapper:提供类型安全的查询条件构建,支持多表联合查询子查询复杂连接操作,同时保持IDE自动提示的优势110。
// 复杂查询的QueryWrapper示例
QueryWrapper query = QueryWrapper.create()
    .select(ACCOUNT.ID, ACCOUNT.USER_NAME)
    .from(ACCOUNT.as("a"))
    .leftJoin(ARTICLE.as("b")).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID))
    .where(ACCOUNT.ID.ge(100)
        .and(ACCOUNT.SEX.eq(1).or(ACCOUNT.SEX.eq(2)))
    .groupBy(ACCOUNT.USER_NAME)
    .having(ACCOUNT.AGE.between(18, 25));
  • Db + Row工具集:无需定义实体类即可直接操作数据库,特别适合快速原型开发元数据驱动的应用场景16。
// 无实体类操作示例
Db.insert("tb_account")
    .set("user_name", "张三")
    .set("age", 18)
    .execute();

Row row = Db.selectOneById("tb_account", "id", 1);
  • APT代码生成:通过编译时代码生成技术,自动创建表定义类(如AccountTableDef.ACCOUNT),实现编译时检查而非运行时错误的预防机制35。

3.企业级功能支持

MyBatis-Flex集成了现代企业应用所需的多种高级特性:

功能类别 具体特性 实现方式
数据安全 数据脱敏 字段级别注解配置
数据完整性 乐观锁 @Column(version=true)
多租户 数据隔离 全局配置+租户ID注入
审计日志 操作追踪 监听器机制
数据加密 敏感字段保护 字段级别加密策略

特别值得一提的是其乐观锁实现,通过在实体类字段添加简单注解即可启用:

public class Account {
    @Id(keyType = KeyType.Auto)
    private Long id;
    
    @Column(version = true) // 乐观锁字段
    private Integer version;
    
    // 其他字段...
}

更新时自动执行乐观锁检测,确保在高并发场景下的数据一致性1。这种设计避免了手动处理版本控制的繁琐,同时保证数据更新的安全性。

4.良好的易用性

mybatis - Flex 的 API 设计简洁明了,易于学习和使用。它提供了详细的文档和丰富的示例,开发者可以快速上手。同时,它与主流的开发框架(如 Spring Boot)能够无缝集成,降低了项目的搭建和配置难度。

功能与性能对比:全面超越传统方案

MyBatis-Flex 主要是和 MyBatis-PlusFluent-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 的事务管理,比如 @TransactionalTransactionTemplate
多数据源是否支持 “非Spring” 项目
多租户
动态表名
动态 Schema

数据来源:MyBatis-Flex官网

性能优势:因避免运行时SQL解析,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 星瑞格数据库

数据来源:MyBatis-Flex官网

Spring Boot整合实战:从零到生产的完整指南

1. 项目初始化与配置

步骤1:添加Maven依赖

<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>com.mybatis-flex</groupId>
        <artifactId>mybatis-flex-spring-boot-starter</artifactId>
        <version>1.7.7</version>
    </dependency>
    
    <!-- APT处理器 -->
    <dependency>
        <groupId>com.mybatis-flex</groupId>
        <artifactId>mybatis-flex-processor</artifactId>
        <version>1.7.7</version>
        <scope>provided</scope>
    </dependency>
    
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.0.33</version>
    </dependency>
    
    <!-- 其他依赖... -->
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <annotationProcessorPaths>
                    <path>
                        <groupId>com.mybatis-flex</groupId>
                        <artifactId>mybatis-flex-processor</artifactId>
                        <version>1.7.7</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

步骤2:配置数据源

application.yml中配置数据源:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/flex_db
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-flex:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志

2. 实体类与Mapper创建

实体类定义

@Data
@Table("tb_account")
public class Account {
    @Id(keyType = KeyType.Auto)
    private Long id;
    
    private String userName;
    
    private Integer age;
    
    private Date birthday;
    
    @Column(version = true) // 乐观锁字段
    private Integer version;
    
    @Column(isLogicDelete = true) // 逻辑删除字段
    private Boolean deleted;
}

Mapper接口定义

public interface AccountMapper extends BaseMapper<Account> {
    // 自定义方法示例
    List<Account> selectByAgeRange(@Param("minAge") int minAge, @Param("maxAge") int maxAge);
}

Mapper XML配置

<select id="selectByAgeRange" resultType="Account">
    SELECT * FROM tb_account
    WHERE age BETWEEN #{minAge} AND #{maxAge}
    AND deleted = false
</select>

3. 基础CRUD与分页操作

增删改查示例

@Service
public class AccountService {
    @Autowired
    private AccountMapper accountMapper;
    
    // 插入数据
    public int createAccount(Account account) {
        return accountMapper.insertSelective(account);
    }
    
    // 更新数据
    public int updateUserName(Long id, String userName) {
        Account account = new Account();
        account.setId(id);
        account.setUserName(userName);
        return accountMapper.update(account);
    }
    
    // 删除数据(逻辑删除)
    public int deleteAccount(Long id) {
        return accountMapper.deleteById(id);
    }
    
    // 分页查询
    public Page<Account> listAccounts(int pageNum, int pageSize, String keyword) {
        QueryWrapper query = QueryWrapper.create()
            .select()
            .where(ACCOUNT.USER_NAME.like(keyword))
            .and(ACCOUNT.DELETED.eq(false))
            .orderBy(ACCOUNT.ID.desc());
        
        return accountMapper.paginate(pageNum, pageSize, query);
    }
}

4. 高级查询技巧

复杂条件查询

public List<Account> searchAccounts(String keyword, Integer minAge, Integer maxAge) {
    return accountMapper.selectListByQuery(QueryWrapper.create()
        .select(ACCOUNT.ID, ACCOUNT.USER_NAME)
        .where(ACCOUNT.AGE.between(minAge, maxAge))
        .and(ACCOUNT.USER_NAME.like(keyword).or(ACCOUNT.REMARK.like(keyword)))
        .orderBy(ACCOUNT.BIRTHDAY.desc()));
}

关联查询(一对多)

public class Account {
    // ...其他字段
    
    @RelationOneToMany(targetField = "accountId")
    private List<Book> books;
}

public List<Account> getAccountsWithBooks() {
    // 自动执行两次查询:1.查询账户 2.查询相关书籍
    return accountMapper.selectAllWithRelations();
}

链式操作与关联查询:现代API设计典范

1. 流畅的链式操作API

MyBatis-Flex提供了QueryChainUpdateChain两种链式操作工具,极大地简化了复杂操作:

查询链示例

// 链式查询
List<Account> accounts = QueryChain.of(accountMapper)
    .select(ACCOUNT.ID, ACCOUNT.USER_NAME)
    .where(ACCOUNT.AGE.ge(18))
    .and(ACCOUNT.BIRTHDAY.between(LocalDate.of(2000,1,1), LocalDate.now()))
    .orderBy(ACCOUNT.AGE.asc())
    .list();
    
// 分页查询
Page<Account> page = QueryChain.of(accountMapper)
    .select()
    .where(ACCOUNT.USER_NAME.startsWith("张"))
    .page(new Page(1, 10));

更新链示例

// 链式更新
int rows = UpdateChain.of(Account.class)
    .set(Account::getAge, 25)
    .setRaw(Account::getRemark, "CONCAT(remark, '_updated')")
    .where(Account::getId).ge(100)
    .and(Account::getAge).lt(20)
    .update();

2 强大的关联查询能力

MyBatis-Flex的关联查询通过注解配置,支持一对一、一对多、多对多等复杂关系:

一对一关系配置

// 账户实体
public class Account {
    @Id
    private Long id;
    
    @RelationOneToOne(targetField = "accountId")
    private IDCard idCard; // 一对一关联身份证
}

// 身份证实体
@Table("tb_idcard")
public class IDCard {
    private Long accountId;
    private String cardNo;
    private String content;
}

一对多关系配置

public class Account {
    @Id
    private Long id;
    
    @RelationOneToMany(targetField = "accountId")
    private List<Book> books; // 一对多关联书籍
}

@Table("tb_book")
public class Book {
    private Long accountId;
    private String title;
}

多对多关系配置

public class Article {
    @Id
    private Long id;
    
    @RelationManyToMany(
        joinTable = "tb_article_category", // 中间表
        selfColumn = "article_id",
        targetColumn = "category_id")
    private List<Category> categories; // 多对多关联分类
}

关联查询执行

// 查询账户及其关联的书籍和身份证
List<Account> accounts = accountMapper.selectAllWithRelations();

// 控制台输出示例:
// Account{id=1, userName='孙悟空', 
//   idCard=IDCard{cardNo='0001', content='内容1'},
//   books=[Book{title='西游记'}, Book{title='金箍棒使用指南'}]}

这种关联查询设计避免了传统ORM的N+1查询问题,通过智能的批量加载策略,无论关联层级多深,都只需要执行基础查询+关联数量次SQL查询7。

适用场景建议:何时选择MyBatis-Flex?

基于其独特优势,MyBatis-Flex特别适合以下场景:

  1. 高性能要求系统:对数据库操作性能有严格要求的金融、电商等系统,其零SQL解析设计带来显著性能提升47。
  2. 多数据库支持项目:需要同时支持多种数据库(特别是国产数据库)的项目,其灵活的方言扩展机制提供便捷支持2。
  3. 复杂查询场景:涉及多表关联、嵌套查询、动态SQL的复杂业务系统,QueryWrapper提供强大而灵活的表达能力10。
  4. 微服务架构:QueryWrapper支持RPC传输,使跨服务的数据查询条件传递变得简单可靠10。
  5. 数据敏感应用:需要数据脱敏、字段加密等安全特性的应用,内置功能避免重复造轮子。

相比传统ORM框架,MyBatis-Flex在开发效率运行性能功能完整性上实现了三重突破。它既保留了MyBatis对SQL的精准控制,又通过创新的API设计极大简化了日常开发工作。特别是其5-10倍于MyBatis-Plus的性能表现,使它在高并发场景下具有明显优势27。

学习资源推荐

作为深度使用过多种ORM框架的开发者,我认为MyBatis-Flex代表了Java持久层框架的新方向。它解决了传统ORM的痛点,同时避免了过度设计带来的复杂度。无论您是在开发新项目还是重构旧系统,MyBatis-Flex都值得尝试。

1

评论区