多数据源配置JdbcTemplate(十五)中

简介: 多数据源配置JdbcTemplate(十五)

二.三 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();
    }
}



相关文章
|
Java Maven 开发工具
aliyun-sdk-vod-upload`爆红
aliyun-sdk-vod-upload`爆红
530 1
|
JavaScript Java 测试技术
基于Java的办事大厅政务预约系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的办事大厅政务预约系统的设计与实现(源码+lw+部署文档+讲解等)
140 0
|
机器学习/深度学习 算法 C++
m基于Faster-RCNN网络的猫脸检测和猫眼定位系统matlab仿真,带GUI界面
m基于Faster-RCNN网络的猫脸检测和猫眼定位系统matlab仿真,带GUI界面
136 3
|
安全
阿里云服务器安全组设置内网互通的方法
简介: 虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
1814 0
快速了解NAT 网关计费说明
NAT网关本身是一个功能实体,自身不具备访问公网的能力,需要绑定弹性公网IP(EIP)使用。因此,在购买NAT网关时,不仅要考虑NAT网关的实例费用,还需要考虑NAT网关的公网费用。
1285 0
|
持续交付 jenkins 容器
使用Velero Restic快速完成云原生应用迁移至ACK集群
本文记录使用Velero Restic快速完成云原生应用迁移至ACK集群的实践过程。 0. 实践步骤概览 (1)创建GKE集群(或自建Kubernetes集群)(2)在GKE集群上部署示例应用Jenkins Application并执行一个构建任务(3)创建ACK集群(4)在ACK集群中部署Min.
2763 0
|
6天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
5天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。
|
5天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知