当前位置: 首页 > news >正文

【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。你需要根据你的数据库信息修改urlusernamepassword属性。

查询操作

查询单个值

使用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:轻松驾驭数据库的魔法工具

欢迎来到数据库的奇妙世界&#xff0c;在这里&#xff0c;我们将一同揭开Spring框架中JdbcTemplate的神秘面纱。JdbcTemplate是Spring提供的一个简化数据库操作的工具&#xff0c;它为我们提供了一种轻松驾驭数据库的魔法。本篇博客将详细解释JdbcTemplate的基本使用&#xff0…...

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 软件。它允许用户隐藏和重新排列菜单栏图标&#xff0c;从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏&#xff1a;Bartender 允许用户隐藏菜单栏图标&#xff0c;只在需要时显示。这样可以…...

笙默考试管理系统-MyExamTest----codemirror(65)

笙默考试管理系统-MyExamTest----codemirror&#xff08;65&#xff09; 目录 一、 笙默考试管理系统-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&#xff09;构造函数体赋值 2&#xff09;不同成员变量赋值 2、初始化列表 一、再谈构造函数 1、引入 1&#xff09;构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值…...

差分--差分数组快速计算L到R值相加后的数组

目录 差分&#xff1a;思路代码&#xff1a; 原题链接 差分&#xff1a; 输入一个长度为 n 的整数序列。 接下来输入 m 个操作&#xff0c;每个操作包含三个整数 l,r,c &#xff0c;表示将序列中 [l,r] 之间的每个数加上 c 。 请你输出进行完所有操作后的序列。 输入格式 第…...

《NLP入门到精通》栏目导读(01/2)

一、说明 栏目《NLP入门到精通》本着从简到难得台阶式学习过度。将自然语言处理得知识贯穿过来。本栏目得前导栏目是《深度学习》、《pytorch实践》,因此,读者需要一定得深度学习基础,才能过度到此栏目内容。 二、博客建设理念 本博客基地,将建成人工智能领域的参考资料库;…...

three.js实现电子围栏效果(纹理贴图)

three.js实现电子围栏效果&#xff08;纹理贴图&#xff09; 实现步骤 围栏的坐标坐标转换为几何体顶点&#xff0c;uv顶点坐标加载贴图&#xff0c;移动 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-…...

DHSP和DNS

一、服务程序 1.1DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服务组…...

Python冒号的解释

1. “没什么首次没有为第二个&#xff0c;跳了三个”。它得到的切片序列的每一个第三个项目。 扩展片是你想要的。新在Python 2.3 2. Python的序列切片地址可以写成[开始&#xff1a;结束&#xff1a;一步]和任何启动&#xff0c;停止或结束可以被丢弃。a[::3]是每第三个序列。…...

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…...

固乔快递查询助手:批量、快速、全面的快递信息查询软件

在快递行业飞速发展的今天&#xff0c;如何高效、准确地掌握快递信息成为了很多人的需求。而固乔快递查询助手正是解决这一难题的利器。 固乔快递查询助手是一款专注于快递信息查询的软件&#xff0c;支持多家主流快递公司查询。用户只需输入单号&#xff0c;即可快速查询到实时…...

C#,归并排序算法(Merge Sort Algorithm)的源代码及数据可视化

归并排序 归并算法采用非常经典的分治策略&#xff0c;每次把序列分成n/2的长度&#xff0c;将问题分解成小问题&#xff0c;由复杂变简单。 因为使用了递归算法&#xff0c;不能用于大数据的排序。 核心代码&#xff1a; using System; using System.Text; using System.Co…...

Linux的网络服务DHCP

一.了解DHCP服务 1.1 DHCP定义 DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服…...

【小沐学CAD】开源Assimp库导入三维模型(C++、Python)

文章目录 1、简介2、下载编译3、代码测试3.1 C3.2 pyassimp&#xff08;Python&#xff09; 结语 1、简介 https://github.com/assimp/assimp Open Asset Import Library 是一个库&#xff0c;用于将各种 3D 文件格式加载为共享的内存格式。它支持 40 多种用于导入的文件格式和…...

RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动

关键词&#xff1a;SFUD,FLASH,W25Q64&#xff0c;W25Q128&#xff0c;STM32F407 说明&#xff1a;RT-Thread 系统 使用 SPI万能驱动 SFUD 驱动 Flash W25Q64&#xff0c;通过 STM32CubeMX 配置 STM32 SPI 驱动。 提示&#xff1a;SFUD添加后的存储位置 1.打开RT-Thread Sett…...

Python学习笔记-使用Anaconda+VSCode配置开发环境

文章目录 概述一、安装Anaconda1.1 下载软件1.2 安装anaconda1.3 配置环境 二、配置虚拟环境2.1 使用conda创建一个新的虚拟环境2.1.1 使用search指令查看支持的python的版本&#xff1a;2.1.2 使用create创建指定版本的虚拟环境&#xff1a;2.1.3 使用env list查看虚拟环境列表…...

RabbitMQ的关键概念解析

RabbitMQ 是一个广泛使用的开源消息代理&#xff0c;它允许应用程序通过复杂的路由和存储机制来交换数据。理解 RabbitMQ 的核心概念对于有效地使用它至关重要。以下是 RabbitMQ 的一些关键概念及其工作流程&#xff1a; 关键概念 生产者&#xff08;Producer&#xff09; 生产…...

从SolidWorks到Geant4仿真:我的第一个粒子探测器CAD模型导入全记录(含CADMesh避坑点)

从SolidWorks到Geant4仿真&#xff1a;我的第一个粒子探测器CAD模型导入全记录&#xff08;含CADMesh避坑点&#xff09; 作为一名刚接触粒子探测器仿真的研究生&#xff0c;我花了整整两周时间才成功将SolidWorks设计的模型导入Geant4进行模拟。这个过程远比想象中复杂&#x…...

3步实现AutoHotkey脚本独立运行:Ahk2Exe编译工具完全指南

3步实现AutoHotkey脚本独立运行&#xff1a;Ahk2Exe编译工具完全指南 【免费下载链接】Ahk2Exe Official AutoHotkey script compiler - written itself in AutoHotkey 项目地址: https://gitcode.com/gh_mirrors/ah/Ahk2Exe 你是否厌倦了每次运行AutoHotkey脚本都需要安…...

STM32F407移植QP状态机踩坑实录:从编译报错到成功运行,我解决了这三个关键问题

STM32F407移植QP状态机踩坑实录&#xff1a;从编译报错到成功运行&#xff0c;我解决了这三个关键问题 在嵌入式开发中&#xff0c;状态机是一种极其重要的编程范式&#xff0c;它能有效管理复杂系统的行为逻辑。QP&#xff08;Quantum Platform&#xff09;作为一款轻量级的状…...

终极指南:如何在Mac上免费备份和导出微信聊天记录

终极指南&#xff1a;如何在Mac上免费备份和导出微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而懊恼&#xff1f;或是需要…...

OpenAgentsControl:构建多智能体协同系统的开源框架解析

1. 项目概述&#xff1a;一个面向智能体控制的开放框架最近在折腾AI智能体&#xff08;Agent&#xff09;相关的项目&#xff0c;发现一个挺有意思的开源仓库&#xff1a;darrenhinde/OpenAgentsControl。这个项目名字直译过来就是“开放智能体控制”&#xff0c;听起来就很有搞…...

面试鸭:程序员面试备战工作台,构建结构化知识图谱与智能复习系统

1. 项目概述&#xff1a;一个面向求职者的“面试鸭”最近在技术社区里&#xff0c;看到不少朋友在讨论一个叫“mianshiya”的开源项目。乍一看这个名字&#xff0c;还以为是哪个美食博主分享的菜谱。点进去才发现&#xff0c;这其实是一个为程序员&#xff0c;特别是正在准备面…...

EL电致发光线与3D打印技术打造可穿戴发光骨架服

1. 项目概述&#xff1a;当发光骨架“活”过来每年万圣节&#xff0c;看着满大街的“幽灵”和“僵尸”&#xff0c;我总想搞点不一样的。直到去年&#xff0c;我决定不再满足于商店里千篇一律的服装&#xff0c;而是想自己动手&#xff0c;做一件真正能“发光”的、有科技感的骨…...

知乎API完全指南:用Python轻松获取知乎数据的5个核心技巧

知乎API完全指南&#xff1a;用Python轻松获取知乎数据的5个核心技巧 【免费下载链接】zhihu-api Zhihu API for Humans 项目地址: https://gitcode.com/gh_mirrors/zh/zhihu-api 在当今数据驱动的时代&#xff0c;知乎数据采集和Python API开发已成为获取高质量中文知识…...

基于Claude的AI招聘系统:从简历解析到智能评估全流程实践

1. 项目概述&#xff1a;当Claude成为你的招聘官最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“hire-from-claude”。光看名字&#xff0c;你可能会觉得有点玄乎&#xff0c;难道是要让AI来面试和招聘人类&#xff1f;其实&#xff0c;这个项目的核心思路&#xff0c;是…...

基于视觉语言模型的智能体框架:让AI看懂界面并自动操作

1. 项目概述&#xff1a;当AI学会“看”与“想”最近在探索AI与视觉结合的领域时&#xff0c;我深度体验了landing-ai团队开源的vision-agent项目。这不仅仅是一个工具库&#xff0c;它更像是一个为大型语言模型&#xff08;LLM&#xff09;装上了“眼睛”和“手”的智能体框架…...