Spring 框架 JDBC 模板技术详解

一、JDBC 模板技术概述

在传统 JDBC 开发中,开发人员需要手动处理数据库连接(Connection)、事务管理、语句执行(Statement)和结果集(ResultSet)等繁琐操作,不仅代码冗余度高,而且容易出错。Spring 框架针对这一痛点,提供了持久层模板类XxxTemplate)来简化开发,其中用于 JDBC 操作的核心类是JdbcTemplate

核心优势

  • 简化编程:封装了 JDBC 的底层细节,开发者只需关注 SQL 语句和业务逻辑。
  • 统一接口:提供一致的增删改查方法,避免重复编写样板代码。
  • 整合连接池:支持 Spring 内置连接池和第三方开源连接池(如 Druid),方便管理数据库连接。

 二、JDBC 模板类的基础使用

 1. 创建 Maven 工程并引入依赖

 在pom.xml中添加以下坐标,包含 Spring 核心、JDBC 模块、数据库驱动及日志组件:

<dependencies><!-- Spring核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><!-- JDBC模块 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.2.RELEASE</version></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version></dependency><!-- 日志 --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><!-- 测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

 2. 手动创建对象方式(非 Spring 管理)

 通过硬编码方式创建连接池和JdbcTemplate对象,适用于简单测试场景:

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;public class Demo1 {@Testpublic void run1() {// 1. 创建Spring内置连接池DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setUsername("root");dataSource.setPassword("root");// 2. 创建JdbcTemplate并绑定连接池JdbcTemplate template = new JdbcTemplate(dataSource);// 3. 执行SQL插入操作template.update("insert into account values(null, ?, ?)", "熊大", 1000);}
}

三、使用 Spring 容器管理 JDBC 组件

 1. Spring 配置文件管理连接池和模板

通过applicationContext_jdbc.xml将连接池和JdbcTemplate纳入 Spring 容器管理,实现解耦:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 1. 配置Spring内置连接池 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///spring_db"/><property name="username" value="root"/><property name="password" value="root"/></bean><!-- 2. 配置JdbcTemplate并注入连接池 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean></beans>

2. 基于 Spring 测试的依赖注入

通过@Autowired自动获取JdbcTemplate,简化代码:

package com.qcbyjy.test.demo1;import com.qcbyjy.demo1.model.Account;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;//使用Spring框架来管理模板类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:applicationContext_jdbc.xml")
//@ContextConfiguration(value = "classpath:applicationContext_druid.xml")
public class Demo1_1 {@Autowiredprivate JdbcTemplate jdbcTemplate;//测试
//    插入@Testpublic void run1() {jdbcTemplate.update("INSERT  into account VALUES (null,?,?)", "圈圈", 5000);}//    修改@Testpublic void run2() {jdbcTemplate.update("UPDATE  account set name=?,money=? where id=?", "光头强", 122, 7);}//    删除@Testpublic void run3() {jdbcTemplate.update("delete from account where id=?", 7);}//    通过id查询@Testpublic void run4() {// 使用自定义RowMapper将ResultSet映射为Java对象Account account = jdbcTemplate.queryForObject("select *  from account where id=?", new BeanMapper(), 8);System.out.println(account);}//查询所有的数据@Testpublic void run5(){List<Account> list=jdbcTemplate.query("select * from account",new BeanMapper());for (Account account:list){System.out.println(account);}}// 自定义结果映射器class BeanMapper implements RowMapper<Account> {public Account mapRow(ResultSet resultSet, int i) throwsSQLException {Account account = new Account();account.setId(resultSet.getInt("id"));account.setName(resultSet.getString("name"));account.setMoney(resultSet.getDouble("money"));return account;}}
}

四、集成开源连接池(以 Druid 为例)

1. 添加 Druid 依赖

 在pom.xml中引入 Druid 坐标:

<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>

2. 配置属性文件(jdbc.properties

 将数据库连接信息外置到配置文件,便于维护:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring_db
jdbc.username=root
jdbc.password=root

3. Spring 配置文件整合 Druid

通过<context:property-placeholder>加载属性文件,并替换为 Druid 连接池:

<beans ...><!-- 加载属性文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 使用Druid连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!-- JdbcTemplate配置不变 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>
</beans>

六、总结

核心流程

  1. 引入依赖:包含 Spring JDBC 模块、数据库驱动和连接池(如 Druid)。
  2. 配置连接池:通过 Spring 配置文件管理数据库连接信息,支持内置或开源连接池。
  3. 注入模板类:将JdbcTemplate纳入 Spring 容器,通过依赖注入获取实例。
  4. 执行操作:利用JdbcTemplate的增删改查方法,结合RowMapper处理结果集。

最佳实践

  • 外置配置:将数据库连接信息放入属性文件,避免硬编码。
  • 使用开源连接池:优先选择 Druid 等高性能连接池,提升应用性能。
  • 结合 Spring 测试:通过@RunWith@ContextConfiguration简化测试代码。

通过以上实践,开发者可以大幅提升 JDBC 开发效率,将更多精力聚焦于业务逻辑实现。

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

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

相关文章

Axure难点解决分享:统计分析页面引入Echarts示例动态效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:统计分析页面引入Echarts示例动态效果 主要内容:echart示例引入、大小调整、数据导入 应用场景:统计分析页面…

SpringBoot 数据校验与表单处理:从入门到精通(万字长文)

一、SpringBoot 数据验证基础 1.1 数据验证的重要性 在现代Web应用开发中&#xff0c;数据验证是保证系统安全性和数据完整性的第一道防线。没有经过验证的用户输入可能导致各种安全问题&#xff0c;如SQL注入、XSS攻击&#xff0c;或者简单的业务逻辑错误。 数据验证的主要…

Ubuntu 22.04(WSL2)使用 Docker 安装 Zipkin 和 Skywalking

Ubuntu 22.04&#xff08;WSL2&#xff09;使用 Docker 安装 Zipkin 和 Skywalking 分布式追踪工具在现代微服务架构中至关重要&#xff0c;它们帮助开发者监控请求在多个服务之间的流动&#xff0c;识别性能瓶颈和潜在错误。本文将指导您在 Ubuntu 22.04&#xff08;WSL2 环境…

python打卡day25@浙大疏锦行

知识点回顾&#xff1a; 1.异常处理机制 2.debug过程中的各类报错 3.try-except机制 4.try-except-else-finally机制 在即将进入深度学习专题学习前&#xff0c;我们最后差缺补漏&#xff0c;把一些常见且重要的知识点给他们补上&#xff0c;加深对代码和流程的理解。 作业&a…

鸿蒙OSUniApp 开发实时聊天页面的最佳实践与实现#三方框架 #Uniapp

使用 UniApp 开发实时聊天页面的最佳实践与实现 在移动应用开发领域&#xff0c;实时聊天功能已经成为许多应用不可或缺的组成部分。本文将深入探讨如何使用 UniApp 框架开发一个功能完善的实时聊天页面&#xff0c;从布局设计到核心逻辑实现&#xff0c;带领大家一步步打造专…

43、Server.UrlEncode、HttpUtility.UrlDecode的区别?

Server.UrlEncode 和 HttpUtility.UrlDecode 是 .NET 中用于处理 URL 编码/解码的两个不同方法&#xff0c;主要区别在于所属命名空间、使用场景和具体行为。以下是详细对比&#xff1a; 1. 所属类库与命名空间 Server.UrlEncode 属于 System.Web.HttpServerUtility 类。通常…

代码随想录 算法训练 Day1:数组

题目一&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target …

容器技术 20 年:颠覆、重构与重塑软件世界的力量

目录 容器技术发展史 虚拟化技术向容器技术转变 Docker的横空出世 容器编排技术与Kubernetes 微服务的出现与Istio 工业标准的容器运行时 容器技术与 DevOps 的深度融合​ 无服务架构推波助澜 展望未来发展方向 从 20 世纪硬件虚拟化的笨重&#xff0c;到操作系统虚拟…

集成钉钉消息推送功能

1. 概述 本文档详细描述了在若依框架基础上集成钉钉消息推送功能的开发步骤。该功能允许系统向指定钉钉用户发送文本和富文本消息通知。 2. 环境准备 2.1 钉钉开发者账号配置 登录钉钉开发者平台&#xff1a;https://open.dingtalk.com/创建/选择企业内部应用获取以下关键信…

【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀

文章目录 &#x1f9f3; 访问者模式&#xff08;Visitor Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;游戏物品系统&#xff09;1. 定义元素与访问者接口2. 实现具体元素类3. 实现具体访问者4. 对象结构管理5. 客户端使用 …

SQL:MySQL函数:日期函数(Date Functions)

目录 时间是数据的一种类型 &#x1f9f0; MySQL 常用时间函数大全 &#x1f7e6; 1. 获取当前时间/日期 &#x1f7e6; 2. 日期运算&#xff08;加减&#xff09; &#x1f7e6; 3. 时间差计算 &#x1f7e6; 4. 格式化日期 &#x1f7e6; 5. 提取时间部分 &#x1f7…

【MySQL】数据表更新数据

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. 数据更新基础1.1 更新操作的重要性1.2 更新语句基本结构1.3 更新操作注意事项 2. 基本更新操作2.1 基本UPDATE语法2.2 使用表达式更新数据2.3 使用LIMIT限制更新行数2.4 NULL值处理 3. 高级更新技术3.1 使用子…

【更新】全国省市县-公开手机基站数据集(2006-2025.3)

手机基站是现代通信网络中的重要组成部分&#xff0c;它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进&#xff0c;手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用&#xff0c;本分享数据可帮助分析移动通信网络的发展和优化。本次数据…

蓝桥杯12届国B 纯质数

题目描述 如果一个正整数只有 1 和它本身两个约数&#xff0c;则称为一个质数&#xff08;又称素数&#xff09;。 前几个质数是&#xff1a;2,3,5,7,11,13,17,19,23,29,31,37,⋅⋅⋅ 。 如果一个质数的所有十进制数位都是质数&#xff0c;我们称它为纯质数。例如&#xff1…

腾讯多模态定制化视频生成框架:HunyuanCustom

HunyuanCustom 速读 一、引言 HunyuanCustom 是由腾讯团队提出的一款多模态定制化视频生成框架。该框架旨在解决现有视频生成方法在身份一致性(identity consistency)和输入模态有限性方面的不足。通过支持图像、音频、视频和文本等多种条件输入&#xff0c;HunyuanCustom 能…

力扣top100 矩阵置零

开辟数组来标记元素为0的行和列&#xff0c;然后将对应的行和列的元素全部置为0&#xff1b; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> l(m),r(n);for(int i …

Python知识框架

一、Python基础语法 变量与数据类型 变量命名规则 基本类型&#xff1a;int, float, str, bool, None 复合类型&#xff1a;list, tuple, dict, set 类型转换与检查&#xff08;type(), isinstance()&#xff09; 运算符 算术运算符&#xff1a;, -, *, /, //, %, ** 比较…

华为OD机试真题——单词接龙(首字母接龙)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)

一、系统介绍 本智能商城系统是基于当今主流技术栈开发的一款多端商城解决方案&#xff0c;主要包括微信小程序前端、SpringBoot 后端服务以及 Vue 管理后台三大部分。系统融合了线上商城的核心功能&#xff0c;支持商品浏览、下单、支付、订单管理等操作&#xff0c;适用于中小…

Python笔记:c++内嵌python,c++主窗口如何传递给脚本中的QDialog,使用的是pybind11

1. 问题描述 用的是python 3.8.20, qt版本使用的是5.15.2, PySide的版本是5.15.2, pybind11的版本为2.13.6 网上说在python脚本中直接用PySide2自带的QWinWidget&#xff0c;如from PySide2.QtWinExtras import QWinWidget&#xff0c;但我用的版本中说没有QWinWidget&#x…