环境: JDK17 springboot 3.2.4 durid 1.2.23
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.23</version>
</dependency>
新建数据连接配置类(其它数据源参考下方配置即可)
@SpringBootConfiguration
@MapperScan(basePackages = {"com.galaxy.**.db.mapper"}, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class DruidConfiguration {}
- 通常在单数据源项目中我们习惯于配置MapperScan在启动类中,且sqlSessionFactoryRef未做指定(未作指定会读取服务中唯一的factory或标记了@Primary的factory)
- masterSqlSessionFactory 在下面配置sqlSessionFactor时指明bean的名称相同即可。
- 那么在多数据源下可以配置在各自的配置文件中方便维护。
- 多数据源下可以对以下相同的bean添加@Primary标记主数据源。
- 数据源配置
@Bean(name = "masterDataSource")
public DataSource masterDataSource() {
return buildDataSource(url, username, password);
}
构建数据源公共方法
public DataSource buildDataSource(String url,String username,String password) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUsername(username));
dataSource.setPassword(password);
//初始连接数
dataSource.setInitialSize(1);
//最大连接数
dataSource.setMaxActive(20);
//最小连接数
dataSource.setMinIdle(5);
//获取连接等待超时时间
dataSource.setMaxWait(60000);
//间隔60秒检测一次需要关闭的空闲连接
dataSource.setTimeBetweenEvictionRunsMillis(60000);
//一个连接在池中的最小生存时间30秒
dataSource.setMinEvictableIdleTimeMillis(30000);
//打开PSCache
dataSource.setPoolPreparedStatements(true);
//指定每个连接上PSCache的大小
dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
return dataSource;
}
- 事务配置
@Bean(name = "masterTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
- SqlSessionFactory 配置
mybatis的配置需要在这里配置进去,比如前面提到的自定义的插件(Mybatis SQL自定义拦截器)
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
return buildSqlSessionFactory(dataSource, "classpath*:mappers/*Mapper.xml", );
}
构建sqlSessionFactory公共方法
- locationPattern: mybatis xml sql的文件地址。
- MybatisSqlInterceptor:是我们之前介绍的自定义sql拦截器
- PaginationInnerInterceptor:是mybatis的分页插件,可以自己注入Bean修改分页插件配置,如默认的单页限制500可以自定义单页数 setLimit(size)
- MybatisMetaObjectHandler: 自定义的实现MetaObjectHandler接口,覆写其中的insertFill和updateFill方法配合实体类属性上标注的注解@TableField(fill = FieldFill.INSERT_UPDATE)实现字段属性值填充
public SqlSessionFactory buildSqlSessionFactory(DataSource dataSource, String locationPattern) {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
//数据源
sessionFactory.setDataSource(dataSource);
//xml文件路径
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources(locationPattern));
//mybatis日志和驼峰
MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
mybatisConfiguration.setLogImpl(StdOutImpl.class);
mybatisConfiguration.setMapUnderscoreToCamelCase(true);
sessionFactory.setConfiguration(mybatisConfiguration);
//分页插件、自定义的sql拦截插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
sessionFactory.setPlugins(interceptor, new MybatisSqlInterceptor());
//设置实体类填充字段值的mybatis拦截器
GlobalConfig globalConfig = GlobalConfigUtils.defaults();
globalConfig.setMetaObjectHandler(new MybatisMetaObjectHandler());
sessionFactory.setGlobalConfig(globalConfig);
return sessionFactory.getObject();
}
- SqlSessionTemplate 配置
@Bean(name = "masterSqlSessionTempalte")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
可以使用sqlSessionTemplate执行xml sql中的方法
//namespace是xml中配置的<mapper namespace = "com.galaxy.**"> methold是具体的方法标签中的id值 <select id="selectList">
sqlSessionTemplate.selectList("namespace.methold",params);