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 })