application.yml
spring : datasource : ### 会员数据库 member : jdbc-url : jdbc:mysql://localhost:3306/user username : root password : root driver-class-name : com.mysql.jdbc.Driver ### 订单数据库 order : jdbc-url : jdbc:mysql://localhost:3306/order username : root password : root driver-class-name : com.mysql.jdbc.Driver
备注:如果是SpringBoot2配置多数据源 ,报如下错误:
“jdbcUrl is required with driverClassName.”或者Cause: java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.] with root cause
解决方案:
spring.datasource.url 和spring.datasource.driverClassName,换成
spring.datasource.jdbc-url和spring.datasource.driver-class-name
数据库 数据源相关配置
会员数据源
@Configuration @MapperScan (basePackages = "com.member.mapper" , sqlSessionFactoryRef = "memberSqlSessionFactory" ) public class MemberDataSourceConfig { /** * 将会员 db 注册到容器中 * * @return */ @Bean (name = "memberDataSource" ) @ConfigurationProperties (prefix = "spring.datasource.member" ) public DataSource memberDataSource() { return DataSourceBuilder. create ().build(); } /** * 将会员 SqlSessionFactory 注册到容器中 * * @param dataSource * @return * @throws Exception */ @Bean (name = "memberSqlSessionFactory" ) public SqlSessionFactory memberSqlSessionFactory( @Qualifier ( "memberDataSource" ) DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(memberDataSource()); return sqlSessionFactoryBean.getObject(); } /** * 创建会员管理器 * * @param dataSource * @return */ @Bean (name = "memberTransactionManager" ) public DataSourceTransactionManager memberTransactionManager( @Qualifier ( "memberDataSource" ) DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 创建订单 sqlSesion 模版 * * @param sqlSessionFactory * @return * @throws Exception */ @Bean (name = "memberSqlSessionTemplate" ) public SqlSessionTemplate menberSqlSessionTemplate( @Qualifier ( "memberSqlSessionFactory" ) SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
订单数据源
@Configuration @MapperScan (basePackages = "com.order.mapper" , sqlSessionFactoryRef = "orderSqlSessionFactory" ) public class OrderDataSourceConfig { /** * 将订单 db 注册到容器中 * * @return */ @Bean (name = "orderDataSource" ) @ConfigurationProperties (prefix = "spring.datasource.order" ) public DataSource orderDataSource() { return DataSourceBuilder. create ().build(); } /** * 将订单 SqlSessionFactory 注册到容器中 * * @param dataSource * @return * @throws Exception */ @Bean (name = "orderSqlSessionFactory" ) public SqlSessionFactory orderSqlSessionFactory( @Qualifier ( "orderDataSource" ) DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(orderDataSource()); return sqlSessionFactoryBean.getObject(); } /** * 创建订单管理器 * * @param dataSource * @return */ @Bean (name = "orderTransactionManager" ) public DataSourceTransactionManager orderTransactionManager( @Qualifier ( "orderDataSource" ) DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } /** * 创建订单 sqlSesion 模版 * * @param sqlSessionFactory * @return * @throws Exception */ @Bean (name = "orderSqlSessionTemplate" ) public SqlSessionTemplate menberSqlSessionTemplate( @Qualifier ( "orderSqlSessionFactory" ) SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
4.4.2创建分包 Mapper
会员 mapper
public interface MemberMapper { @Insert ( "insert into users values(null,#{name},#{age});" ) public int addUser( @Param ( "name" ) String name, @Param ( "age" ) Integer age); }
订单 mapper
public interface OrderMapper { @Insert ( "insert into order_number values(null,#{number});" ) int inserOrder( @Param ( "number" ) String number); }
如果多数据源使用事务报错的话
cted single matching bean but found 2: memberTransactionManager,orderTransactionManager
@Transactional(transactionManager = "memberTransactionManager")
明确指定使用那个事务管理器即可
@EnableConfigurationProperties ({OrderConfig. class , MemberConfig. class })