本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《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,執行結果: