本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程《SpringBoot實戰教程》,主講人楊紅豔,
點選檢視視訊内容。
SpringBoot區分多資料源
在項目中,我們通常會進行資料庫拆分或是引入其他資料庫,進而我們需要配置多個資料源。
如何區分多個資料源:
- 通過包來區分:com.db1.mapper、com.db2.mapper
- 使用注解來區分:需要用到大量的注解,一般不推薦使用。
如何通過包名來區分多資料源
使用MySQL資料庫,架構是Mybatis。
在工程中導入依賴:
<!-- springboot內建mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
在全局配置檔案application.properties配置資料源
#SpringBoot整合多資料源
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db1.username=root
spring.datasource.db1.password=root
spring.datasource.db1.url=jdbc:mysql://localhost:3306/db1
spring.datasource.db5.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.db5.username=root
spring.datasource.db5.password=root
spring.datasource.db5.url=jdbc:mysql://localhost:3306/db5
為每個資料源進行配置:
建立包com.qianfeng.datasource,建立類DataSource1
@Configuration//注冊到Spring容器中
@MapperScan(basePackages="com.qianfeng.db1.mapper",sqlSessionFactoryRef="db1SqlSessionFactory")
public class DataSource1 {
//private DataSource1(){}
/**
* 配置db1資料庫
* @return
*/
@Bean(name="db1Datasource")
@ConfigurationProperties(prefix="spring.datasource.db1")
@Primary //指定預設的資料源
public DataSource testDatasource() {
return DataSourceBuilder.create().build();
}
/**
* 建立SqlSessionFactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name="db1SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1Datasource")DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
/**
* 配置事務管理
* @param dataSource
* @return
*/
@Bean(name="db1TransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(
@Qualifier("db1Datasource")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name="db1SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory")
SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
建立類DataSource2:
@Configuration
@MapperScan(basePackages="com.qianfeng.db5.mapper",sqlSessionFactoryRef="db5SqlSessionFactory")
public class DataSource2 {
/**
* 配置db5資料庫
* @return
*/
@Bean(name="db5Datasource")
@ConfigurationProperties(prefix="spring.datasource.db5")
public DataSource testDatasource() {
return DataSourceBuilder.create().build();
}
/**
* 建立SqlSessionFactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name="db5SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db5Datasource")DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//如果還有分頁等其他事務
// bean.setMapperLocations(new PathMatchingResourcePatternResolver().
// getResources("classpath:mybatis/test1/*.xml"));
return bean.getObject();
}
/**
* 配置事務管理
* @param dataSource
* @return
*/
@Bean(name="db5TransactionManager")
public DataSourceTransactionManager testTransactionManager(
@Qualifier("db5Datasource")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name="db5SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db5SqlSessionFactory")
SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
建立包:com.qianfeng.pojo,逆向生成user實體類和users實體類
建立包:com.qianfeng.db1.mapper,以users表為例
UsersMapper:
@Qualifier("db1SqlSessionFactory")
public interface UsersMapper {
@Insert("insert into users(name, password) values(#{name}, #{password})")
void addUser(@Param("name") String name, @Param("password")String password);
}
建立包:com.qianfeng.db1.service
public interface UsersService {
void saveUser(Users user);
}
UsersServiceImpl:
@Service
public class UsersServiceImpl implements UsersService {
@Autowired
private UsersMapper usersMapper;
@Override
public void saveUser(Users user) {
usersMapper.addUser(user.getName(), user.getPassword());
}
}
建立包:com.qianfeng.db5.mapper,以user表為例
UserMapper:
@Qualifier("db5SqlSessionFactory")
public interface UserMapper {
@Insert("insert into user(username, birthday) values(#{username}, #{birthday})")
void addUser(@Param("username") String username, @Param("birthday")Date birthday);
}
建立包:com.qianfeng.db5.service
public interface UserService {
void saveUser(User user);
}
UserServiceImpl:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public void saveUser(User user) {
userMapper.addUser(user.getUsername(), user.getBirthday());
}
}
建立包:com.qianfeng.controller
@Controller
public class IndexController {
@Autowired
private UsersService usersService;
@Autowired
private UserService userService;
@RequestMapping("/addUser")
@ResponseBody
public String addUser() {
Users u = new Users();
u.setName("lisi");
u.setPassword("000000");
usersService.saveUser(u);
return "ok";
}
}
在啟動類中添加所有需要掃描的包:
@SpringBootApplication(scanBasePackages="com.qianfeng")
mapper在配置資料源是已經掃描過,是以可以不掃描。
通路IndexController,執行結果:
