Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。
总而言之,Mybatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。
MyBatis-Flex 1.0.7 更新内容如下:
- 新增:BaseMapper 添加可以直接根据 Condition 查询的方法,更加方便
- 新增:Db 添加可以直接根据 Condition 查询的方法,更加方便
- 新增:代码生成器添加 @Table(onSet 的配置
- 新增:添加 HttpMessageReporter,用于可以往服务器发送审计日志
- 优化:APT 生成的 java 属性默认使用下划线的方式
- 优化:优化 APT 生成 mapper 的默认存放路径
- 优化:重命名 QueryEntityProcesser 为 QueryEntityProcessor
- 文档:添加字段权限的相关文档
- 文档:添加字典回写的相关文档
- 文档:添加字段加密的相关文档
- 文档:添加 Mybatis-Flex 与同类框架对比的文档
Mybaits-Plus 是一个老牌的、享有盛誉的 Mybatis 增强框架,flex 和 plus 有什么区别呢?以下是 Mybatis-Flex、Mybatis-Plus、Fluent-Mybatis 的一些细节对比。容来源其官网、git 或者 网络文章,若有错误欢迎指正。
功能对比
- MyBatis-Plus:老牌的 MyBatis 增强框架
- Fluent-Mybatis:阿里开发的 Mybatis 增强框架(是阿里开发的吗?)
功能或特点 | MyBatis-Flex | MyBatis-Plus | Fluent-Mybatis |
---|---|---|---|
对 entity 的基本增删改查 | ✅ | ✅ | ✅ |
分页查询 | ✅ | ✅ | ✅ |
分页查询之总量缓存 | ✅ | ❌ | ❌ |
分页查询无SQL解析设计(更轻量) | ✅ | ❌ | ✅ |
多表查询: from 多张表 | ✅ | ❌ | ❌ |
多表查询: left join、inner join 等等 | ✅ | ❌ | ✅ |
单主键配置 | ✅ | ✅ | ✅ |
多种 id 生成策略 | ✅ | ✅ | ✅ |
支持多主键、复合主键 | ✅ | ❌ | ❌ |
字段的 typeHandler 配置 | ✅ | ✅ | ✅ |
除了 Mybatis,无其他第三方依赖(更轻量) | ✅ | ❌ | ❌ |
逻辑删除 | ✅ | ✅ | ✅ |
乐观锁 | ✅ | ✅ | ✅ |
SQL 审计 | ✅ | ❌ | ❌ |
数据填充 | ✅ | ✅(收费) | ✅ |
数据脱敏 | ✅ | ✅(收费) | ❌ |
字段权限 | ✅ | ✅(收费) | ❌ |
字段加密 | ✅ | ✅(收费) | ❌ |
字典回显 | ✅ | ✅(收费) | ❌ |
Db + Row | ✅ | ❌ | ❌ |
Entity 监听 | ✅ | ❌ | ❌ |
多数据源支持 | ✅ | ✅ | ❌ |
以上内容来自第三方相关产品的官方文档或第三方平台,若有错误,欢迎指正。
基础查询
MyBatis-Flex:
QueryCondition condition = EMPLOYEE.LAST_NAME.like("B" .and(EMPLOYEE.GENDER.eq(1 .and(EMPLOYEE.AGE.gt(24; List<Employee> employees = employeeMapper.selectListByCondition(condition;
MyBatis-Plus:
QueryWrapper<Employee> queryWrapper = new QueryWrapper<>(; queryWrapper .like("last_name","B" .eq("gender",1 .gt("age",24; List<Employee> employees = employeeMapper.selectList(queryWrapper;
Fluent-MyBatis:
EmployeeQuery query = new EmployeeQuery( .where.lastName(.like("B" .and.gender(.eq(1 .and.age(.gt(24 .end(; List<Employee> employees = employeeMapper.listEntity(query;
总结:MyBatis-Flex 和 Fluent-MyBatis 的字段有 IDE 自动提示,不担心写错,同时在后续版本升级和重构时,更好的利用 IDE 的重构功能, 字段错误在项目编译期间就能发现及时纠正。
查询集合函数
MyBatis-Flex:
QueryWrapper query = new QueryWrapper( .select( ACCOUNT.ID, ACCOUNT.USER_NAME, max(ACCOUNT.BIRTHDAY, avg(ACCOUNT.SEX.as("sex_avg" ; List<Employee> employees = employeeMapper.selectListByQuery(query;
MyBatis-Plus:
QueryWrapper<Employee> queryWrapper = new QueryWrapper<>(; queryWrapper .select( "id" ,"user_name" ,"max(birthday" ,"avg(birthday as sex_avg" ; List<Employee> employees = employeeMapper.selectList(queryWrapper;
缺点:字段硬编码,容易错处。无法使用 ide 的字段进行重构,无法使用 IDE 自动提示,发生错误不能及时发现。
Fluent-MyBatis:
EmployeeQuery query = new EmployeeQuery( .select .id( .userName( .max.birthday( .avg.sex("sex_avg" .end( List<Employee> employees = employeeMapper.listEntity(query;
缺点:编写内容不符合 sql 直觉。
and(... 和 or(...
假设我们要构建如下的 SQL 进行查询(需要在 SQL 中添加括号)。
SELECT * FROM tb_account WHERE id >= 100 AND (sex = 1 OR sex = 2 OR (age IN (18,19,20 AND user_name LIKE "%michael%"
MyBatis-Flex:
QueryWrapper query = QueryWrapper.create( .where(ACCOUNT.ID.ge(100 .and(ACCOUNT.SEX.eq(1.or(ACCOUNT.SEX.eq(2 .or(ACCOUNT.AGE.in(18,19,20.and(ACCOUNT.USER_NAME.like("michael";
MyBatis-Plus:
QueryWrapper<Employee> query = new QueryWrapper<>(; queryWrapper.ge("id",100 .and(i->i.eq("sex",1.or(x->x.eq("sex",2 .or(i->i.in("age",{18,19,20}.like("user_name","michael";
Fluent-Mybatis:
AccountQuery query = new AccountQuery( .where.id(.ge(100 .and( new AccountQuery(.where.sex(.eq(1.or( new AccountQuery(.where.sex(.eq(2.end( .end( .or( new AccountQuery(.where.age.in(18,19,20 .and.userName(.like("michael".end( .end(;
缺点:许多 .end( 方法调用,容易忘记出错(或者是我写错了?欢迎指正)。
多表查询 1
MyBatis-Flex:
QueryWrapper query = QueryWrapper.create( .select(.from(ACCOUNT .leftJoin(ARTICLE.on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID .where(ACCOUNT.AGE.ge(10; List<Account> accounts = mapper.selectListByQuery(query;
MyBatis-Plus:
// 不支持~~~~
Fluent-MyBatis:
StudentQuery leftQuery = new StudentQuery("a1".selectAll( .where.age(.eq(34 .end(; HomeAddressQuery rightQuery = new HomeAddressQuery("a2" .where.address(.like("address" .end(; IQuery query = leftQuery .join(rightQuery .on(l -> l.where.homeAddressId(, r -> r.where.id(.endJoin( .build(; List<StudentEntity> entities = this.mapper.listEntity(query;
缺点:编写内容不符合 sql 直觉。同时在编写 end( 和 endJoin( 容易忘记。
多表查询 2
假设查询的 SQL 如下:
SELECT a.id, a.user_name, b.id AS articleId, b.title FROM tb_account AS a, tb_article AS b WHERE a.id = b.account_id
MyBatis-Flex:
QueryWrapper query = new QueryWrapper( .select( ACCOUNT.ID , ACCOUNT.USER_NAME , ARTICLE.ID.as("articleId" , ARTICLE.TITLE .from(ACCOUNT.as("a", ARTICLE.as("b" .where(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID;
MyBatis-Plus:
// 不支持~~~~
Fluent-MyBatis:
// 不支持~~~~
PS:也有可能是我自己不知道如何支持,而 Fluent-MyBatis 原因,有知道的同学可以给下示例代码。
进一步了解 MyBatis-Flex 框架,请参考一下链接:
- 1、快速开始:https://mybatis-flex.com/zh/getting-started.html
- 2、强大的 QueryWrapper:https://mybatis-flex.com/zh/querywrapper.html
- 3、逻辑删除:https://mybatis-flex.com/zh/logic_delete.html
- 4、乐观锁:https://mybatis-flex.com/zh/version.html
- 5、数据填充:https://mybatis-flex.com/zh/fill.html
- 6、数据脱敏:https://mybatis-flex.com/zh/mask.html
- 7、SQL 审计:https://mybatis-flex.com/zh/audit.html
- 8、多数据源:https://mybatis-flex.com/zh/multi-datasource.html
- 9、更多企业级的功能正在路上:https://mybatis-flex.com