文章目录
- 前言
 - 多数据源 使用 mybatis-plus-generator 3.5.1版本进行代码生成
 - 1. 说明
 - 2. 添加依赖
 - 2.1. mybatis-plus-generator 自动生成依赖
 - 2.2. 多数据源依赖
 - 2.3. 建立新项目的完全pom.xml
 
- 3. application.yml 多数据源配置 + mybatis-plus-generator配置
 - 4. 创建一个MybatisPlusGeneratorTest单元测试类进行代码生成
 - 5. 当前项目结构
 - 6. 使用mybatis-plus-generator 进行代码生成
 - 6.1. mybatis-plus-generator 官方文档代码生成结构
 - 6.2. 生成示例
 - 6.3. 完整MybatisPlusGeneratorTest单元测试类对one数据源进行代码生成测试
 - 6.4. 完整MybatisPlusGeneratorTest单元测试类对two数据源进行代码生成测试
 
前言
  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
多数据源 使用 mybatis-plus-generator 3.5.1版本进行代码生成
1. 说明
我打算在一个项目中引入两个数据源,然后分表进行代码生成,集成到项目中。
2. 添加依赖
2.1. mybatis-plus-generator 自动生成依赖
        <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>
        
        <!--velocity-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        
 
2.2. 多数据源依赖
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
 
2.3. 建立新项目的完全pom.xml
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>5.7.0</version>
            <scope>test</scope>
        </dependency>
        <!--	以下是代码自动生成器 -start-->
        <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>
        
        <!--velocity-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        <!-- 工具类相关 start -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.15</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.1-jre</version>
        </dependency>
        <dependency>
            <groupId>com.github.dozermapper</groupId>
            <artifactId>dozer-core</artifactId>
            <version>6.1.0</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <!-- 工具类相关 end -->
        <!-- 数据源 start-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <!-- 数据源 end-->
        <!--swagger-->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.6.3</version>
        </dependency>
    </dependencies>
 
3. application.yml 多数据源配置 + mybatis-plus-generator配置
server:
  port: 13146  # 默认端口
  tomcat:
    uri-encoding: UTF-8
spring:
  datasource:
    dynamic:
      primary: one
      druid:
        initial-size: 20
        min-idle: 20
        maxActive: 200
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 50
        filters: stat,wall,slf4j
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      datasource:
        one:
          url: jdbc:mysql://localhost:3306/TESTONEDB?characterEncoding=UTF-8&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
          username: TESTONE
          password: TESTONE
          driver-class-name: com.mysql.cj.jdbc.Driver
        two:
          url: jdbc:mysql://localhost:3306/TESTTWODB?characterEncoding=UTF-8&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
          username: TESTTWO
          password: TESTTWO
          driver-class-name: com.mysql.cj.jdbc.Driver
#mybatis plus 设置
mybatis-plus:
  mapper-locations: classpath*:mapper/*/*Mapper.xml
  global-config:
    # 关闭MP3.0自带的banner
    banner: false
    db-config:
      #主键类型  0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)";
      id-type: ASSIGN_ID
      # 默认数据库表下划线命名
      table-underline: true
  configuration:
    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 返回类型为Map,显示null对应的字段
    call-setters-on-nulls: true
 
4. 创建一个MybatisPlusGeneratorTest单元测试类进行代码生成
/**
* @description: 代码生成
* @author yangzhenyu
* @date 2023/4/24 14:21
* @version 1.0
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoXxlJob.class)
@Slf4j
public class MybatisPlusGeneratorTest {
}
 
5. 当前项目结构

6. 使用mybatis-plus-generator 进行代码生成
6.1. mybatis-plus-generator 官方文档代码生成结构

6.2. 生成示例
//配置数据源
        FastAutoGenerator.create(url, username, password)
                //2、全局配置
                .globalConfig(builder -> {
                    builder.author("yangzhenyu") // 设置作者名
                            //设置输出路径:项目的 java 目录下
                            .outputDir(System.getProperty("user.dir") + "/src/main/java")
                            //注释日期
                            .commentDate("yyyy-MM-dd hh:mm:ss")
                            //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
                            .dateType(DateType.ONLY_DATE)
                            //覆盖之前的文件
                            .fileOverride()
                            //开启 swagger 模式
                            .enableSwagger()
                            //禁止打开输出目录,默认打开
                            .disableOpenDir();
                })
                //3、包配置
                .packageConfig(builder -> {
                    builder.parent("org") // 设置父包名
                            //设置模块包名
                            .moduleName("example")
                            //pojo 实体类包名
                            .entity(entity)
                            //Service 包名
                            .service("service")
                            // ***ServiceImpl 包名
                            .serviceImpl("service.impl")
                            //Mapper 包名
                            .mapper(mapper)
                            //Mapper XML 包名
                            .xml(mapper)
                            //Controller 包名
                            .controller("controller")
                            //自定义文件包名
                            .other("utils")
                            //配置 mapper.xml 路径信息:项目的 resources 目录下
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, StringUtils.join(System.getProperty("user.dir"),"/src/main/resources/mapper/",dbFlag))) ;
                })
                //4、策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tables) // 设置需要生成的数据表名
                            //.addTablePrefix("t_", "c_") // 设置过滤表前缀
                            //=============================
                            //Mapper策略配置
                            //=============================
                            .mapperBuilder()
                            //设置父类
                            .superClass(BaseMapper.class)
                            //格式化 mapper 文件名称
                            .formatMapperFileName("%sMapper")
                            //开启 @Mapper 注解
                            .enableMapperAnnotation()
                            //格式化 Xml 文件名称
                            .formatXmlFileName("%sXml")
                            //=============================
                            //servic类策略配置
                            //=============================
                            .serviceBuilder()
                            //格式化 service 接口文件名称,%s进行匹配表名,如 UserService
                            .formatServiceFileName("%sService")
                            //格式化 service 实现类文件名称,%s进行匹配表名,如 UserServiceImpl
                            .formatServiceImplFileName("%sServiceImpl")
                            //=============================
                            //实体类策略配置
                            //=============================
                            .entityBuilder()
                            .enableLombok() //开启 Lombok
                            //不实现 Serializable 接口,不生产 SerialVersionUID
                            //.disableSerialVersionUID()
                            //逻辑删除字段名
                            .logicDeleteColumnName("deleted")
                            //数据库表映射到实体的命名策略:下划线转驼峰命
                            .naming(NamingStrategy.underline_to_camel)
                            //数据库表字段映射到实体的命名策略:下划线转驼峰命
                            .columnNaming(NamingStrategy.underline_to_camel)
                            //添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间
                            .addTableFills(
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("modify_time", FieldFill.INSERT_UPDATE
                                    )
                            )
                            // 开启生成实体时生成字段注解
                            .enableTableFieldAnnotation()
                            //=============================
                            //Controller策略配置
                            //=============================
                            .controllerBuilder()
                            //格式化 Controller 类文件名称,%s进行匹配表名,如 UserController
                            .formatFileName("%sController")
                            //开启生成 @RestController 控制器
                            .enableRestStyle();
                })
                //模板
                .templateEngine(new VelocityTemplateEngine())
                //执行
                .execute();
 
上面都有注释,可以根据你自己项目的情况,进行改造。
6.3. 完整MybatisPlusGeneratorTest单元测试类对one数据源进行代码生成测试
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.ds.ItemDataSource;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.example.DemoXxlJob;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Collections;
/**
* @description: 代码生成
* @author yangzhenyu
* @date 2023/4/24 14:21
* @version 1.0
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoXxlJob.class)
@Slf4j
public class MybatisPlusGeneratorTest {
    @Autowired
    private DynamicRoutingDataSource dataSource;
    //代码生成
    @Test
    public void test(){
        //数据源选择
        final String dbFlag = "one";
        //实体包路径
        String entity = StringUtils.join("entity",".",dbFlag);
        //mapper 路径
        String mapper = StringUtils.join("mapper",".",dbFlag);
        String username = ((DruidDataSource)((ItemDataSource) dataSource.getDataSource(dbFlag)).getRealDataSource()).getUsername();
        String password = ((DruidDataSource)((ItemDataSource) dataSource.getDataSource(dbFlag)).getRealDataSource()).getPassword();
        String url = ((DruidDataSource)((ItemDataSource) dataSource.getDataSource(dbFlag)).getRealDataSource()).getUrl();
        //需要生成的表
        String [] tables = new String[]{"test"};
        //配置数据源
        FastAutoGenerator.create(url, username, password)
                //2、全局配置
                .globalConfig(builder -> {
                    builder.author("yangzhenyu") // 设置作者名
                            //设置输出路径:项目的 java 目录下
                            .outputDir(System.getProperty("user.dir") + "/src/main/java")
                            //注释日期
                            .commentDate("yyyy-MM-dd hh:mm:ss")
                            //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
                            .dateType(DateType.ONLY_DATE)
                            //覆盖之前的文件
                            .fileOverride()
                            //开启 swagger 模式
                            .enableSwagger()
                            //禁止打开输出目录,默认打开
                            .disableOpenDir();
                })
                //3、包配置
                .packageConfig(builder -> {
                    builder.parent("org") // 设置父包名
                            //设置模块包名
                            .moduleName("example")
                            //pojo 实体类包名
                            .entity(entity)
                            //Service 包名
                            .service("service")
                            // ***ServiceImpl 包名
                            .serviceImpl("service.impl")
                            //Mapper 包名
                            .mapper(mapper)
                            //Mapper XML 包名
                            .xml(mapper)
                            //Controller 包名
                            .controller("controller")
                            //自定义文件包名
                            .other("utils")
                            //配置 mapper.xml 路径信息:项目的 resources 目录下
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, StringUtils.join(System.getProperty("user.dir"),"/src/main/resources/mapper/",dbFlag))) ;
                })
                //4、策略配置
                .strategyConfig(builder -> {
                    builder.addInclude(tables) // 设置需要生成的数据表名
                            //.addTablePrefix("t_", "c_") // 设置过滤表前缀
                            //=============================
                            //Mapper策略配置
                            //=============================
                            .mapperBuilder()
                            //设置父类
                            .superClass(BaseMapper.class)
                            //格式化 mapper 文件名称
                            .formatMapperFileName("%sMapper")
                            //开启 @Mapper 注解
                            .enableMapperAnnotation()
                            //格式化 Xml 文件名称
                            .formatXmlFileName("%sXml")
                            //=============================
                            //servic类策略配置
                            //=============================
                            .serviceBuilder()
                            //格式化 service 接口文件名称,%s进行匹配表名,如 UserService
                            .formatServiceFileName("%sService")
                            //格式化 service 实现类文件名称,%s进行匹配表名,如 UserServiceImpl
                            .formatServiceImplFileName("%sServiceImpl")
                            //=============================
                            //实体类策略配置
                            //=============================
                            .entityBuilder()
                            .enableLombok() //开启 Lombok
                            //不实现 Serializable 接口,不生产 SerialVersionUID
                            //.disableSerialVersionUID()
                            //逻辑删除字段名
                            .logicDeleteColumnName("deleted")
                            //数据库表映射到实体的命名策略:下划线转驼峰命
                            .naming(NamingStrategy.underline_to_camel)
                            //数据库表字段映射到实体的命名策略:下划线转驼峰命
                            .columnNaming(NamingStrategy.underline_to_camel)
                            //添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间
                            .addTableFills(
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("modify_time", FieldFill.INSERT_UPDATE
                                    )
                            )
                            // 开启生成实体时生成字段注解
                            .enableTableFieldAnnotation()
                            //=============================
                            //Controller策略配置
                            //=============================
                            .controllerBuilder()
                            //格式化 Controller 类文件名称,%s进行匹配表名,如 UserController
                            .formatFileName("%sController")
                            //开启生成 @RestController 控制器
                            .enableRestStyle();
                })
                //模板
                .templateEngine(new VelocityTemplateEngine())
                //执行
                .execute();
    }
}
 
其中:
        //数据库选择
        final String dbFlag = "one";
 
这部分是我们的数据库选择,对应application.yml这里:
 
要生成的表结构:
-- testtwodb.test definition
CREATE TABLE `test` (
  `ID` int(18) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `AGE` int(100) NOT NULL COMMENT '年龄',
  `NAME` varchar(100) DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='测试';
 
进行生成测试:
 
 
 
 然后我们改下mapper:
 之前的样子:
 
 改完的样子:
 
 改一个名字并加@DS(“one”),此注解代表的是使用哪个数据源的事务
接下来改一下实体类与XML:

 
修改一下名字。
 在这里我回答一下我为什么这么做,因为我偷懒了一下,这两个库的表结构都是一样的,所以得修改一下名字进行第二个数据源的生成。
6.4. 完整MybatisPlusGeneratorTest单元测试类对two数据源进行代码生成测试
将数据源改成two
 只修改下图红框处:
 
 执行单元测试:
 
 
 同样将two数据源生成的实体类、xml与mapper名字改一下
 
同时在TwoTestMapper 接口上添加@DS注解,表示事务为第二个数据源控制:
package org.example.mapper.two;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.example.entity.two.TwoTest;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * 测试 Mapper 接口
 * </p>
 *
 * @author yangzhenyu
 * @since 2023-04-24 05:33:06
 */
@DS("two")
@Mapper
public interface TwoTestMapper extends BaseMapper<TwoTest> {
}
 
最后一步,将service 下图红框处去掉:
 
 
这样我们就可以在此service中引用不同数据源的mapper进行不同数据源的操作。
/**
 * <p>
 * 测试 服务类
 * </p>
 *
 * @author yangzhenyu
 * @since 2023-04-24 05:33:06
 */
public interface TestService  {
}
/**
 * <p>
 * 测试 服务实现类
 * </p>
 *
 * @author yangzhenyu
 * @since 2023-04-24 05:33:06
 */
@Service
public class TestServiceImpl implements TestService {
    @Autowired
    private OneTestMapper oneTestMapper;
    @Autowired
    private TwoTestMapper twoTestMapper;
}
                

















