写在前面的话
MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。
特征
1、轻量
除了 MyBatis,没有任何第三方依赖轻依赖、没有任何拦截器,其原理是通过 SqlProvider 的方式实现的轻实现。同时,在执行的过程中,没有任何的 Sql 解析(Parse)轻运行。 这带来了几个好处:1、极高的性能;2、极易对代码进行跟踪和调试; 3、更高的把控性。
2、灵活
支持 Entity 的增删改查、以及分页查询的同时,MyBatis-Flex 提供了 Db + Row^灵活 工具,可以无需实体类对数据库进行增删改查以及分页查询。 与此同时,MyBatis-Flex 内置的 QueryWrapper^灵活 可以轻易的帮助我们实现 多表查询、链接查询、子查询 等等常见的 SQL 场景。
3、强大
支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键、逻辑删除、乐观锁配置、数据脱敏、数据审计、 数据填充 等等功能。
功能对比
功能或特点 | MyBatis-Flex | MyBatis-Plus | Fluent-MyBatis |
---|---|---|---|
对 entity 的基本增删改查 | ✅ | ✅ | ✅ |
分页查询 | ✅ | ✅ | ✅ |
分页查询之总量缓存 | ✅ | ✅ | ❌ |
分页查询无 SQL 解析设计(更轻量,及更高性能) | ✅ | ❌ | ✅ |
多表查询: from 多张表 | ✅ | ❌ | ❌ |
多表查询: left join、inner join 等等 | ✅ | ❌ | ✅ |
多表查询: union,union all | ✅ | ❌ | ✅ |
单主键配置 | ✅ | ✅ | ✅ |
多种 id 生成策略 | ✅ | ✅ | ✅ |
支持多主键、复合主键 | ✅ | ❌ | ❌ |
字段的 typeHandler 配置 | ✅ | ✅ | ✅ |
除了 MyBatis,无其他第三方依赖(更轻量) | ✅ | ❌ | ❌ |
QueryWrapper 是否支持在微服务项目下进行 RPC 传输 | ✅ | ❌ | 未知 |
逻辑删除 | ✅ | ✅ | ✅ |
乐观锁 | ✅ | ✅ | ✅ |
SQL 审计 | ✅ | ❌ | ❌ |
数据填充 | ✅ | ✅ | ✅ |
数据脱敏 | ✅ | ✔️ (收费) | ❌ |
字段权限 | ✅ | ✔️ (收费) | ❌ |
字段加密 | ✅ | ✔️ (收费) | ❌ |
字典回写 | ✅ | ✔️ (收费) | ❌ |
Db + Row | ✅ | ❌ | ❌ |
Entity 监听 | ✅ | ❌ | ❌ |
多数据源支持 | ✅ | 借助其他框架或收费 | ❌ |
多数据源是否支持 Spring 的事务管理,比如 @Transactional 和 TransactionTemplate 等 | ✅ | ❌ | ❌ |
多数据源是否支持 "非Spring" 项目 | ✅ | ❌ | ❌ |
多租户 | ✅ | ✅ | ❌ |
动态表名 | ✅ | ✅ | ❌ |
动态 Schema | ✅ | ❌ | ❌ |
1.快速上手(使用springboot)
1.1 依赖
pom文件主要添加:mybatis-flex-spring-boot-starter依赖
<dependencies><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.8.2</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><!-- for test only --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
1.2 配置
在 application.yml文件中进行如下简单数据源配置:
# DataSource Config
spring:datasource:url: jdbc:mysql://localhost:3306/flex_testusername: rootpassword: 12345678
在 Spring Boot 启动类中添加 @MapperScan
注解,扫描 Mapper 文件夹:
@SpringBootApplication
@MapperScan("com.mybatisflex.test.mapper")
public class MybatisFlexTestApplication {public static void main(String[] args) {SpringApplication.run(MybatisFlexTestApplication.class, args);}}
1.3 编写实体类和 Mapper 接口
使用了 Lombok 来简化代码。
@Data
@Table("tb_account")
public class Account {@Id(keyType = KeyType.Auto)private Long id;private String userName;private Integer age;private Date birthday;}
- 使用
@Table("tb_account")
设置实体类与表名的映射关系 - 使用
@Id(keyType = KeyType.Auto)
标识主键为自增
Mapper 接口继承 BaseMapper 接口:
public interface AccountMapper extends BaseMapper<Account> {}
1.4 启动运行
添加测试类如下,代码中ACCOUNT
为 MyBatis-Flex 通过 APT 自动生成,只需通过静态导入即可,无需手动编码
import static com.mybatisflex.test.entity.table.AccountTableDef.ACCOUNT;@SpringBootTest
class MybatisFlexTestApplicationTests {@Autowiredprivate AccountMapper accountMapper;@Testvoid contextLoads() {QueryWrapper queryWrapper = QueryWrapper.create().select().where(ACCOUNT.AGE.eq(18));Account account = accountMapper.selectOneByQuery(queryWrapper);System.out.println(account);}}
有同学会发现,ACCOUNT.AGE.eq(18)这个ACCOUNT类没法导入包,一直报错,是因为你还没有导入进来,你在编译的时候这个位置需要导入进来:
如上操作就行了,还有同学说,我还没有编译,上面的代码也运行不了,怎么办,你可以把这个测试代码换一下:
换成这样的测试代码,就解决了,先运行编译一下就出现了。
@Autowiredprivate AccountMapper accountMapper;@Testvoid contextLoads() {QueryWrapper queryWrapper = QueryWrapper.create().select().where(ACCOUNT.AGE.eq(18));Account account = accountMapper.selectOneByQuery(queryWrapper);System.out.println(account);}
还有的同学编译后了,还是没有出现这个辅助类,怎么办?
你可以按照下面的图片进行操作:
没有生成辅助类,你可以开启idea的注解处理器,如下图所示:
然后检查processor这个包是否导入进来了,就是有没有在pom文件添加以下依赖,刷新maven:
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot-starter</artifactId>
<version>1.7.3</version>
</dependency>
完成以上内容,肯定会运行成功的,祝你成功!
2.代码生成器实现运行
在 mybatis-flex 的模块 mybatis-flex-codegen
中,提供了可以通过数据库表,生成 Entity 类和 Mapper 类的功能。当把数据库表设计完成后可以使用其快速生成 Entity、 Mapper、 Service、 Controller 等产物。 除此之外,还可以通过扩展生成更多种类的物料。
2.1 添加依赖
添加 mybatis-flex-codegen
的 Maven 依赖。
<dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-codegen</artifactId><version>1.8.2</version>
</dependency>
<!--也可添换成druid依赖--->
<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version>
</dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.32</version>
</dependency>
2.2 生成类
最后,编写一个任意带有 main 方法的类,如下所示:
运行可以生成以下内容:
- Entity 实体类
- Mapper 映射类
- TableDef 表定义辅助类
- Service 服务类
- ServiceImpl 服务实现类
- Controller 控制类
- MapperXml 文件
package com.wei.demo1.controller;import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.mybatisflex.core.service.IService;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.zaxxer.hikari.HikariDataSource;/*** @BelongsProject: demo1* @BelongsPackage: com.wei.demo1.demos.web.controller* @ClassName CodeGen* @Author: weiq* @CreateTime: 2024-03-06 18:24* @Description: TODO* @Version: 1.0*/
public class CodeGen {public static void main(String[] args) {//配置数据源HikariDataSource dataSource = new HikariDataSource();
// DruidDataSource dataSource = new DruidDataSource();dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/flex-test?characterEncoding=utf-8&useInformationSchema=true");dataSource.setUsername("root");dataSource.setPassword("root");//创建配置内容,两种风格都可以。GlobalConfig globalConfig = createGlobalConfigUseStyle1();
// GlobalConfig globalConfig = createGlobalConfigUseStyle2();//通过 datasource 和 globalConfig 创建代码生成器Generator generator = new Generator(dataSource, globalConfig);//生成代码generator.generate();}public static GlobalConfig createGlobalConfigUseStyle1() {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.setBasePackage("com.wei.demo1");//设置表前缀和只生成哪些表globalConfig.setTablePrefix("tb_");globalConfig.setGenerateTable("tb_account");//设置生成 entity 并启用 LombokglobalConfig.setEntityGenerateEnable(true);globalConfig.setEntityWithLombok(true);//设置项目的JDK版本,项目的JDK为14及以上时建议设置该项,小于14则可以不设置
// globalConfig.setEntityJdkVersion(17);//设置生成 controllerglobalConfig.setControllerGenerateEnable(true);//设置生成 serviceglobalConfig.setServiceGenerateEnable(true);//设置生成 serviceImplglobalConfig.setServiceImplGenerateEnable(true);//设置生成 mapperglobalConfig.setMapperGenerateEnable(true);//设置生成 mapperXmlglobalConfig.setMapperXmlGenerateEnable(true);globalConfig.getControllerConfig().setClassPrefix("").setClassSuffix("Controller").setRestStyle(true);globalConfig.getServiceConfig().setClassPrefix("").setClassSuffix("Service").setSuperClass(IService.class).setOverwriteEnable(true);globalConfig.getServiceImplConfig().setClassPrefix("").setClassSuffix("ServiceImpl").setSuperClass(ServiceImpl.class).setOverwriteEnable(true);globalConfig.getMapperXmlConfig().setFilePrefix("com.wei.demo1").setFileSuffix("Mapper").setOverwriteEnable(true);//可以单独配置某个列
// ColumnConfig columnConfig = new ColumnConfig();
// columnConfig.setColumnName("tenant_id");
// columnConfig.setLarge(true);
// columnConfig.setVersion(true);
// globalConfig.setColumnConfig("tb_account", columnConfig);return globalConfig;}public static GlobalConfig createGlobalConfigUseStyle2() {//创建配置内容GlobalConfig globalConfig = new GlobalConfig();//设置根包globalConfig.getPackageConfig().setBasePackage("com.wei.mybatisflex");//设置表前缀和只生成哪些表,setGenerateTable 未配置时,生成所有表globalConfig.getStrategyConfig().setTablePrefix("tb_");
// .setGenerateTable("tb_account", "tb_account_session");//设置生成 entity 并启用 LombokglobalConfig.enableEntity().setWithLombok(true);
// .setJdkVersion(17);//设置生成 mapperglobalConfig.enableMapper();// //可以单独配置某个列
// ColumnConfig columnConfig = new ColumnConfig();
// columnConfig.setColumnName("tenant_id");
// columnConfig.setLarge(true);
// columnConfig.setVersion(true);
// globalConfig.getStrategyConfig()
// .setColumnConfig("tb_account", columnConfig);return globalConfig;}
}
在 Mybatis-Flex 的代码生成器中,支持如下 8 种类型的的产物生成:
- Entity 实体类
- Mapper 映射类
- TableDef 表定义辅助类
- Service 服务类
- ServiceImpl 服务实现类
- Controller 控制类
- MapperXml 文件
- package-info.java 文件
启用或关闭某种类型产物的生成,代码如下:
// 开启 Entity 的生成
globalConfig.enableEntity();
// 关闭 Entity 的生成
globalConfig.disableEntity();
所有方法均支持链式调用配置,代码如下:
// 设置生成 Entity 并启用 Lombok、设置父类
globalConfig.enableEntity().setWithLombok(true).setSuperClass(BaseEntity.class);
注意事项!!!
在 MySQL 或者 Oracle 的某些版本中,代码生成器可能无法获取 表
或者 字段
的注释内容,我们在数据源配置时,注意添加如下的配置信息:
MySQL
JdbcUrl 上注意添加 useInformationSchema=true
配置,如下代码所示:
HikariDataSource dataSource = new HikariDataSource();//注意:url 需添加上 useInformationSchema=true 才能正常获取表的注释
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/db?useInformationSchema=true&characterEncoding=utf-8");
dataSource.setUsername("username");
dataSource.setPassword("password");
3.MyBatis-Flex配置总结
配置文件可以在yml文件和代码中进行配置
3.1 yml文件配置
server:port: 8080
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/flex-testusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSource
mybatis-flex:mapper-locations: classpath:/mapper/**/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.2 代码中进行配置
@Configuration
public class MybatisFlexConfig implementsConfigurationCustomizer,SqlSessionFactoryBeanCustomizer,MyBatisFlexCustomizer {@Overridepublic void customize(FlexConfiguration flexConfiguration) {System.out.println("Mybatis Configuration 配置!");}@Overridepublic void customize(SqlSessionFactoryBean sqlSessionFactoryBean) {System.out.println("sqlSessionFactoryBean 配置");}@Overridepublic void customize(FlexGlobalConfig flexGlobalConfig) {System.out.println("MyBatis Flex 配置");}
}
配置文件运行顺序如下所示:
后续继续更新!