写在前面的话

        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_test
    username: root
    password: 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 {

    @Autowired
    private AccountMapper accountMapper;

    @Test
    void 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类没法导入包,一直报错,是因为你还没有导入进来,你在编译的时候这个位置需要导入进来:

如上操作就行了,还有同学说,我还没有编译,上面的代码也运行不了,怎么办,你可以把这个测试代码换一下:

换成这样的测试代码,就解决了,先运行编译一下就出现了。

 @Autowired
    private AccountMapper accountMapper;
    @Test
    void 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 并启用 Lombok
        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntityWithLombok(true);
        //设置项目的JDK版本,项目的JDK为14及以上时建议设置该项,小于14则可以不设置
//        globalConfig.setEntityJdkVersion(17);

        //设置生成 controller
        globalConfig.setControllerGenerateEnable(true);
        //设置生成 service
        globalConfig.setServiceGenerateEnable(true);
        //设置生成 serviceImpl
        globalConfig.setServiceImplGenerateEnable(true);
        //设置生成 mapper
        globalConfig.setMapperGenerateEnable(true);
        //设置生成 mapperXml
        globalConfig.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 并启用 Lombok
        globalConfig.enableEntity()
                .setWithLombok(true);
//                .setJdkVersion(17);

        //设置生成 mapper
        globalConfig.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-test
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.zaxxer.hikari.HikariDataSource
mybatis-flex:
  mapper-locations: classpath:/mapper/**/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.2 代码中进行配置

@Configuration
public class MybatisFlexConfig implements
        ConfigurationCustomizer,
        SqlSessionFactoryBeanCustomizer,
        MyBatisFlexCustomizer {
    @Override
    public void customize(FlexConfiguration flexConfiguration) {
        System.out.println("Mybatis Configuration 配置!");
    }

    @Override
    public void customize(SqlSessionFactoryBean sqlSessionFactoryBean) {
        System.out.println("sqlSessionFactoryBean 配置");

    }

    @Override
    public void customize(FlexGlobalConfig flexGlobalConfig) {
        System.out.println("MyBatis Flex 配置");
    }
}

配置文件运行顺序如下所示:

后续继续更新!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐