Spring框架核心技术深度解析:JDBC模板、模拟转账与事务管理

一、JDBC模板技术:简化数据库操作

在传统JDBC开发中,繁琐的资源管理和重复代码一直是开发者的痛点。Spring框架提供的 JDBC模板(JdbcTemplate) 彻底改变了这一现状,它通过封装底层JDBC操作,让开发者仅需关注SQL逻辑,大幅提升开发效率。

1.1 快速入门:从手动编码到Spring管理

手动创建模板对象

@Test
public void run1() {// 配置数据库连接池DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setUsername("root");dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setPassword("root");// 创建JdbcTemplate并执行SQLJdbcTemplate template = new JdbcTemplate(dataSource);template.update("insert into account values (null,?,?)", "熊大", 1000);
}

Spring管理模板对象

通过配置文件将数据源和模板纳入IOC容器管理,避免硬编码:

<!-- 配置数据源 -->
<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><!-- 配置JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource" />
</bean>

1.2 进阶用法:操作数据库的增删改查

执行更新操作(增、删、改)

// 新增数据
jdbcTemplate.update("insert into account values (null,?,?)", "熊二", 500);
// 修改数据
jdbcTemplate.update("update account set name = ?,money = ? where id = ?", "光头强", 100, 7);
// 删除数据
jdbcTemplate.update("delete from account where id = ?", 7);

查询操作:结果集映射

通过RowMapper接口实现自定义数据封装,例如将查询结果映射为Account对象:

// 单个对象查询
Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new BeanMapper(), // 自定义RowMapper实现类6
);// 列表查询
List<Account> list = jdbcTemplate.query("select * from account", new BeanMapper()
);class BeanMapper implements RowMapper<Account> {@Overridepublic Account mapRow(ResultSet rs, int rowNum) throws SQLException {Account account = new Account();account.setId(rs.getInt("id"));account.setName(rs.getString("name"));account.setMoney(rs.getDouble("money"));return account;}
}

1.3 集成开源连接池:以Druid为例

替换为高性能的Druid连接池只需两步:

  1. 添加Maven依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>
  1. 修改配置文件:
<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>

同时建议将数据库配置提取到jdbc.properties文件,通过<context:property-placeholder>标签加载,提升配置灵活性。

二、模拟转账开发:业务逻辑与事务需求

转账场景是检验数据库操作和事务管理的典型场景,涉及扣减余额增加余额两个核心步骤,必须保证原子性——要么全部成功,要么全部回滚。

2.1 业务层与持久层设计

服务接口定义

public interface AccountService {void pay(String out, String in, double money); // 转账方法
}

持久层实现(基于JdbcTemplate)

public class AccountDaoImpl implements AccountDao {private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 付款:扣减余额@Overridepublic void outMoney(String out, double money) {jdbcTemplate.update("update account set money = money - ? where name = ?", money, out);}// 收款:增加余额@Overridepublic void inMoney(String in, double money) {jdbcTemplate.update("update account set money = money + ? where name = ?", money, in);}
}

服务层实现

public class AccountServiceImpl implements AccountService {private AccountDao accountDao;public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}@Overridepublic void pay(String out, String in, double money) {accountDao.outMoney(out, money); // 扣钱accountDao.inMoney(in, money); // 加钱}
}

2.2 未加事务的问题:数据不一致风险

若转账过程中(如扣钱后)发生异常(如服务器崩溃),会导致付款方余额已扣减但收款方未到账,破坏数据一致性。例如:

@Override
public void pay(String out, String in, double money) {accountDao.outMoney(out, money); // 成功执行int a = 1/0; // 模拟异常accountDao.inMoney(in, money); // 未执行
}

此时需要事务管理来保障操作的原子性。

三、Spring事务管理:声明式与注解式实现

Spring提供了两种事务管理方式:编程式事务(手动编写事务代码)和声明式事务(推荐,通过配置或注解管理)。

3.1 声明式事务:基于XML配置

步骤1:配置事务管理器

<!-- 平台事务管理器,基于数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" />
</bean>

步骤2:定义事务通知

<!-- 事务通知:指定哪些方法需要事务增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- pay方法配置:默认隔离级别, REQUIRED传播行为 --><tx:method name="pay" isolation="DEFAULT" propagation="REQUIRED" /><!-- 所有find开头的方法设为只读 --><tx:method name="find*" read-only="true" /></tx:attributes>
</tx:advice>

步骤3:AOP织入事务

<aop:config><!-- 将事务通知应用到指定切入点 --><aop:advisor advice-ref="txAdvice" pointcut="execution(public * com.qcbyjy.*.AccountServiceImpl.pay(..))" />
</aop:config>

3.2 注解式事务:更简洁的开发体验

步骤1:开启事务注解支持

在配置文件中添加:

<tx:annotation-driven transaction-manager="transactionManager" />

步骤2:在服务方法上添加@Transactional注解

@Service
@Transactional // 类级注解:对所有方法启用事务
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Overridepublic void pay(String out, String in, double money) {accountDao.outMoney(out, money); int a = 1/0; // 异常会触发事务回滚accountDao.inMoney(in, money);}
}
  • @Transactional可作用于类或方法,推荐作用于方法以精准控制。
  • 关键属性:
    • isolation:隔离级别(如Isolation.REPEATABLE_READ)。
    • propagation:传播行为(如Propagation.REQUIRED,默认值)。
    • rollbackFor:指定需要回滚的异常类型。

3.3 纯注解配置:全Java代码管理

通过@Configuration类替代XML配置,实现完全注解化开发:

@Configuration
@ComponentScan(basePackages="com.qcbyjy.demo6")
@EnableTransactionManagement // 开启事务注解
public class SpringConfig {@Bean(name="dataSource")public DataSource createDataSource() throws Exception {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setUrl("jdbc:mysql:///spring_db");dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}@Bean(name="jdbcTemplate")public JdbcTemplate createJdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}@Bean(name="transactionManager")public PlatformTransactionManager createTransactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

四、核心总结:三大模块的协同作用

模块作用描述
JDBC模板封装JDBC操作,简化数据库访问,支持连接池和结果集映射。
模拟转账业务体现事务的必要性,通过扣减/增加余额的原子性需求,引出事务管理的核心价值。
声明式事务基于AOP实现非侵入式事务管理,通过配置或注解灵活控制事务范围和行为。

通过这三大模块的结合,Spring框架实现了高效的数据访问安全的业务逻辑便捷的事务控制,成为企业级开发中不可或缺的核心技术。开发者只需专注业务逻辑,底层的资源管理和事务保障由框架自动完成,极大提升了开发效率和系统稳定性。

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

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

相关文章

Modern C++(一)基本概念

1、基本概念 1.1、注释 注释在翻译阶段3会被替换为单个空白字符从程序中移除 1.2、名字与标识符 标识符是一个由数字、下划线、大小写字符组成的任意长度序列。有效的标识符首个字符必须是以A-Z、a-z、下划线开头&#xff0c;。有效的标识符其他字符可以是0-9、A-Z、a-z、下…

STM32的TIMx中Prescaler和ClockDivision的区别

Prescaler预分频&#xff0c;以笔者目前的学习程度来说&#xff0c;这个参数&#xff0c;一般来说是对主时钟进行分频后的计数器时钟。这个预分频后的时钟主要是用于的计数的。 这个主时钟&#xff0c;对于时基单元来说可以是内部时钟&#xff0c;也可以是外部时钟。一般来说我…

前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读

按照加载阶段、渲染阶段和交互阶段三个维度进行系统性阐述&#xff1a; 在现代 Web 开发中&#xff0c;性能不再是锦上添花&#xff0c;而是决定用户体验与业务成败的关键因素。为了全面监控与优化网页性能&#xff0c;我们可以将性能指标划分为加载阶段、渲染阶段、和交互阶段…

MySQL——1、数据库基础

数据库基础 1、安装MySQL2、什么是数据库3、数据库使用案例4、MySQL架构与SQL分类5、存储引擎 1、安装MySQL 1、更新软件包列表 sudo apt update2、查看MySQL安装包 apt list | grep mysql-server3、安装MySQL # 默认安装最新版 sudo apt install -y mysql-server4、启动My…

ET MailBoxComponent类(实体) 分析

MailBoxComponent 作用是&#xff0c;用来接收Actor消息&#xff0c;处理Actor消息。这个没有存储能&#xff0c;收到消息后立即就处理了。ParentInstanceId 是MailBox所在的实体InstanceIdMailBoxType MailBox类型MailBoxInvoker 分发消息的包装Add 方法&#xff0c;看名字是…

Weblogic SSRF漏洞复现(CVE-2014-4210)【vulhub靶场】

漏洞概述&#xff1a; Weblogic中存在一个SSRF漏洞&#xff0c;利用该漏洞可以发送任意HTTP请求&#xff0c;进而攻击内网中redis、fastcgi等脆弱组件。 漏洞形成原因&#xff1a; WebLogic Server 的 UDDI 组件&#xff08;uddiexplorer.war&#xff09;中的 SearchPublicR…

js应用opencv

思路&#xff1a; 第一步&#xff1a;直方图 第二步&#xff1a;获得直方图的波峰 第三步&#xff1a;波峰胜负10&#xff0c;高于或低于变红色 1.引用import cv from ‘techstark/opencv-js’; 2.vue代码 <div class"historyLeft2"><div style"relat…

用Python代码绘制动态3D爱心效果

引言 介绍Python在创意编程中的应用&#xff0c;特别是如何通过简单的代码实现视觉上的美感。引出本文将分享的爱心代码&#xff0c;并简要说明其实现原理。 爱心代码的基本实现 展示一个简单的Python代码示例&#xff0c;使用字符画的方式在控制台中绘制一个爱心图案。 pr…

使用Python开发经典俄罗斯方块游戏

使用Python开发经典俄罗斯方块游戏 在这篇教程中&#xff0c;我们将学习如何使用Python和Pygame库开发一个经典的俄罗斯方块游戏。这个项目将帮助你理解游戏开发的基本概念&#xff0c;包括图形界面、用户输入处理、碰撞检测等重要内容。 项目概述 我们将实现以下功能&…

兼顾长、短视频任务的无人机具身理解!AirVista-II:面向动态场景语义理解的无人机具身智能体系统

作者&#xff1a;Fei Lin 1 ^{1} 1, Yonglin Tian 2 ^{2} 2, Tengchao Zhang 1 ^{1} 1, Jun Huang 1 ^{1} 1, Sangtian Guan 1 ^{1} 1, and Fei-Yue Wang 2 , 1 ^{2,1} 2,1单位&#xff1a; 1 ^{1} 1澳门科技大学创新工程学院工程科学系&#xff0c; 2 ^{2} 2中科院自动化研究所…

【蓝桥杯省赛真题49】python偶数 第十五届蓝桥杯青少组Python编程省赛真题解析

python偶数 第十五届蓝桥杯青少组python比赛省赛真题详细解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解

鸿蒙(HarmonyOS)应用开发入门教程

目录 第一章:鸿蒙系统简介 1.1 什么是鸿蒙系统? 1.2 鸿蒙系统架构 第二章:开发环境搭建 2.1 安装DevEco Studio 步骤1:下载与安装 步骤2:首次配置 步骤3:设备准备 2.2 创建第一个项目 第三章:鸿蒙应用开发基础 3.1 核心概念:Ability与AbilitySlice 示例代码…

VM中 ubuntu 网卡不显示

1.添加网卡配置 #sudo nano /etc/netplan/01-netcfg.yaml network:version: 2renderer: networkdethernets:ens33:dhcp4: trueens37:dhcp4: trueens38:dhcp4: true#保存后 sudo netplan apply2.查看网络状态 sudo systemctl start systemd-networkd sudo systemctl status sy…

阿克曼-幻宇机器人系列教程3- 机器人交互实践(Message)

上一篇文章介绍了如何通过topic操作命令实现与机器人的交互&#xff0c;本篇我们介绍如何通过Message&#xff08;即topic的下一级&#xff09;实现与机器人的交互。 和topic一样&#xff0c;首先在一个终端通过ssh命令登录机器人、启动机器人&#xff0c;然后打开另外一个终端…

Python 调试扩展版本兼容问题解决纪实

在 Python 开发中&#xff0c;调试工具的正常使用对效率至关重要。近期在公司项目中&#xff0c;便遇到了 Python 调试扩展与版本不兼容的问题。公司 ERP 服务器采用 Ubuntu 18.04 系统&#xff0c;其标配 Python 版本为 3.6&#xff0c;而常用的 Python Debugger 扩展对版本有…

React 第四十二节 Router 中useLoaderData的用途详解

一、前言 useLoaderData&#xff0c;用于在组件中获取路由预加载的数据。它通常与路由配置中的 loader 函数配合使用&#xff0c;用于在页面渲染前异步获取数据&#xff08;如 API 请求&#xff09;&#xff0c;并将数据直接注入组件&#xff0c;从而简化数据流管理。 二、us…

Linux——mysql主从复制与读写分离

目录 一&#xff0c;理解什么是mysql主从复制 1&#xff0c;mysql支持的复制类型 2&#xff0c;mysql主从复制的工作流程 二&#xff0c;配置mysql主从复制 三&#xff0c;配置mysql主主复制 四&#xff0c;mysql读写分离 1&#xff0c;了解什么是mysql读写分离 2&…

MongoDB数据库深度解析:架构、特性与应用场景

在现代应用程序开发中&#xff0c;数据存储技术的选择至关重要。在众多的数据库管理系统中&#xff0c;MongoDB以其灵活性和强大的功能迅速崛起&#xff0c;成为NoSQL数据库中的佼佼者。本文将深入解析MongoDB的架构、核心特性、性能优化及其在实际应用中的最佳实践&#xff0c…

3D曲面上的TSP问题(一):曲面上点集距离求解

3D曲面上&#xff0c;两点的距离求解不能采用欧式距离&#xff0c;而需要计算测地线距离。 代码使用CGAL 5.6.2 OpenCV 4.11.0 版本实现 #include "cgal_utils.h" #include <CGAL/AABB_tree.h> #include <CGAL/AABB_traits.h> #include <CGAL/AABB_…

【歌曲结构】2:小节与歌曲结构信息整合

歌曲小节与结构信息整合 我将为您整合小节信息与歌曲结构,创建一个更加详细的JSON数据结构。 处理方法 将小节时间与歌曲结构段落进行匹配为每个小节添加所属段落信息为小节添加格式化的时间戳为小节添加对应时间范围内的歌词{"song_title": "财神庙前许三亿…