上一篇:SpringBoot中如何使用注解方式整合Mybatis? | 带你读《SpringBoot实战教程》之二十一
下一篇:SpringBoot的事务管理 | 带你读《SpringBoot实战教程》之二十三
本文来自于千锋教育在阿里云开发者社区学习中心上线课程《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,执行结果: