【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具

欢迎来到数据库的奇妙世界,在这里,我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具,它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用,适合刚刚接触Spring的小白们,让你轻松驾驭数据库的魔法世界。
JdbcTemplate的魅力
在现代应用程序中,数据库是存储和检索数据的重要组成部分。然而,直接使用传统的JDBC(Java Database Connectivity)进行数据库操作会显得繁琐冗长,这时候JdbcTemplate就是一种救赎。JdbcTemplate是Spring框架对JDBC的封装,提供了更简单、更高效的数据库操作方式。
JdbcTemplate的基本用法
让我们从头开始,一步步探讨JdbcTemplate的基本用法。在Spring中使用JdbcTemplate需要先配置数据源(DataSource),这通常在Spring的配置文件中完成。以下是一个简单的配置示例:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="password"/>
</bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/>
</bean>
在这个例子中,我们配置了一个基本的DriverManagerDataSource数据源和一个对应的JdbcTemplate。你需要根据你的数据库信息修改url、username和password属性。
查询操作
查询单个值
使用JdbcTemplate执行查询操作是非常简单的。首先,我们来看如何查询单个值,比如统计表中的记录数。以下是一个查询总记录数的例子:
public class UserDao {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplatepublic int getTotalUsers() {String sql = "SELECT COUNT(*) FROM users";return jdbcTemplate.queryForObject(sql, Integer.class);}
}
在这个例子中,我们使用queryForObject方法执行SQL查询,指定了SQL语句和返回类型。Integer.class表示我们期望返回一个整数。
查询单行记录
如果我们想查询一行记录,可以使用RowMapper接口。以下是一个查询用户信息的例子:
public class UserDao {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplatepublic User getUserById(int userId) {String sql = "SELECT * FROM users WHERE id = ?";return jdbcTemplate.queryForObject(sql, new Object[]{userId}, new UserRowMapper());}private static class UserRowMapper implements RowMapper<User> {@Overridepublic User mapRow(ResultSet resultSet, int rowNum) throws SQLException {User user = new User();user.setId(resultSet.getInt("id"));user.setUsername(resultSet.getString("username"));user.setEmail(resultSet.getString("email"));return user;}}
}
在这个例子中,我们定义了一个UserRowMapper类实现了RowMapper<User>接口,用于映射查询结果到User对象。在getUserById方法中,我们使用queryForObject方法执行SQL查询,并传递了UserRowMapper作为映射器。
查询多行记录
如果我们想查询多行记录,可以使用query方法。以下是一个查询所有用户的例子:
public class UserDao {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplatepublic List<User> getAllUsers() {String sql = "SELECT * FROM users";return jdbcTemplate.query(sql, new UserRowMapper());}
}
在这个例子中,我们直接调用query方法,传递了SQL语句和UserRowMapper映射器。
更新操作
除了查询,JdbcTemplate还提供了便捷的更新操作。以下是一个更新用户信息的例子:
public class UserDao {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplatepublic void updateUser(User user) {String sql = "UPDATE users SET username = ?, email = ? WHERE id = ?";jdbcTemplate.update(sql, user.getUsername(), user.getEmail(), user.getId());}
}
在这个例子中,我们使用update方法执行SQL更新操作,传递了SQL语句和更新所需的参数。update方法可以用于执行任何更新操作,包括插入、更新和删除。
插入操作
接下来,我们看一下如何使用JdbcTemplate执行插入操作。以下是一个插入新用户的例子:
public class UserDao {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplatepublic void addUser(User user) {String sql = "INSERT INTO users (username, email) VALUES (?, ?)";jdbcTemplate.update(sql, user.getUsername(), user.getEmail());}
}
在这个例子中,我们同样使用update方法执行SQL插入操作,传递了SQL语句和插入所需的参数。
删除操作
最后,让我们看一下如何使用JdbcTemplate执行删除操作。以下是一个删除用户的例子:
public class UserDao {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplatepublic void deleteUser(int userId) {String sql = "DELETE FROM users WHERE id = ?";jdbcTemplate.update(sql, userId);}
}
同样,我们使用update方法执行SQL删除操作,传递了SQL语句和删除所需的参数。
JdbcTemplate的事务管理
在实际应用中,事务管理是数据库操作不可或缺的一部分。Spring的JdbcTemplate也提供了对事务的支持,让我们来看一下如何使用JdbcTemplate进行事务管理。
首先,我们需要配置事务管理器。以下是一个使用DataSourceTransactionManager的例子:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean>
在这个例子中,我们配置了一个DataSourceTransactionManager并将数据源dataSource注入其中。
然后,在使用JdbcTemplate的类中,我们需要注入事务管理器并使用@Transactional注解标记需要进行事务管理的方法。以下是一个使用事务的例子:
import org.springframework.transaction.annotation.Transactional;public class UserService {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplate@Transactionalpublic void transferMoney(int fromUserId, int toUserId, double amount) {// 执行转账操作// ...}
}
在这个例子中,我们使用了@Transactional注解标记transferMoney方法,表明该方法需要进行事务管理。当这个方法被调用时,如果发生异常,事务将回滚,否则事务将提交。
JdbcTemplate的异常处理
在实际开发中,对于数据库操作,异常处理是非常重要的一部分。JdbcTemplate为我们提供了DataAccessException异常体系,用于捕获和处理数据库操作可能抛出的异常。
以下是一个简单的异常处理的例子:
public class UserDao {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplatepublic void addUser(User user) {try {String sql = "INSERT INTO users (username, email) VALUES (?, ?)";jdbcTemplate.update(sql, user.getUsername(), user.getEmail());} catch (DataAccessException e) {// 处理数据库操作异常System.out.println("Error occurred while adding user: " + e.getMessage());}}
}
在这个例子中,我们使用了try-catch块捕获可能发生的DataAccessException,并在捕获到异常时进行处理。
JdbcTemplate的批处理操作
有时候我们需要执行批处理操作,JdbcTemplate也为我们提供了支持。以下是一个批处理插入的例子:
public class UserDao {private JdbcTemplate jdbcTemplate;// setter method for jdbcTemplatepublic void addUsers(List<User> users) {String sql = "INSERT INTO users (username, email) VALUES (?, ?)";jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement preparedStatement, int i) throws SQLException {User user = users.get(i);preparedStatement.setString(1, user.getUsername());preparedStatement.setString(2, user.getEmail());}@Overridepublic int getBatchSize() {return users.size();}});}
}
在这个例子中,我们使用了batchUpdate方法执行批处理插入操作。通过实现BatchPreparedStatementSetter接口,我们可以设置每个批处理操作的参数,并通过getBatchSize方法指定批处理的大小。
JdbcTemplate的封装
为了使数据库操作更加便捷,我们通常会将JdbcTemplate进行封装。以下是一个简单的封装示例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public class UserDao {private final JdbcTemplate jdbcTemplate;@Autowiredpublic UserDao(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public int getTotalUsers() {String sql = "SELECT COUNT(*) FROM users";return jdbcTemplate.queryForObject(sql, Integer.class);}// 其他数据库操作方法...
}
在这个例子中,我们使用了@Repository注解将UserDao标记为一个持久层组件,同时通过构造函数注入了JdbcTemplate。这样,我们在UserDao中就可以直接使用jdbcTemplate进行数据库操作。
结语
JdbcTemplate是Spring框架中用于简化数据库操作的神奇工具,它为我们提供了一种轻松驾驭数据库的方式。通过本文的详细讲解,相信你已经对JdbcTemplate的基本使用有了清晰的了解。在数据库的奇妙世界中,JdbcTemplate为我们提供了强大的魔法,让我们能够轻松地进行各种数据库操作。
在你的编程旅程中,愿JdbcTemplate的魔法助你驾驭数据库的风云,轻松应对各种数据操作挑战。让我们一同在代码的世界中畅游,用JdbcTemplate为数据库的奇妙之旅添上灿烂的一笔吧!
| 作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |
相关文章:
【Spring 篇】JdbcTemplate:轻松驾驭数据库的魔法工具
欢迎来到数据库的奇妙世界,在这里,我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具,它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用࿰…...
Web开发SpringBoot SpringMVC Spring的学习笔记(包含开发常用工具类)
开发框架学习笔记 一.Spring SpringMVC SpringBoot三者的联系SpringMVC工作原理 二.SpringBoot的学习2.1 注解2.1.1 SpringBoot的核心注解2.1.2 配置导入注解(简化Spring配置写XML的痛苦)Configuration和Bean(人为注册Spring 的 Bean)Import(补)ImportResource(补)AutowiredQua…...
微服务下的SpringSecurity认证端
从三板斧开始微服务下的SpringSecurity开始 一、引入组件包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> 二、创建适配器 AuthorizationServerConfig…...
苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点
Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标,从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏:Bartender 允许用户隐藏菜单栏图标,只在需要时显示。这样可以…...
笙默考试管理系统-MyExamTest----codemirror(65)
笙默考试管理系统-MyExamTest----codemirror(65) 目录 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管理系统-MyExamTest----codemirror 四、 笙默考试管理系统-MyExamTest---…...
git在本地创建dev分支并和远程的dev分支关联起来
文章目录 git在本地创建dev分支并和远程的dev分支关联起来1. 使用git命令2. 使用idea2.1 先删除上面建的本地分支dev2.2 通过idea建dev分支并和远程dev分支关联 3. 查看本地分支和远程分支的关系 git在本地创建dev分支并和远程的dev分支关联起来 1. 使用git命令 git checkout…...
【C++】深入了解构造函数之初始化列表
目录 一、再谈构造函数 1、引入 1)构造函数体赋值 2)不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1)构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值…...
差分--差分数组快速计算L到R值相加后的数组
目录 差分:思路代码: 原题链接 差分: 输入一个长度为 n 的整数序列。 接下来输入 m 个操作,每个操作包含三个整数 l,r,c ,表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第…...
《NLP入门到精通》栏目导读(01/2)
一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》,因此,读者需要一定得深度学习基础,才能过度到此栏目内容。 二、博客建设理念 本博客基地,将建成人工智能领域的参考资料库;…...
three.js实现电子围栏效果(纹理贴图)
three.js实现电子围栏效果(纹理贴图) 实现步骤 围栏的坐标坐标转换为几何体顶点,uv顶点坐标加载贴图,移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…...
DHSP和DNS
一、服务程序 1.1DHCP定义 DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服务组…...
Python冒号的解释
1. “没什么首次没有为第二个,跳了三个”。它得到的切片序列的每一个第三个项目。 扩展片是你想要的。新在Python 2.3 2. Python的序列切片地址可以写成[开始:结束:一步]和任何启动,停止或结束可以被丢弃。a[::3]是每第三个序列。…...
uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现
锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...
固乔快递查询助手:批量、快速、全面的快递信息查询软件
在快递行业飞速发展的今天,如何高效、准确地掌握快递信息成为了很多人的需求。而固乔快递查询助手正是解决这一难题的利器。 固乔快递查询助手是一款专注于快递信息查询的软件,支持多家主流快递公司查询。用户只需输入单号,即可快速查询到实时…...
C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化
归并排序 归并算法采用非常经典的分治策略,每次把序列分成n/2的长度,将问题分解成小问题,由复杂变简单。 因为使用了递归算法,不能用于大数据的排序。 核心代码: using System; using System.Text; using System.Co…...
Linux的网络服务DHCP
一.了解DHCP服务 1.1 DHCP定义 DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下,DHCP作为Windows Server的一个服…...
【小沐学CAD】开源Assimp库导入三维模型(C++、Python)
文章目录 1、简介2、下载编译3、代码测试3.1 C3.2 pyassimp(Python) 结语 1、简介 https://github.com/assimp/assimp Open Asset Import Library 是一个库,用于将各种 3D 文件格式加载为共享的内存格式。它支持 40 多种用于导入的文件格式和…...
RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动
关键词:SFUD,FLASH,W25Q64,W25Q128,STM32F407 说明:RT-Thread 系统 使用 SPI万能驱动 SFUD 驱动 Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动。 提示:SFUD添加后的存储位置 1.打开RT-Thread Sett…...
Python学习笔记-使用Anaconda+VSCode配置开发环境
文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本:2.1.2 使用create创建指定版本的虚拟环境:2.1.3 使用env list查看虚拟环境列表…...
RabbitMQ的关键概念解析
RabbitMQ 是一个广泛使用的开源消息代理,它允许应用程序通过复杂的路由和存储机制来交换数据。理解 RabbitMQ 的核心概念对于有效地使用它至关重要。以下是 RabbitMQ 的一些关键概念及其工作流程: 关键概念 生产者(Producer) 生产…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
