文章目录
- 前言
- 多数据源 使用 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;
}