🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
分别做过通用mapper和mybatis plus的多数据源, mybatis plus的很简单 # mybatis plus 版本 启动类 不加这个会提示 url 啥的报错 ``` @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) ``` 配置(这块用mybatisplus官网的) ``` spring: datasource: dynamic: primary: master0 #设置默认的数据源或者数据源组,默认值即为master strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源 datasource: master0: url: username: password: driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置 master1: url: username: password: driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置 ``` // 使用的不是 primary 指定的数据源, 需要在service 层类上增加 @DS("master1") @DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。 没有@DS 默认数据源(primary 指定的) @DS("dsName") dsName可以为组名也可以为具体某个库的名称 primary 设置时注意内容, 我这边出现的问题: 这样配置导致 连接 master 数据源的代码提示 master 表数据表不存在, 但是连接的数据库显示的是 master_1, ``` datasource: dynamic: primary: master strict: false datasource: master: 其他省略 master_1: 其他省略 ``` maven 依赖 ``` <!-- 多数据源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.3.1</version> </dependency> ``` 低版本(3.3.0及以下) dynamic-datasource-spring-boot-starter 开发没问题, 在使用jar包启动时, 会报错 java.lang.NoClassDefFoundError:io/seata/rm/datasource/SeataDataSourceProxy # 通用mapper 项目使用mysql 做主数据源, 甲方提供了SqlServer的视图让我们连接同步部分数据 只有主数据源使用通用mapper , 其他数据源直接通过自己写的sql使用 **通用mapper 扫描包 使用 import tk.mybatis.spring.annotation.MapperScan; ** 不然通用mapper的语句都会报错 没找到xxx实体类 主数据源 ``` import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import tk.mybatis.spring.annotation.MapperScan; import javax.sql.DataSource; /** * mysql 的数据源连接配置 */ @Configuration @MapperScan(basePackages = {"com.*.dao"}, sqlSessionFactoryRef = "dbSqlSessionFactory") public class DbDataSource { @Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源) @Bean("dbPrimaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.mysql-db") //读取application.yml中的配置参数映射成为一个对象 public DataSource getDbDataSource(){ return DataSourceBuilder.create().build(); } @Primary @Bean("dbSqlSessionFactory") public SqlSessionFactory dbSqlSessionFactory(@Qualifier("dbPrimaryDataSource") DataSource dataSource, org.apache.ibatis.session.Configuration configuration) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // mapper的xml文件位置,不然将报错:Invalid bound statement (not found) // 注意路径 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); // 解决xml字段到bean属性名驼峰命名转换失效的问题 // 要换成下面的第二种 // bean.setConfiguration(configuration); return bean.getObject(); } @Primary @Bean("dbSqlSessionTemplate") public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("dbSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } // 读取 yml 中的 mybatis 配置 @Bean @ConfigurationProperties(prefix = "mybatis.configuration") public org.apache.ibatis.session.Configuration globalConfiguration() { return new org.apache.ibatis.session.Configuration(); } } ``` 其他数据源, 多个就多个本文件 ``` import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.sql.DataSource; /** * sql server 的视图数据源连接配置 */ @Configuration @MapperScan(basePackages = "com.*.sqlserverDao", sqlSessionFactoryRef = "sqlserverDbSqlSessionFactory") public class SqlserverDbDataSourceConfig { @Bean("sqlserverDbDataSource") // 和 yml 对应 @ConfigurationProperties(prefix = "spring.datasource.sqlserver-db") public DataSource getSqlserverDataSource() { return DataSourceBuilder.create().build(); } @Bean("sqlserverDbSqlSessionFactory") public SqlSessionFactory db1SqlSessionFactory(@Qualifier("sqlserverDbDataSource") DataSource dataSource, org.apache.ibatis.session.Configuration configuration) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // mapper的xml文件位置,不然将报错:Invalid bound statement (not found) // 注意路径 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml")); // 解决xml字段到bean属性名驼峰命名转换失效的问题 // 因为只有主数据源使用了, 其他数据源这里是否有效未测试 // 要换成下面的第二种 // bean.setConfiguration(configuration); return bean.getObject(); } @Bean("sqlserverDbSqlSessionTemplate") public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("sqlserverDbSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` yml 配置 ``` 单数据源时 spring: datasource: 这里配置数据库相关 多数据源 spring: datasource: # 主数据源 mysql-db: # mysql-db 和 配置文件对应 这里配置数据库相关 # 其他数据源 sqlserver-db: 这里配置数据库相关 ``` 启动类 ``` @MapperScan(basePackages = {"com.*.dao", "com.*.sqlserverDao"}) ``` 第二种 驼峰命名转换失效, 除了使用读取yml配置, 还可以使用 ``` @Primary @Bean("dbSqlSessionFactory") public SqlSessionFactory dbSqlSessionFactory(@Qualifier("dbPrimaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); // mapper的xml文件位置,不然将报错:Invalid bound statement (not found) // 注意路径 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); // 解决xml字段到bean属性名驼峰命名转换失效的问题 SqlSessionFactory object = bean.getObject(); org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); if (object == null) { configuration = new org.apache.ibatis.session.Configuration(); } else { configuration = object.getConfiguration(); if (configuration == null) { configuration = new org.apache.ibatis.session.Configuration(); } } configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); return bean.getObject(); } ```