SpringBoot 整合 JdbcTemplate(配置多数据源)

数据持久化有几个常见的方案,有 Spring 自带的 JdbcTemplate 、有 MyBatis,还有 JPA,在这些方案中,最简单的就是 Spring 自带的 JdbcTemplate 了,这个东西虽然没有 MyBatis 那么方便,但是比起最开始的 Jdbc 已经强了很多了,它没有 MyBatis 功能那么强大,当然也意味着它的使用比较简单,事实上,JdbcTemplate 算是最简单的数据持久化方案了

一、创建一个 SpringBoot 项目

选择基本的 Web 依赖,再记得选上 Jdbc 依赖,以及数据库驱动依赖即可
在这里插入图片描述
项目创建成功之后,记得添加 Druid 数据库连接池依赖(注意这里可以添加专门为 Spring Boot 打造的 druid-spring-boot-starter,而不是我们一般在 SSM 中添加的 Druid),所有添加的依赖如下:

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.27</version><scope>runtime</scope>
</dependency>

在 application.properties 中提供数据的基本配置

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=UTF-8

二、CRUD测试

①、创建Bean

public class User {private Long id;private String username;private String address;//省略getter/setter
}

②、创建Service,注入JdbcTemplate

@Service
public class UserService {@AutowiredJdbcTemplate jdbcTemplate;
}

③、CRUD

JdbcTemplate 中,除了查询有几个 API 之外,增删改统一都使用 update 来操作,自己来传入 SQL 即可。
update 方法的返回值就是 SQL 执行受影响的行数

//简单添加
public int addUser(User user){return jdbcTemplate.update("insert into user (username,address) values (?,?);", user.getUsername(), user.getAddress());
}/**复杂添加:相当于完全使用了 JDBC 中的解决方案构建 PreparedStatement 时传入 Statement.RETURN_GENERATED_KEYS,然后传入 KeyHolder,最终从 KeyHolder 中获取刚刚插入数据的 id 保存到 user 对象的 id 属性中去
*/
public int addUser2(){KeyHolder keyHolder = new GeneratedKeyHolder();int update = jdbcTemplate.update(new PreparedStatementGreator(){@Overridepublic PreparedStatement createPreparedStatement(Connection connection) throws SQLException {PreparedStatement ps = connection.prepareStatement("insert into user (username,address) values (?,?);",Statement.RETURN_GENERATED_KEYS);ps.setString(1, user.getUsername());ps.setString(2, user.getAddress());return ps;}},keyHolder);user.setId(keyHolder.getKey().longValue());System.out.println(user);return update;
}
//删除
public int deleteUserById(Long id){return jdbcTemplate.update("delete from user where id = ?",id);
}
//改
public int updateUserById(User user){return jdbcTemplate.update("update user set username=?,address=? where id=?",user.getUsername(),user.getAddress(),user.getId());
}
/**查询的时候需要提供一个 RowMapper,就是需要自己手动映射,将数据库中的字段和对象的属性一一对应起来
*/
public List<User> getAllUsers(){return jdbcTemplate.query("select * from user",new RowMapper<User>(){@Overridepublic User mapRow(ResultSet resultSet, int i) throws SQLException {String username = resultSet.getString("username");String address = resultSet.getString("address");long id = resultSet.getLong("id");User user = new User();user.setAddress(address);user.setUsername(username);user.setId(id);return user;}});
}//如果数据库中的字段和对象属性的名字一模一样的话,有另外一个简单的方案
//查询时候传参也是使用占位符,这个和前文的一致
public List<User> getAllUser2(){return jdbcTemplate.query("select * from user",new BeanPropertyRowMapper<>(User.class));
}

==========================================================

多数据源

一、创建工程(选择 Web、Jdbc 以及 MySQL 驱动)
在这里插入图片描述

手动添加 Druid 依赖,由于这里一会需要开发者自己配置 DataSoruce,所以这里必须要使用 druid-spring-boot-starter 依赖,而不是传统的那个 druid 依赖。
因为 druid-spring-boot-starter 依赖提供了 DruidDataSourceBuilder 类,这个可以用来构建一个 DataSource 实例,而传统的 Druid 则没有该类。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.28</version><scope>runtime</scope>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version>
</dependency>

二、配置数据源

配置两个数据源

spring.datasource.one.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.two.url=jdbc:mysql:///test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource

加了 one 和 two 之后,这里的配置就没法被 SpringBoot 自动加载了(因为前面的 key 变了)
需要我们自己去加载 DataSource 了,此时,需要自己配置一个 DataSourceConfig,用来提供两个 DataSource Bean

@Configuration
public class DataSourceConfig{@Bean@ConfigurationProperties(prefix="spring.datasource.one")//@ConfigurationProperties 是 Spring Boot 提供的类型安全的属性绑定DataSource dsOne(){ //表示使用 spring.datasource.one 前缀的数据库配置去创建一个 DataSourcereturn DruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix="spring.datasource.two")DataSource dsTwo(){return DruidDataSourceBuilder.create().build();}
}

三、配置JdbcTemplate实例

每一个 JdbcTemplate 的创建都需要一个 DataSource,由于 Spring 容器中现在存在两个 DataSource,默认使用类型查找,会报错,因此加上 @Qualifier 注解,表示按照名称查找

@Configuration
public class JdbcTemplate{@BeanJdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dsOne){return new JdbcTemplate(dsOne);}@BeanJdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dsTwo){return new JdbcTemplate(dsTwo);}
}

四、测试

@RestController
public class HelloController{// @Autowired 注解加上 @Qualifier 注解,两者联合起来,实际上也是 byName@Autowired@Qualifier("jdbcTemplateOne")JdbcTemplate jdbcTemplateOne;//使用 @Resource 注解,直接通过 byName 的方式注入进来@Resource(name="jdbcTemplateTwo")JdbcTemplate jdbcTemplateTwo;@GetMapping("/user")public List<User> getAllUser(){List<User> list = jdbcTemplateOne.query("select * from t_user", new BeanPropertyRowMapper<>(User.class));return list;}@GetMapping("/user2")public List<User> getAllUser2() {List<User> list = jdbcTemplateTwo.query("select * from t_user", new BeanPropertyRowMapper<>(User.class));return list;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/157805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言回文数

以下是用C语言编写的回文数代码&#xff1a; #include <stdio.h>int main() { int num, reversedNum 0, remainder, originalNum; printf("请输入一个正整数&#xff1a;"); scanf("%d", &num); originalNum num; while (num …

SCAUoj实验11 链表操作

SCAU链表oj题目 文章目录 前言一、堂前习题1099 [填空题]链表的合并 二、堂上练习1098 [填空]链表结点的插入1104 [填空题]链表的倒序1101 [填空题]链表的排序 前言 刚开始学习链表可能会看得比较头晕&#xff0c;关键在于先理解链表的逻辑结构和物理结构&#xff0c;尤其是逻辑…

CMAK Kafka可视化管理工具

CMAK简介 为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫做Kafka管理器的基于Web工具,叫做 CMAK(原名Kafka Manager)。 这个管理工具可以很容易地发现分布在集群中的哪些topic分布不均匀,或者是分区在整个集群分布不均匀的的情况。 它支持管理多个集…

文本分析:NLP 魔法!

一、说明 这是一个关于 NLP 和分类项目的博客。NLP 是自然语言处理&#xff0c;目前需求量很大。让我们了解如何利用 NLP。我们将通过编码来理解流程和概念。我将在本博客中介绍 BagOfWords 和 n-gram 以及朴素贝叶斯分类模型。这个博客的独特之处&#xff08;这使得它很长&…

2023年度中国开源研究报告

截止为2023年11月的中国开源项目数字报告&#xff0c;计算了中国的开源项目的活动指标进行排名&#xff0c;可以看到排名第一的是百度的飞桨PaddlePaddle&#xff0c;前50的排名中人工智能相关的开源项目&#xff0c;占比越来越高&#xff0c;其中使用的编程语言主要有&#xf…

数据在金融行业的应用有哪些

在当今的数字化时代&#xff0c;数据已经成为金融行业不可或缺的一部分。从风险管理、投资决策、客户关系管理到监管合规&#xff0c;数据在金融领域的各个方面都发挥着重要作用。 ​那么&#xff0c;大数据在金融行业有哪些应用呢&#xff1f; 一、数据在金融行业中的应用 1…

单元测试实战(五)普通类的测试

为鼓励单元测试&#xff0c;特分门别类示例各种组件的测试代码并进行解说&#xff0c;供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战&#xff08;一&#xff09;Controller 的测试 单元测试实战&#xff08;二&#xff09;Service 的测试 单元测试实战&am…

Pod详解

Pod详解 1 .Pod介绍 1.1 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少 Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个&#xff1a; 可以以它为…

小米集团收入增长失速已久:穿越寒冬,雷军的路走对了吗?

撰稿|行星 来源|贝多财经 11月20日&#xff0c;小米集团&#xff08;HK:01810&#xff0c;下称“小米”&#xff09;发布了截至2023年9月30日的第三季度业绩公告。 财报显示&#xff0c;在智能手机出货量下行、平均售价下跌的背景下&#xff0c;小米逆势而上&#xff0c;实现…

创建用户报错:ORA-65096: 公用用户名或角色名无效

题主的Oracle版本是最新的Oracle 21 描述&#xff1a; 1、在命令行工具 给Oracle创建用户&#xff0c;create user c##用户名identifed by 密码&#xff0c;报错&#xff1a;【ORA-65096: 公用用户名或角色名无效】 2、在navicat创建用户&#xff0c;提示如下&#xff1a; 解…

Windows系统如何安装与使用TortoiseSVN客户端,并实现在公网访问本地SVN服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

并行与分布式计算 第8章 并行计算模型

文章目录 并行与分布式计算 第8章 并行计算模型8.1 并行算法基础8.1.1 并行算法的定义8.1.2并行算法的分类8.1.3算法的复杂度 8.2 并行计算模型8.2.1 PRAM (SIMD-SM)模型8.2.3 BSP (MIMD-DM)模型8.2.4LogP&#xff08;MIMD-DM&#xff09;模型 并行与分布式计算 第8章 并行计算…

java疫情期间社区出入管理系统-计算机毕业设计源码21295

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对疫情期间社区出入管理等问题&#xff0c;对…

【算法挨揍日记】day21——64. 最小路径和、174. 地下城游戏

64. 最小路径和 64. 最小路径和 题目描述&#xff1a; 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 解题思路&#xff1a; 状态表示&…

硬技能之上的软技巧(二)

在硬技能的基础上&#xff0c;如何运用其他软技巧来提升个人能力和职业发展。在之前的讨论中&#xff0c;我们提到了硬技能和软技巧的基本概念&#xff0c;以及如何运用一些软技巧来提升个人能力和职业发展。 本篇文章将进一步探讨其他软技巧&#xff0c;包括批判性思维、自我…

geemap学习笔记011:可视化遥感影像随时间的变化

前言 本节主要是介绍 .ts_inspector 工具&#xff0c;它是可以可视化遥感影像随时间的变化&#xff0c;与先前文章中介绍的.split_map差别在于&#xff0c;它可以加载时间序列数据。 1 导入库 !pip install geemap #安装geemap库 import ee import geemapgeemap.show_youtub…

蔚来「换电」赚钱养家,长安首家进场站台

作者 | 张祥威 编辑 | 德新 蔚来的「换电」业务开始赚钱养家。 11月21日下午&#xff0c;蔚来宣布与长安汽车签署了换电业务的合作协议&#xff0c;双方将在换电网络建设与共享、换电车型研发等方面展开深入合作&#xff0c;并在推动建立换电电池标准、建立高效的电池资产管…

909-2014-T3

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 有n个顶点的无向图&#xff0c;使用邻接矩阵作为存储结构。为减少存储空间&#xff0c;使用数组按照行主映射方式仅保存下三角矩阵。请给出映射公式&#xff0c;并编写算法计算给定顶点的度。叙述算法思想并用…

软件测试面试题总结--基础面经

1 、软件的含义 程序、数据及相关文档的完整集合。 2、测试与调试的区别是什么&#xff1f; 测试是由测试人员来进行&#xff0c;主要目标是发现、报告和跟踪缺陷。 调试是由开发人员进行&#xff0c;主要目标是定位缺陷位置&#xff0c;分析缺陷原因&#xff0c;修复缺陷。…

vue年季度月联动筛选(el-cascader实现)

默认显示当年当季当月 <label class"font-weight">时间范围</label> <el-cascaderplaceholder"请选择":options"timeOption"filterableclearablechange-on-selectv-model"timeRange":props"{emitPath: true}&quo…