MybatisPlus之通用枚举&代码生成器&多数据源

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

上一篇文章 :Mybatis-Plus 插件 - 掘金 (juejin.cn)

今天我们来了解MyBatisplus 的通用枚举和代码生成器和多数据源。

首先是通用枚举。

1、通用枚举

表中的有些字段值是固定的,例如性别(男或女),此时我们可以使用MyBatis-Plus的通用枚举来实现。

这里就以用户表里最常见的性别字段做演示。

然后就是创建通用枚举。

/**
 * @description:性别枚举类
 * @author: jie
 * @time: 2022/6/12 19:44
 */
@Getter
public enum SexEnum {

    MALE(1, "男"),
    FEMALE(2, "女");

    @EnumValue
    private Integer sex;
    private String sexName;

    SexEnum(Integer sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
    }

}
复制代码

注:

@EnumValue 这个注解的作用就是,用来区分将哪个属性的值加入到数据库中。

接下来就是配置扫描通用枚举类。

最后就是测试了。

上面我们直接将枚举设置到属性sex中,是因为我们的sex的类型就是 sexEnum。

2、 代码生成器

好了,通用枚举就介绍完毕了,接下来就是我,应该也是大家最喜欢的内容,代码生成器了吧!直接上步骤!

2.1 引入依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
复制代码

2.2 快速生成

/**
* @description: 代码生成器
* @author: jie
* @time: 2022/6/12 21:02
*/
public class FastAutoGeneratorTest {
    
    public static String getTables(String tip){
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }
    
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus? characterEncoding=utf-8&userSSL=false", "root", "1234")
            .globalConfig(builder -> {
                // 设置作者
                builder.author("JIE")
                    // 开启 swagger 模式
                    .enableSwagger()
                    // 覆盖已生成文件
                    .fileOverride()
                    // 指定输出目录
                    .outputDir("D://java//code//cloud//mp//src//main//java//com//jie//mpdemo//generate");
            }).packageConfig(builder -> {
            // 设置父包名
            builder.parent("com.jie")
                // 设置父包模块名
                .moduleName("mpdemo")
                // 设置mapperXml生成路径
                .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://java//code//cloud//mp//src//main//java//com//jie//mpdemo//generate//mybatis_plus"));
        }).strategyConfig(builder -> {
            builder.addInclude(getTables("表名,多个英文逗号分割").split(",")) // 设置需要生成的表名
                .addTablePrefix("t_", "c_"); // 设置过滤表前缀
        }).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker 引擎模板,默认的是Velocity引擎模板
            .execute();
    }
}
复制代码

3.3 效果展示:

这里,我个人习惯统一生成到一个包内,然后自己再拖入到相关模块中,不过大家可以根据自己的习惯来。

3、配置多数据源

适用于多种场景:纯粹多库、 读写分离、 一主多从、 混合模式等

目前我们就来模拟一个纯粹多库的一个场景,其他场景类似

场景说明:

我们创建两个库,分别为:mybatis_plus(以前的库不动)与mybatis_plus_1(新建),将

mybatis_plus库的product表移动到mybatis_plus_1库,这样每个库一张表,通过一个测试用例

分别获取用户数据与商品数据,如果获取到说明多库模拟成功。

3.1 创建数据库及表

创建数据库mybatis_plus_1和表product

CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
use `mybatis_plus_1`;
CREATE TABLE product
(
    id      BIGINT(20)  NOT NULL COMMENT '主键ID',
    name    VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',
    price   INT(11)          DEFAULT 0 COMMENT '价格',
    version INT(11)          DEFAULT 0 COMMENT '乐观锁版本号',
    PRIMARY KEY (id)
);
复制代码

添加测试数据

INSERT INTO product (id, NAME, price) VALUES (1, '外星人笔记本', 100);
复制代码

删除mybatis_plus库t_product表

use mybatis_plus;
DROP TABLE IF EXISTS t_product;
复制代码

然后记得去添加相关实体类。

3.2 引入依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
复制代码

3.3 配置多数据源

温馨提示

注释掉之前的数据库连接,添加新配置

server:
  port: 80
spring:
  application:
    name: mp
  datasource: # 配置数据源信息
    dynamic:
      primary: master # 设置默认的数据源或者数据源组,默认值即为master
      strict: false # 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url:  jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
          driver-class-name: com.mysql.cj.jdbc.Driver
          username: root
          password: 1234
        slave_1:
          url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
          driver-class-name: com.mysql.cj.jdbc.Driver
          username: root
          password: 1234
复制代码

3.4 创建service

1、用户

/**
 * @description: UserService继承IService模板提供的基础功能
 * @author: jie
 * @time: 2022/6/9 0:56
 */
public interface UserService extends IService<User> {
}
复制代码
/**
 * @description: ServiceImpl实现了IService,提供了IService中基础功能的实现 *
 * 若ServiceImpl无法满足业务需求,则可以使用自定的UserService定义方法,并在实现类中实现
 * @author: jie
 * @time: 2022/6/9 0:57
 */
//指定所操作的数据源
@DS("master")
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
复制代码

2、商品

/**
 * @description: 商品 service
 * @author: jie
 * @time: 2022/6/12 22:03
 */
public interface ProductService extends IService<Product> {
}
复制代码
@DS("slave_1")
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}
复制代码

3.5 测试

结果:

1、都能顺利获取对象,则测试成功

2、如果我们要实现读写分离,将写操作方法加上主库数据源,读操作方法加上从库数据源,自动切换,是不是就能实现读写分离?

猜你喜欢

转载自juejin.im/post/7108357394052169759