![]()
MyBatis-Flex: 一个优雅的 MyBatis 增强框架
特征
1、很轻量
MyBatis-Flex 整个框架只依赖 MyBatis,再无其他任何第三方依赖。
2、只增强
MyBatis-Flex 支持 CRUD、分页查询、多表查询、批量操作,但不丢失 MyBatis 原有的任何功能。
3、高性能
MyBatis-Flex 采用独特的技术架构、相比同类框架(比如 MyBatis-Plus),MyBatis-Flex 的在增删改查等方面的性能均超越其 5~10 倍或以上。
4、更灵动
MyBatis-Flex 支持多主键、多表查询、逻辑删除、乐观锁、数据脱敏、数据加密、多数据源、分库分表、字段权限、 字段加密、多租户、事务管理、SQL 审计... 等等等等。 这一切,免费且灵动。
在 MyBatis-Flex v1.5.2 中,主要是新增了 QueryWrapperChain 用于链式查询和操作,以下是 QueryWrapperChain 的一个简单的测试(查询文章列表):
@SpringBootTest
class ArticleServiceTest {
@Autowired
ArticleService articleService;
@Test
void testChain() {
List<Article> articles = articleService.queryChain()
.select(ARTICLE.ALL_COLUMNS)
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.list();
}
}
如果只是查询 1 条数据呢?示例代码如下:
Article article = articleService.queryChain()
.select(ARTICLE.ALL_COLUMNS)
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.limit(1)
.one();
直接查询 Vo 或者 Dto 等,同时有额外的字段扩展:
ArticleVo 的定义:
public class ArticleVo {
private Long id;
private Long accountId;
private String title;
private String content;
//评论量最多的内容
private Long maxComments;
//getter setter
}
查询代码:
ArticleVo articleVo = articleService.queryChain()
.select(
ARTICLE.ALL_COLUMNS,
max(ARTICLE.comments).as(ArticleVo::maxCommments)
)
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.limit(1)
.oneAs(ArticleVo.class);
关联查询呢?朴素而简单!
ArticleVo 的定义:
public class ArticleVo {
private Long id;
private Long accountId;
private String title;
private String content;
//文章和分类的 多对多 关系配置
@RelationManyToMany(
joinTable = "tb_article_category_mapping", // 中间表
selfField = "id", joinSelfColumn = "article_id",
targetField = "id", joinTargetColumn = "category_id"
)
private List<ArticleCategory> categories;
//getter setter
}
查询代码:
ArticleVo articleVo = articleService.queryChain()
.select()
.from(ARTICLE)
.where(ARTICLE.ID.ge(100))
.limit(1)
.oneWithRelationsAs(ArticleVo.class);
更多关于链式查询的内容,请异步官方文档:https://mybatis-flex.com/zh/base/query-wrapper-chain.html
MyBatis-Flex v1.5.2 更新如下:
- 新增:添加 QueryWrapperChain 用于链式调用查询或者操作数据,感谢 @王帅
- 新增:添加 DbChain 链式调用 Db + Row 的相关方法和功能,感谢 @王帅
- 新增:Relation 关联查询添加
selectColumns 配置,用于自定义查询指定列名
- 新增:代码生成器添加支持 Springdoc 的支持,感谢 @dgmico
- 新增:QueryWrapper 的 orderBy 添加 lambda 参数的支持
- 优化:重构 IService 统一批量操作方式,感谢 @王帅
- 优化:Field Query 中 QueryWrapper 返回 null 值时,应该不进行属性查询,感谢 @王帅
- 优化:移除 ConvertUtil.java 一些未用到的代码
- 优化:修改 Db.selectObjectList() 方法返回数据类型不明确的问题,感谢 @王帅
- 修复:left join 多个条件,且多次引用相同表,后续的条件中别名无效的问题 #I7MI4O:leftjoin 多次引用相同表,且存在后续的 and(估计其他如 or 也可能有)时,后续的 and 等条件中别名无效
- 修复:在某些场景下,在 Spring Controller 使用
@UseDataSource 设置当前数据源不生效的问题
- 修复:当 Entity 或者 VO 中定义数据类型为
List<Map> 时,映射出错的问题
- 修复:在 kotlin 下,使用枚举类作为条件参数时,sql 执行异常的问题,感谢 @liibang
- 修复:逻辑删除使用时间类型时,正常值初始化错误的问题,感谢 @王帅
- 修复:在 kotlin 下,apt 无法正确找到 mybatis-flex.config 配置的问题
- 修复:代码生成器在多次调用生成时,可能出现 IllegalArgumentException 错误的问题
- 修复:嵌套事务下,且传播方式为 REQUIRED 时,当子事务抛出异常时出错的问题 #I7N8A1:FlexTransactionManager doSetRollbackOnly 未实现 spring jdbc 默认行为
- 文档:更新多表
@Relation 关联查询的相关文档
- 文档:添加关于 QueryWrapperChain 的相关文档
- 文档:修改逻辑删除的相关链接引用错误,感谢 @王帅
- 文档:添加关于 DbChain 使用的相关文档,感谢 @王帅
进一步了解 MyBatis-Flex 框架,请参考一下链接:
和其他框架对比请参考:
MyBatis-Flex-Helper 开发插件:
这是一款高度自定义的 Mybatis-Flex IDEA 代码生成插件:
bilibili 视频教程: