当前位置: 首页 > article >正文

MyBatis-Flex 全面指南:下一代轻量级持久层框架实战入门

🚀 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=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis-flex:mapper-locations: classpath*:/mapper/**/*.xml

3. 编写实体类

@Table(value = "user")
public class User {@Idprivate 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 {@Resourceprivate 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 的区别

功能MyBatisMyBatis-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 文档、发布到博客平台,或补充实战项目示例,请随时告知!

http://www.lryc.cn/news/2395954.html

相关文章:

  • 第十六章 EMQX黑名单与连接抖动检测
  • WebSphere(WAS)
  • 新编辑器编写指南--给自己的备忘
  • xPSR
  • 鸿蒙网络数据传输案例实战
  • 【JavaEE】-- 网络原理
  • 1.RV1126-OPENCV 交叉编译
  • PySide6 GUI 学习笔记——常用类及控件使用方法(标签控件QLabel)
  • CSS (mask)实现服装动态换色:创意与技术的完美融合
  • 基于51单片机的音乐盒汽车喇叭调音量proteus仿真
  • 彻底理解Spring三级缓存机制
  • MacOs 安装局域网 gitlab 记录
  • Flutter 与 Android 原生布局组件对照表(完整版)
  • 【产品经理从0到1】自媒体端产品设计
  • 017搜索之深度优先DFS——算法备赛
  • 解决 maven编译项目-Fatal error compiling: 无效的目标发行版: 21 -> [Help 1]
  • Thinkphp6实现websocket
  • web-css
  • 关于 smali:2. 从 Java 到 Smali 的映射
  • 三、zookeeper 常用shell命令
  • 分布式流处理与消息传递——Paxos Stream 算法详解
  • 智变与重构:AI 赋能基础教育教学的范式转型研究报告
  • 平衡三进制
  • 针对Python开发的工具推荐及分析,涵盖集成开发环境(IDE)、轻量级工具、在线开发平台、代码管理工具等)
  • 960g轻薄本,把科技塞进巧克力盒子
  • xcode 编译运行错误 Sandbox: rsync(29343) deny(1) file-write-create
  • C# 基于 Windows 系统与 Visual Studio 2017 的 Messenger 消息传递机制详解:发布-订阅模式实现
  • ComfyUI+阿里Wan2.1+内网穿透技术:本地AI视频生成系统搭建实战
  • 腾讯云开发者社区文章内容提取免费API接口教程
  • 利用海外代理IP,做Twitter2026年全球趋势数据分析