*
* 例如设置url,DruidDataSource内部url的字段为jdbcUrl,但对应的set方法为setUrl,因此配置的key为vivo.jdbc.demo.dataSource.url。
* <p>
* 如果要构建多个DataSource(如连多个数据库),请写多个类似的DataSourceWrapper类,并使用不同的配置前缀用以区分,比如这里的配置前缀是jdbc.demo
* <p>
* 如果是纯粹的spring环境,此处请主动取配置值,然后设置到DruidDataSource
jdbc.xxxx:前缀,会读取该前缀的配置并设置到DruidDataSource中,比如 用户名、密码、url
*/
@ConfigurationProperties("jdbc.xxxx")
public class ApptrackDbDataSourceWrapper {
private final DruidDataSource dataSource = new DruidDataSource();
//需提供get方法,用于spring boot注入属性时获取复杂对象类型的属性
public DruidDataSource getDataSource() {
return dataSource;
}
}
* 如果是连接多个数据库,建议每个数据库一个此配置类
*/
@Slf4j
@Configuration
@EnableConfigurationProperties(xxxxDbDataSourceWrapper.class)
@Import(xxxxMybatisConfiguration.xxxDaoAutoGenerator.class)
public class xxxMybatisConfiguration {
private static final String SQL_SESSION_FACTORY_BEAN_NAME = "apptrackSqlSessionFactory";
/**
* 定义 initMethod字段,使用前初始化。
* 入参wrapper如果需要指定bean的名字,根据spring boot生成规则,其bean的name为'配置前缀'-'类全限定名
*/
@Primary
@Bean(name = "xxxDataSource")
public DataSource dataSource(ApptrackDbDataSourceWrapper wrapper) {
CheckUtil.checkJarConflict();
log.info("xxxDataSource url:{}", wrapper.getDataSource().getUrl());
return wrapper.getDataSource();
}
/**
* 提倡尽可能少的xml配置,所以以下只设置了sql映射文件的地址,不设置mybatis-config.xml文件
*/
@Bean(SQL_SESSION_FACTORY_BEAN_NAME)
public SqlSessionFactory sqlSessionFactory(@Qualifier("xxxDataSource") DataSource ds) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//设置数据源
factoryBean.setDataSource(ds);
factoryBean.setPlugins(new Interceptor[]{new PageInterceptor()});
//设置sql映射文件
PathMatchingResourcePatternResolver pmrpr = new PathMatchingResourcePatternResolver();
String pattern = "classpath*:META-INF/mapper/**/*.xml";
Resource[] configResource = pmrpr.getResources(pattern);
log.debug("all mappers:{}", Arrays.asList(configResource));
factoryBean.setMapperLocations(configResource);
return factoryBean.getObject();
}
public static class xxxDaoAutoGenerator implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
scanner.setSqlSessionFactoryBeanName(SQL_SESSION_FACTORY_BEAN_NAME);
scanner.registerFilters();
//扫描自动生成dao类
scanner.scan("com.xxx.internet.xxx.dal.mapper");
}
}
}```