🚀 MyBatis-Flex 全面指南:下一代轻量级持久层框架实战入门
本文将带你全面了解 MyBatis-Flex 的特性、常见用法、最佳实践,帮助你高效构建更简洁、更灵活的 Java 持久层代码。
🧩 什么是 MyBatis-Flex?
MyBatis-Flex 是在经典 ORM 框架 MyBatis 基础上进行封装优化的新一代持久层框架,具备如下特点:
- 🌈 轻量灵活:保留 MyBatis 的灵活性,同时简化配置和编码。
- 🏗 实体驱动建表:内置强大的代码生成器,支持数据库反向生成。
- 🔎 类型安全查询 DSL:无需写 XML,可用 Java 代码拼接 SQL。
- 💡 极简配置:零 XML 配置,开箱即用。
- 💼 增强的 CRUD 支持:简化 insert、update、select、delete 操作。
📦 快速开始
1. 引入依赖(Maven)
<dependency>
<groupId>com.mybatisflex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.7.6</version>
</dependency>
2. 配置 application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-flex:
mapper-locations: classpath*:/mapper/**/*.xml
3. 编写实体类
@Table(value = "user")
public class User {
@Id
private Long id;
private String name;
private Integer age;
private String email;
// Getter/Setter 省略
}
✅ 注解
@Table
指定数据库表名,@Id
标识主键。
4. 创建 Mapper 接口
public interface UserMapper extends BaseMapper<User> {
// 无需手动实现,继承 BaseMapper 自动注入通用 CRUD 方法
}
5. 使用 Service 调用
@Service
public class UserService {
@Resource
private UserMapper userMapper;
public List<User> findAll() {
return userMapper.selectAll();
}
}
🔍 核心功能详解
✅ 通用 CRUD 操作
// 插入
User user = new User();
user.setName("张三");
user.setAge(20);
userMapper.insert(user);
// 更新
user.setAge(25);
userMapper.update(user);
// 查询
User user = userMapper.selectOneById(1L);
// 删除
userMapper.deleteById(1L);
🧾 条件构造器 + DSL 查询
// 条件查询:select * from user where age > 18 and name like '%张%'
QueryWrapper wrapper = QueryWrapper.create()
.where(UserTableDef.USER.AGE.gt(18))
.and(UserTableDef.USER.NAME.like("张"));
List<User> users = userMapper.selectListByQuery(wrapper);
UserTableDef.USER
是自动生成的字段定义类,可通过代码生成器自动生成。
🏗 分页查询
Page<User> page = userMapper.paginate(new Page<>(1, 10),
QueryWrapper.create().where(UserTableDef.USER.AGE.ge(18)));
System.out.println("总页数:" + page.getTotalPage());
System.out.println("总记录数:" + page.getTotalRow());
🧠 代码生成器
MyBatis-Flex 提供了内置代码生成器,支持从数据库反向生成实体类、Mapper 接口、XML 等。
public class CodeGen {
public static void main(String[] args) {
GlobalConfig config = new GlobalConfig();
config.setAuthor("YourName");
config.setOutputDir("src/main/java");
// 数据源配置
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig.setUrl("jdbc:mysql://localhost:3306/demo");
dsConfig.setUsername("root");
dsConfig.setPassword("root");
// 执行生成
Generator generator = new Generator(dsConfig, config);
generator.generate();
}
}
📚 实战案例:复杂查询组合
QueryWrapper wrapper = QueryWrapper.create()
.select(UserTableDef.USER.ALL)
.from(UserTableDef.USER)
.where(UserTableDef.USER.AGE.between(20, 30))
.and(UserTableDef.USER.NAME.like("李%"))
.orderBy(UserTableDef.USER.AGE.desc());
List<User> users = userMapper.selectListByQuery(wrapper);
🔄 多表关联查询
QueryWrapper wrapper = QueryWrapper.create()
.select(UserTableDef.USER.NAME, DeptTableDef.DEPT.DEPT_NAME)
.from(UserTableDef.USER)
.leftJoin(DeptTableDef.DEPT).on(UserTableDef.USER.DEPT_ID.eq(DeptTableDef.DEPT.ID))
.where(UserTableDef.USER.AGE.gt(25));
List<JoinUserDeptVO> list = userMapper.selectListByQueryAs(wrapper, JoinUserDeptVO.class);
配合 VO 类进行字段映射即可完成关联查询的结果封装。
♻️ 与 MyBatis 的区别
功能 | MyBatis | MyBatis-Flex |
---|---|---|
XML 配置 | 需要 | 可选 |
DSL 构建 SQL | 不支持 | ✅ 原生支持 |
代码生成 | 第三方工具 | 内置支持 |
通用 CRUD | 需手动实现 | ✅ 内置 |
性能优化 | 自主优化 | 内置分页、缓存扩展支持 |
学习曲线 | 中 | 低 |
⚙️ 常见问题 & 调试技巧
1. 如何查看生成的 SQL?
mybatis-flex:
global-config:
print-sql: true
2. 如何使用枚举映射?
@EnumValue
private UserStatus status;
结合枚举和注解可实现自动枚举值存储。
🧰 推荐使用场景
- 构建中小型企业应用,快速开发数据访问层;
- 替代繁琐的 XML SQL 和代码模板;
- 精简传统 MyBatis 项目的冗余代码;
- 快速构建原型系统、后台管理系统。
🧠 小结
MyBatis-Flex 是对传统 MyBatis 的一次现代化升级,保留了灵活性,又大幅提升了开发效率。其语法优雅、DSL 查询强大、自动代码生成非常适合中小团队快速开发。
如果你已经厌倦了写冗长的 XML,又不想被全自动 ORM 框架束缚(如 JPA),那么 MyBatis-Flex 可能就是你要找的平衡点。
📎 附录资源
- 官方文档
- GitHub 项目
- 代码生成器使用文档
- 在线示例项目
如需我协助你将这篇文章格式化为 Markdown 文档、发布到博客平台,或补充实战项目示例,请随时告知!