MyBatis-Plus —— 代码生成与多数据源

前言

        在这篇文章中,荔枝主要梳理了MyBatis-Plus中的代码生成与多数据源的使用,基本操作相对来说比较简单,官网上也有详细教程,当荔枝还是梳理一下,希望能够帮助到有需要的小伙伴~~~


文章目录

前言

一、通用枚举

二、代码生成器

三、多数据源

3.1 多数据源环境的配置

3.2 多数据源的应用

总结


一、通用枚举

当某些字段值是固定的,例如性别,可以使用MyBatis-Plus的通用枚举来实现。

设置枚举类

 @EnumValue:将注解锁标识的属性的值存储在数据库中,如果不加该注解且没开启枚举扫描,则数据库插入的默认是MALE | FEMALE。

package com.crj.mybatisplus_test.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;

@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;
    }
}

配置文件中设置扫描通用枚举

mybatis-plus:
  #设置扫描通用枚举
  type-enums-package: com.crj.mybatisplus_test.enums

测试类

package com.crj.mybatisplus_test;

import com.crj.mybatisplus_test.enums.SexEnum;
import com.crj.mybatisplus_test.mapper.UserMapper;
import com.crj.mybatisplus_test.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class MyBatisPlusEnumTset {
    @Autowired
    private UserMapper userMapper;
    @Test
    public void test(){
        User user = new User();
        user.setName("CRJ");
        user.setAge(21);
        user.setSex(SexEnum.MALE);
        int result = userMapper.insert(user);
        System.out.println("result:"+result);
    }
}

实体类

package com.crj.mybatisplus_test.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.crj.mybatisplus_test.enums.SexEnum;
import lombok.*;

//使用Lombok简化开发加上无参构造方法、有参构造
//@NoArgsConstructor
//@AllArgsConstructor
//@Getter
//@Setter
//@EqualsAndHashCode
@Data
@TableName("t_user")
public class User {
    @TableId(value = "uid",type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

    private SexEnum sex;

}

二、代码生成器

与MyBatis的逆向工程不同,MyBatis-Plus的代码生成器可以通过表生成控制层、业务层、持久层、映射文件以及mapper接口。

添加代码生成器的依赖

<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>

执行官网的快速生成demo

package com.crj.mybatisplus_test;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

public class FastAutoGeneratorTest {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&userSSL=false", "username", "password")
                .globalConfig(builder -> {
                    builder.author("CRJ") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D://mybatis_plus"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.crj") // 设置父包名
                            .moduleName("mybatisplus") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://mybatis_plus")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("t_user") // 设置需要生成的表名
                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}

三、多数据源

        多数据源既动态数据源,项目开发逐渐扩大,单个数据源、单一数据源已经无法满足需求项目的支撑需求,比如多种类型库、一主多从和混合模式等,由此延伸了多数据源的扩展。多数据源的操作在日常的开发场景中也比较常见,下面看看多数据源环境下我们如何来操作数据。

3.1 多数据源环境的配置

首先在配置文件中添加开启多数据源的环境依赖 

<!--多数据源的依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

配置数据源:对于是多库、一主多从还是混合模式的结构可以参考官方文档,这里给出的是一主多从。 

spring:
  #配置数据源信息
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&userSSL=false
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://localhost:3306/mybatis_plus_1?serverTimezone=GMT%2B8&characterEncoding=utf-8&userSSL=false
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: ENC(xxxxx) # 内置加密,使用请查看详细文档,文档需要付费!
          username: ENC(xxxxx)
          password: ENC(xxxxx)
          driver-class-name: com.mysql.jdbc.Driver
        #......省略
        #以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2

3.2 多数据源的应用

实体类

package com.crj.mybatisPlusDatasource.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("t_user")
public class User {
    @TableId(value = "uid",type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;

}

mapper接口 

mapper接口同样需要继承MyBatis-Plus中集成的有关CRUD的数据库操作的接口BaseMapper,继承相关的CRUD代码。 

package com.crj.mybatisPlusDatasource.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.crj.mybatisPlusDatasource.pojo.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> {
}

service接口

service接口需要继承MyBatis-Plus的IService接口以得到有关数据操作的类方法。 

package com.crj.mybatisPlusDatasource.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.crj.mybatisPlusDatasource.pojo.User;
import org.springframework.stereotype.Service;

public interface UserService extends IService<User> {
}

service接口实现类

注意这里使用@DS来声明该实体类接口使用的是哪个数据源! 

package com.crj.mybatisPlusDatasource.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.crj.mybatisPlusDatasource.mapper.UserMapper;
import com.crj.mybatisPlusDatasource.pojo.User;
import com.crj.mybatisPlusDatasource.service.UserService;
import org.springframework.stereotype.Service;

@Service
@DS("master")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

同创建User实体类使用相同步骤创建一个Product实体类,并在测试类中测试是否成功开启多数据源。

Service层和Mapper层接口区别

        简单理解其实mapper层接口就是继承BaseMapper接口实现基础的CRUD功能,而Service则通常通常定义了应用程序的业务逻辑方法,提供了对数据的高层次抽象。Service层接口实现类通过调用BaseMapper接口中的基本的CRUD操作实现业务逻辑。


总结

        终于,MyBatis-Plus阶段性的学习结束了,荔枝又可以回到项目的学习哈哈哈哈。最近荔枝有点焦虑哈哈,觉得自己有点着急,还是得花时间复盘一下这段时间的学习,扎实基础,就从软件设计模式和设计原则学起吧~~~

今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~

猜你喜欢

转载自blog.csdn.net/qq_62706049/article/details/132677044