Springboot mybatis-flex 操作实践

桃花潭水深千尺,不及汪伦送我情。

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-plus5-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-plusbaseMapper 类似。接下来会讲述各种 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 功能,还是需要使用 mybatismybaits-plus , 此外对于复杂的数据统计、查询通过编码的方式实现会显得代码臃肿,不如在 xml 中解决显得清晰。不论是何种 orm 工具,都需要考虑实际情况,对于简单的操作可以工具增强来实现,复杂的还是通过 sql 来解决。本文中所涉及的代码已经上传至 github, 欢迎大家点赞关注。项目 github 地址 springboot-auth

相关推荐
潘多编程1 小时前
Spring Boot微服务架构设计与实战
spring boot·后端·微服务
2402_857589362 小时前
新闻推荐系统:Spring Boot框架详解
java·spring boot·后端
原机小子2 小时前
Spring Boot框架下的新闻推荐技术
服务器·spring boot·php
2401_857622662 小时前
新闻推荐系统:Spring Boot的可扩展性
java·spring boot·后端
江湖十年3 小时前
在 Go 中如何优雅的处理错误
后端·go
Amagi.3 小时前
Spring中Bean的作用域
java·后端·spring
侠客行03173 小时前
xxl-job调度平台之任务触发
java·后端·源码
2402_857589363 小时前
Spring Boot新闻推荐系统设计与实现
java·spring boot·后端
J老熊4 小时前
Spring Cloud Netflix Eureka 注册中心讲解和案例示范
java·后端·spring·spring cloud·面试·eureka·系统架构
CoderJia程序员甲4 小时前
重学SpringBoot3-集成Redis(四)之Redisson
java·spring boot·redis·缓存