news 2026/6/15 11:34:48

【Spring框架】SpringJDBC

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Spring框架】SpringJDBC

Spring JDBC 与 JdbcTemplate

Spring JDBC 是Spring所提供的持久层技术,用于简化数据库操作的一个模块,以一种更简洁,更直接的方式使用 JDBC API 简化了开发人员对数据库的操作。

JdbcTemplate 则是 Spring JDBC 模块中最核心的类,是该模块的主要实现者,是对原始繁琐的 Jdbc API 对象的简单封装,提供了增删改查(CRUD)的便捷实现,是开发者使用 Spring JDBC 时最常用的工具,归纳起来主要有以下几种类型的方法:

(1)execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句。

(2)update:用于执行新增、修改与删除等语句。

(3)query:用于执行查询相关的语句。

下面我们来具体实现 Spring JDBC

实现Spring JDBC

数据库内容如下:

pom.xml 添加相关依赖

<dependencies> <!-- 统一Spring版本为5.3.21 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.21</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.21</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.21</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.21</version> </dependency> <!-- 其他依赖保持不变 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- mysql驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!-- AOP联盟 --> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <!-- aspectj --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.3</version> </dependency> </dependencies>

groupId="org.springframework" 为Spring 官方组织标识

spring-context:Spring 核心容器

spring-test:Spring 测试支持

spring-jdbc:Spring JDBC 支持

spring-aspects:Spring AOP 切面支持

mysql-connector-java,MySQL 数据库的 JDBC 驱动,使得 Java 程序能够连接 MySQL 数据库

aopalliance,AOP 联盟规范,提供 AOP 接口定义

Maven 会根据这个配置自动下载所需的依赖库,并按照指定的配置进行项目构建

AlipayDao .java

public interface AlipayDao { public void transfer(String fromA,String toB,int amount); }

AliPayDaoImpl .java

public class AliPayDaoImpl implements AlipayDao { private JdbcTemplate jdbcTemplate; public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public void transfer(String fromA, String toB,int amount) { jdbcTemplate.update("update alipay set amount=amount-? where aliname=?",amount,fromA); jdbcTemplate.update("update alipay set amount=amount+? where aliname=?",amount,toB); } }

定义了数据访问层实现类 AliPayDaoImpl,主要功能是实现账户间的转账操作 transfer()。JdbcTemplate 是 Spring JDBC 的核心工具类,类中定义了 JdbcTemplate 对象,并提供了 get/set 方法,这是为了通过 Spring 的依赖注入获取 JdbcTemplate 实例。这种通过 setter 方法注入的方式,使得 JdbcTemplate 可以由 Spring 容器统一管理,无需手动创建。

<!--配置连接DriverManagerDataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <!-- 配置jdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="AliPayDaoImpl" class="com.qcby.dao.impl.AliPayDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> </beans>

这段配置和代码的逻辑是:Spring容器先创建数据源(dataSource),指定数据库连接的驱动、地址、用户名和密码;再创建JdbcTemplate实例并关联该数据源,Spring 通过 ref 把 dataSource 注入给了 jdbcTemplate(Spring调用JdbcTemplate类中的setDataSource方法实现依赖注入),使其获得数据库连接能力以操作数据库;最后创建AliPayDaoImpl实例,把 JdbcTemplate 的属性和 setter 方法定义在 AliPayDaoImpl 内部,通过调用AliPayDaoImpl类中的setJdbcTemplate方法,将前面创建的JdbcTemplate注入进去,这样AliPayDaoImpl就可以利用 JdbcTemplate来执行数据库操作,当执行transfer方法时,就能利用注入的JdbcTemplate执行两条更新SQL,完成从一个账户扣款、向另一个账户加款的转账操作,整个过程通过Spring的依赖注入实现了各组件的解耦和自动组装。

public class AliPayTest { @org.junit.Test public void run(){ ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml"); AlipayDao alipayDao = (AlipayDao) context.getBean("AliPayDaoImpl");//使用多态 alipayDao.transfer("张三","李四",100); } }

实现效果如图:

此时数据库数据变为:

此时我们将数据库的数据重置为各是100,再将AliPayDaoImpl.java改为:

这样AliPayDaoImpl.java是有报错的,我们来看实现效果:

此时数据库内容变为:

即执行了转出而未实现转入,与实际情形不符

合理的解决方式——添加事务

添加事务

xml配置的形式

Spring.xml

<!-- 定义事务管理器--> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 编写事务通知--> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/> </tx:attributes> </tx:advice> <!-- 编写AOP,让spring自动将事务切入到目标切点--> <aop:config> <!-- 定义切入点--> <aop:pointcut id="txPointCut" expression="execution(* com.qcby.dao.impl.AliPayDaoImpl.transfer(..))"/> <!-- 将事务通知与切入点结合--> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> </aop:config>

这段XML配置是Spring框架中实现声明式事务管理的完整配置,其核心作用是为com.qcby.dao.impl.AliPayDaoImpl类中的transfer方法自动添加事务控制能力。首先,通过标签定义了一个名为txManager的事务管理器,其类型为DataSourceTransactionManager,专门用于管理JDBC数据源的事务,并通过property标签将其与已配置的dataSource数据源关联起来,使事务管理器能够操作数据库连接。接着,使用定义了名为txAdvice的事务通知,该通知关联了前面定义的txManager事务管理器,并在中通过设置了事务属性:name="*"表示对匹配的方法都应用该规则,propagation="REQUIRED"指定了事务传播行为为"如果当前没有事务则新建一个,若已有事务则加入其中",isolation="DEFAULT"表示使用数据库默认的事务隔离级别,read-only="false"说明这不是只读事务。最后,通过进行AOP配置,先定义了一个名为txPointCut的切入点,其表达式execution(* com.qcby.dao.impl.AliPayDaoImpl.transfer(..))精确匹配AliPayDaoImpl类中的transfer方法,再通过将txAdvice事务通知与txPointCut切入点关联起来。这样,当transfer方法被调用时,Spring会通过AOP自动在方法执行前开启事务,若方法正常执行完毕则自动提交事务,若出现未捕获的异常则自动回滚事务,从而确保转账操作的原子性,避免出现数据不一致的情况,同时这种配置方式将事务控制逻辑与业务代码分离,降低了耦合度,提高了代码的可维护性。

实现效果:

注解的形式

Spring.xml

<!-- 定义事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启事务注解驱动 --> <tx:annotation-driven transaction-manager="txManager"/>

其中,transaction-manager="txManager" 指定了该注解驱动要使用的事务管理器是名为 txManager 的 Bean,这样注解式事务就能基于该事务管理器实现对数据库事务的控制。

启用该配置后,开发者只需在需要事务支持的类或方法上添加 @Transactional 注解,Spring 就会自动为这些方法添加事务功能。

AliPayDaoImpl.java

其中的重要部分:

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)

propagation 是Spring事务的传播行为,它定义了事务方法被另一个事务方法调用时的事务行为。propagation的值有:

REQUIRED(默认):如果当前存在事务则在该事务中运行,如果没有事务则创建一个新的事务;

SUPPORTS:如果当前存在事务则在该事务中运行,如果没有事务则在非事务环境中运行;

MANDATORY:必须在事务中运行,如果没有事务则抛出异常;

isolation 是Spring事务的隔离级别,隔离级别定义了一个事务对另一个正在进行的事务所可见的程度,隔离级别越高,数据库的并发性越差,但安全性就越高。Spring支持的事务隔离级别包括:

DEFAULT:使用数据库默认的隔离级别(不可重复读);

READ_UNCOMMITTED:允许脏读、不可重复读和幻读;

READ_COMMITTED:避免了脏读,但允许不可重复读和幻读;

REPEATABLE_READ:避免了脏读和不可重复读,但允许幻读;

SERIALIZABLE:最高的隔离级别,避免了所有可能的数据不一致问题,但性能最差。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 8:01:55

生活小窍门查询小程序,核心功能,收录清洁,收纳,养生等生活小窍门,支持按关键词搜索,收藏常用技巧,离线查看,应用场景,中老年人解决生活中的小问题,如去除水垢,收纳衣物等,简单实用。

生活小窍门查询小程序 下面是一个基于Python的生活小窍门查询小程序&#xff0c;专为中老年人设计&#xff0c;具有简洁易用的界面和实用的功能。 import json import os import tkinter as tk from tkinter import ttk, messagebox, simpledialog from datetime import da…

作者头像 李华
网站建设 2026/6/13 10:46:08

**免费游戏角色AI配音软件2025推荐,适配独立开发者与小

免费游戏角色AI配音软件2025推荐&#xff0c;适配独立开发者与小型工作室一、行业背景与核心痛点对于独立开发者与小型工作室而言&#xff0c;为游戏角色注入灵魂的配音工作&#xff0c;往往是预算与创意之间最大的矛盾点。据《2025年全球独立游戏开发市场报告》显示&#xff0…

作者头像 李华
网站建设 2026/6/15 6:54:06

如何用3个核心模块构建Three.js手势交互系统:实战指南

如何用3个核心模块构建Three.js手势交互系统&#xff1a;实战指南 【免费下载链接】hammer.js 项目地址: https://gitcode.com/gh_mirrors/ham/hammer.js 你是否曾在3D网页应用中体验过卡顿的旋转操作&#xff1f;或者为缩放控制不够精准而烦恼&#xff1f;传统鼠标交互…

作者头像 李华
网站建设 2026/6/15 4:08:44

3步掌握JSMpeg播放器数据监控与性能优化实战指南

3步掌握JSMpeg播放器数据监控与性能优化实战指南 【免费下载链接】jsmpeg MPEG1 Video Decoder in JavaScript 项目地址: https://gitcode.com/gh_mirrors/js/jsmpeg 还在为视频播放卡顿问题头疼&#xff1f;想深入了解用户观看行为却无从下手&#xff1f;今天我们就一起…

作者头像 李华
网站建设 2026/6/12 19:22:05

Gesturefy:Firefox鼠标手势插件完全指南

Gesturefy&#xff1a;Firefox鼠标手势插件完全指南 【免费下载链接】Gesturefy Navigate, operate, and browse faster with mouse gestures! A customizable Firefox mouse gesture add-on with a variety of different commands. 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/6/15 6:03:18

千万不能错过!这款外卖点单小程序让商家效率飙升

千万不能错过&#xff01;这款外卖点单小程序让商家效率飙升引言随着移动互联网的快速发展&#xff0c;外卖行业已经成为餐饮业不可或缺的一部分。为了提升运营效率和服务质量&#xff0c;越来越多的商家开始采用外卖点单小程序。本文将深入探讨一款高效的外卖点单小程序——妙…

作者头像 李华