修改原生的YML配置,采取自定义模式,
依赖
1 | <properties> |
配置
创建Bean的注入方式,使用 @ConditionalOnMissingClass 注解 进行判断bean是否存在,
如不存在则加载当前默认bean,如存在则使用配置bean.
MybatisDataConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.stereotype.Component;
/**
* author :demon
* date :2022 2022/3/18 15:41
* desc :自定义bean
*/
@Data
@Component(value = "mybatisDataConfig")
@ConditionalOnMissingClass(value = "mybatisDataConfig")
public class MybatisDataConfig {
private String driverClassName;
private String jdbcUrl;
private String username;
private String password;
private String poolName = "DataSource_HikariCP";
private long connectionTimeoutMs = 30000;
private long idleTimeoutMs = 300000;
private long validationTimeoutMs = 5000;
private long maxLifetimeMs = 1800000;
private int maxPoolSize = 20;
private int minIdle = 5;
private String typeAliasesPackage = "**.database.entity";
private String locationPattern = "classpath*:/mapper/*Mapper.xml";
}DataSourceConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* author :demon
* date :2021 2021/8/27 13:54
* desc :数据库
*/
@Slf4j
@Component
public class DataSourceConfig {
@Resource(name = "mybatisDataConfig")
private MybatisDataConfig mybatisDataConfig;
@Bean(name = "dataSource")
@Primary
public DataSource getDataSource() {
System.out.println("★★★★★配置 dataSource ★★★★★");
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(mybatisDataConfig.getDriverClassName());
hikariConfig.setJdbcUrl(mybatisDataConfig.getJdbcUrl());
hikariConfig.setUsername(mybatisDataConfig.getUsername());
hikariConfig.setPassword(mybatisDataConfig.getPassword());
// 自定义连接池名称
hikariConfig.setPoolName(mybatisDataConfig.getPoolName());
hikariConfig.setReadOnly(false);
// 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒
hikariConfig.setConnectionTimeout(mybatisDataConfig.getConnectionTimeoutMs());
// 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟
hikariConfig.setIdleTimeout(mybatisDataConfig.getIdleTimeoutMs());
// 验证与数据库连接的有效时间
hikariConfig.setValidationTimeout(mybatisDataConfig.getValidationTimeoutMs());
// 建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';)
hikariConfig.setMaxLifetime(mybatisDataConfig.getMaxLifetimeMs());
// 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count)
hikariConfig.setMaximumPoolSize(mybatisDataConfig.getMaxPoolSize());
// 连接池中维护的最小空闲连接数
hikariConfig.setMinimumIdle(mybatisDataConfig.getMinIdle());
// 从池返回的连接的默认自动提交行为。默认值为true
hikariConfig.setAutoCommit(true);
// 如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性
hikariConfig.setConnectionTestQuery("SELECT 1");
return new HikariDataSource(hikariConfig);
}
}MybatisPlusConfig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.autoconfigure.SpringBootVFS;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.AutoMappingBehavior;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.type.JdbcType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* className MybatisPlusConfig
* author demon
* createTime 2021/5/21 18:15
* description mybatis-plus 配置
*/
@Slf4j
@Component
@EnableTransactionManagement
public class MybatisPlusConfig {
@Resource(name = "mybatisDataConfig")
private MybatisDataConfig mybatisDataConfig;
@Resource
private DataSource dataSource;
/**
* 分页插件
* paginationInterceptor.setLimit(你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制);
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
paginationInterceptor.setOverflow(true);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(-1);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
/**
* 将yml配置代码化
*/
@Bean
@Primary
public MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean() throws Exception {
//一定要使用 MybatisSqlSessionFactoryBean否则Statement not bound错误
System.out.println("★★★★★配置 MybatisSqlSessionFactoryBean ★★★★★");
MybatisSqlSessionFactoryBean mybatisPlus = new MybatisSqlSessionFactoryBean();
//加载数据源 此处配置为关键配置,如果没有将 dataSource 作为数据源则不能实现切换
mybatisPlus.setDataSource(dataSource);
mybatisPlus.setVfs(SpringBootVFS.class);
// 配置 configuration
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
configuration.setJdbcTypeForNull(JdbcType.NULL);
// 映射器缓存
configuration.setCacheEnabled(false);
// 查询时,关闭关联对象即时加载以提高性能
configuration.setLazyLoadingEnabled(false);
// 不允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值), 数据表的PK生成策略将被覆盖
configuration.setUseGeneratedKeys(false);
// 对于批量更新操作缓存SQL以提高性能 SIMPLE, REUSE, BATCH
configuration.setDefaultExecutorType(ExecutorType.REUSE);
// 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果
configuration.setMultipleResultSetsEnabled(true);
// 允许使用列标签代替列名
configuration.setUseColumnLabel(true);
// 解决mybatis空字段null字段不返回
configuration.setCallSettersOnNulls(true);
// 给予被嵌套的resultMap以字段-属性的映射支持 NONE, FULL,PARTIAL
configuration.setAutoMappingBehavior(AutoMappingBehavior.PARTIAL);
// 日志
configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);
mybatisPlus.setConfiguration(configuration);
// 添加分页功能
mybatisPlus.setPlugins(paginationInterceptor());
//加载 mybatis-plus 全局配置
GlobalConfig globalConfig = new GlobalConfig();
GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
// 默认为自增
dbConfig.setIdType(IdType.AUTO);
// 全局的表前缀策略配置
globalConfig.setDbConfig(dbConfig);
mybatisPlus.setGlobalConfig(globalConfig);
//指定 pojo 目录 ,扫描Model
mybatisPlus.setTypeAliasesPackage(mybatisDataConfig.getTypeAliasesPackage());
// Mapper包路径, 扫描映射文件
mybatisPlus.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mybatisDataConfig.getLocationPattern()));
return mybatisPlus;
}
}