桃花潭水深千尺,不及汪伦送我情。
1 前言
在日常的项目开发中,经常会用到 ORM
框架,mybatis
是大家耳熟能详的优秀代表,但是其也存在着诸多的不足。后端开发者已经不能满足于自动生成 CRUD
工具了,于是基于此有了 mybatis
的增强版本,mybatis-plus
以及 mybatis-flex
, 在本文中将介绍 mybatis-flex
这个后起之秀。
2 mybatis-flex 介绍
mybatis-flex
是一款轻量、灵活、高性能的 MyBatis
增强框架,可以通过编码的方式实现数据的操作和查询,而不是在 xml
中编写 sql
。其提供了灵活的 QueryWrapper
,可以实现关联查询和多表查询等操作。由于其独特的架构,没有采用 mybatis
的任何拦截器,使得 sql 执行性能非常高,通常的数据场景下,mybatis-flex
的性能是mybatis-plus
的 5-10倍。
ruby
# mybatis-flex 文档地址
https://mybatis-flex.com/zh/intro/getting-started.html
此外,mybatis-flex
采用了 APT 技术
,使得在编程式书写 sql
时可以简洁的实现,并且可以实现数据的关联查询,数据分析类型的查询,还可以使用 as
的方式来避免查询后的数据转换。
mybatis-flex
引入 springboot 项目中所需要的依赖如下所示:
xml
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.7.3</version>
</dependency>
# 使用 apt 技术生成时,需要加入此依赖,但是需要去除 codegen 才能生成 Table 信息
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-processor</artifactId>
<version>1.7.3</version>
<scope>provided</scope>
</dependency>
# 代码生成
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-codegen</artifactId>
<version>1.7.3</version>
</dependency>
mybatis-flex
的通常配置如下,基本上和 mybatis以及 mybatis-plus 类似,两者都是做了增强的功能,其它的一些配置都是使用默认的约定方式,简化了开发者的搭建和尝试难度。
3 主要 api
mybatis-flex
的增删改查的基础 api
都封装在了 baseMapper
中,这一点和 mybatis-plus
的 baseMapper
类似。接下来会讲述各种 api
的操作以及相应的特点。
3.1 数据增删改
数据的新增可以全部字段新增,也可以选择非null 字段新增,此外还可以选择是否忽略 null 值,是否自定义主键保存数据,批量插入数据等内容。
数据的更新可以根据主键更新,根据条件更新,以及选择是否忽略 null 值,数据的存储和更新 insertOrUpdate
也可以综合运用。
数据的删除可以指定 id 单条或者批量删除,也可以根据条件进行操作。
3.2 数据查询
数据的查询操作相对来说比较多,不仅有简单的单条、批量查询和分页查询,还有复杂的关联查询以及统计类型的查询。在数据查询时,可以结合 QueryWrapper
使用 APT
技术,可以使用编码的方式实现 sql 的查询。
4 mybatis-flex 实践
在开始之前,我们需要先介绍一下两个实体类,需要通过注解的方式设置数据库表名,以及主键的模式。@Column
是字段映射的注解,该注解有 ignore
的属性,可以忽略该字段在数据库的存在。对于时间类型的数据而言, onInsertValue 和 onUpdateValue
具有实用价值,可以保证在分布式服务中,数据的更新和创建都使用数据库时间。@ColumnMask
注解实现了数据的脱敏处理,常用的个人信息中,都会有脱敏的配置。 在实体类中也有租户和分布式锁的注解,这里就不进行展示了。
如下图所示,数据的保存以及更新都是在 service
中已经实现了对应的方法,保存和修改的方法比较通用。在构建查询条件时使用的是 QueryWrapper
,通过它可以构建各种复杂的查询条件,如果查询条件为空时,会自动忽略其查询条件,如下图所示。 在查询时,通常返回结果不会只是实体类对象,所以在查询时需要构建返回参数,可以使用带 as
的查询方法来获取对应的返回值。
对于复杂的统计查询,如下图所示,通过上述的分析可以知道 mybatis-flex
基本上可以实现所有复杂的查询,在 xml 中 sql 已经不是必要的了。
5 Db+Row
除了前述的内容外,mybatis-flex
还提供了 Db + Row
的方式提供数据的增删改查,如下所示可以完成数据的操作, 通过以上的方式可以像使用工具类一样来操作数据库,简单方便。
6 总结
mybatis-flex
只是基于 mybatis
做了增强实现, 如果需要完整的 orm 功能,还是需要使用 mybatis
和 mybaits-plus
, 此外对于复杂的数据统计、查询通过编码的方式实现会显得代码臃肿,不如在 xml
中解决显得清晰。不论是何种 orm
工具,都需要考虑实际情况,对于简单的操作可以工具增强来实现,复杂的还是通过 sql
来解决。本文中所涉及的代码已经上传至 github
, 欢迎大家点赞关注。项目 github
地址 springboot-auth。