二.三 DataSource 和 JdbcTemplate 配置
SpringBoot 使用JdbcTemplate, 会默认创建 DataSource, JdbcTemplate
现在,这两个对象,需要我们自己手动配置。 不能让Spring 帮助我们创建了。
二.三.一 配置 DataSource
@Component public class DataSourceConfig { /** * 创建 springboot 的数据库的数据源 DataSource * @return */ @Bean("dataSourceOne") @ConfigurationProperties("spring.datasource.one") public DataSource dataSourceOne(){ return DruidDataSourceBuilder.create().build(); } /** * 创建 springboot2 的数据库的数据源 DataSource * @return */ @Bean("dataSourceTwo") @ConfigurationProperties("spring.datasource.two") public DataSource dataSourceTwo(){ return DruidDataSourceBuilder.create().build(); } }
二.三.二 配置 JdbcTemplate
@Component public class JdbcTemplateConfig { /** * 创建数据库SpringBoot 对应的 JdbcTemplate. * 用 @Qualifier 注解 指定使用的是哪一个 Datasource * @param dataSourceOne * @return */ @Bean("jdbcTemplateOne") JdbcTemplate jdbcTemplateOne(@Qualifier("dataSourceOne") DataSource dataSourceOne){ return new JdbcTemplate(dataSourceOne); } /** * 创建数据库SpringBoot2 对应的 JdbcTemplate. * 用 @Qualifier 注解 指定使用的是哪一个 Datasource * @param dataSourceTwo * @return */ @Bean("jdbcTemplateTwo") JdbcTemplate jdbcTemplateTwo(@Qualifier("dataSourceTwo") DataSource dataSourceTwo){ return new JdbcTemplate(dataSourceTwo); } }
二.四 验证 JdbcTemplate的多数据源配置
二.四.一 创建 service和对应的实现
只实现 插入 和查询全部数据的 实现,进行演示。
二.四.一.一 UserService 接口
public interface UserService { void addUser(User user); List<User> listUser(); void addDept(Dept dept); List<Dept> listDept(); }
二.四.一.二 UserServiceImpl 实现类
@Service public class UserServiceImpl implements UserService { // 数据源1 放置到 springboot 数据库里面 @Resource private JdbcTemplate jdbcTemplateOne; //数据源2, 放置到 springboot2 数据库里面 @Resource private JdbcTemplate jdbcTemplateTwo; @Override public void addUser(User user) { //1.sql语句 String sql="insert into user(name,sex,age,description) values(?,?,?,?) "; //2.调用 update语句,执行方法 jdbcTemplateOne.update(sql,user.getName(),user.getSex(),user.getAge(), user.getDescription()); } @Override public List<User> listUser() { String sql = "select id,name,sex,age,description from user "; List<User> userList = jdbcTemplateOne.query(sql, new RowMapper<User>() { @Override public User mapRow(ResultSet resultSet, int num) throws SQLException { //根据resultSet 表示结果集, num 表示索引行 User tempUser = new User(); tempUser.setId(resultSet.getInt("id")); tempUser.setName(resultSet.getString("name")); tempUser.setSex(resultSet.getString("sex")); tempUser.setAge(resultSet.getInt("age")); tempUser.setDescription(resultSet.getString("description")); return tempUser; } }); return userList; } @Override public void addDept(Dept dept) { //1.sql语句 String sql="insert into dept(name) values(?) "; //2.调用 update语句,执行方法 jdbcTemplateTwo.update(sql,dept.getName()); } @Override public List<Dept> listDept() { String sql = "select id,name from dept "; List<Dept> deptList = jdbcTemplateTwo.query(sql, new RowMapper<Dept>() { @Override public Dept mapRow(ResultSet resultSet, int num) throws SQLException { //根据resultSet 表示结果集, num 表示索引行 Dept tempDept = new Dept(); tempDept.setId(resultSet.getInt("id")); tempDept.setName(resultSet.getString("name")); return tempDept; } }); return deptList; } }
注意,在引入 JdbcTemplate 后,执行方法的时候,需要手动指定数据源。
这个时候,数据源的使用,对开发者是有感的。
如果在查询 listDept() 时, 指定的是 jdbcTemplateOne 时,将会报错。
开发者在编写代码时,不能将数据源模板对象 JdbcTemplate 写错。
二.四.二 测试
二.四.二.一 创建测试类
@SpringBootTest @Log4j2 public class MultipeDataSourceApplicationTests { @Autowired private UserService userService; @Test public void addUserTest(){ //1. 构建对象 User user=new User(); user.setName("周小欢"); user.setAge(22); user.setSex("女"); user.setDescription("一个非常可爱的女孩纸"); //2. 添加方法 userService.addUser(user); log.info("添加员工成功"); } @Test public void listUserTest(){ List<User> userList=userService.listUser(); userList.forEach(n->log.info(n)); } @Test public void addDeptTest(){ //1. 构建对象 Dept dept=new Dept(); dept.setName("信息管理部"); //2. 添加方法 userService.addDept(dept); log.info("添加部门成功"); } @Test public void listDeptTest(){ List<Dept> deptList=userService.listDept(); deptList.forEach(n->log.info(n)); } /** * 数据源切换配置 */ @Test public void allDataSourceTest(){ addUserTest(); listDeptTest(); addDeptTest(); listUserTest(); } }