Spring JDBC和事务管理

Spring JDBC是Spring框架用来处理关系型数据库的模块,对JDBC的API进行了封装。

Spring JDBC的核心类为JdbcTemplate,提供数据CRUD方法

Spring JDBC使用步骤

  1. Maven工程引入依赖spring-jdbc
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.6.RELEASE</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version>
</dependency>
  1. xml中配置DataSource数据源
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/test"></property><property name="username" value="root"></property><property name="password" value="root"></property>
</bean>
  1. xml中定义JdbcTemplate Bean,让IoC容器初始化时自动实例化
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property>
</bean>
  1. 在需要增删改查的Dao中,持有JdbcTemplate属性,并设置getter和setter方法,然后在对应的业务处理方法中,调用JdbcTemplate的指定方法。
public class EmployeeDao {private JdbcTemplate jdbcTemplate;//数据查询方法public Employee findById(Integer eno){String sql="select * from employee where eno = ?";Employee employee = jdbcTemplate.queryForObject(sql,new Object[]{eno},new BeanPropertyRowMapper<>(Employee.class));return employee;}public JdbcTemplate getJdbcTemplate() {return jdbcTemplate;}public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}
}
  1. 在xml中为Dao类注入JdbcTemplate对象
<bean id="employeeDao" class="spring.jdbc.dao.EmployeeDao"><property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>

JdbcTemplate数据查询方法:

在这里插入图片描述
例:

public List<Employee> findByDname(String dname){String sql = "select * from employee where dname = ?";List<Employee> list = jdbcTemplate.query(sql,new Object[]{dname},new BeanPropertyRowMapper<>(Employee.class));return list;
}
public List<Map<String, Object>> findMapByDname(String dname){String sql = "select eno as  empno,salary as s from employee where dname = ?";List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql, new Object[]{dname});return maps;
}

JdbcTemplate数据写入方法:
在这里插入图片描述

例:

	public void insert(Employee employee){String sql = "insert into employee(eno,ename,salary,dname) values(?,?,?,?)";//利用update方法实现数据写入操作jdbcTemplate.update(sql,new Object[]{employee.getEno(),employee.getEname(),employee.getSalary(), employee.getDname()});}public int update(Employee employee){String sql = "update employee set ename=?,salary=?,dname=? where eno=?";//利用update方法实现数据更新操作int count = jdbcTemplate.update(sql,new Object[]{employee.getEname(),employee.getSalary(), employee.getDname(),employee.getEno()});return count;}public int delete(Integer eno){String sql = "delete from employee where eno = ?";//利用update方法实现数据删除操作return jdbcTemplate.update(sql,new Object[]{eno});}

Spring事务管理

事务是一种可靠、一致的方式,是访问操作数据库的程序单元,事务要么把事情做完,要么不做,不会做一半停止。
事务依赖数据库实现,MySQL通过事务区作为数据缓冲地带。

编程式事务

通过代码手动提交回滚事务的事务控制方式。

SpringJDBC通过TransactionManager事务管理器实现事务控制。

TransactionManager事务管理器提供commit、rollback方法进行事务提交和回滚。

编程式事务使用步骤:

  1. 配置事务管理器
<!--    事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean>
  1. 在需要开启事务的业务类中,持有事务管理器属性,并设置getter和setter方法
	private DataSourceTransactionManager transactionManager;public DataSourceTransactionManager getTransactionManager() {return transactionManager;}public void setTransactionManager(DataSourceTransactionManager transactionManager) {this.transactionManager = transactionManager;}
  1. 配置事务管理器对象注入
<bean id="employeeService" class="spring.jdbc.service.EmployeeService"><property name="employeeDao" ref="employeeDao"></property><property name="transactionManager" ref="transactionManager"></property>
</bean>
  1. 定义事务默认的标准配置,开启事务,进行事务管理
    在这里插入图片描述

声明式事务

在不修改代码的情况下通过配置的形式实现事务控制,本质就是AOP环绕通知。

声明式事务的触发时机:

  • 当目标方法执行成功时,自动提交事务
  • 当目标方法抛出运行时异常时,自动事务回滚

声明式事务配置过程:

  1. 需要添加AOP依赖
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version>
</dependency>
  1. 添加tx和aop命名空间

在这里插入图片描述

  1. 配置TransactionManager事务管理器
<!--    事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean>
  1. 配置事务通知与事务属性
	<!--事务通知配置,决定哪些方法使用事务,哪些方法不使用事务--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!--propagation事务传播行为--><!--当目标方法名为batchImport时,启用声明式事务,运行成功提交事务,运行时异常回滚--><!--目标方法允许使用通配符*--><tx:method name="batchImport" propagation="REQUIRED"/><!--设置所有findXXX方法不启用事务--><tx:method name="find*" propagation="NOT_SUPPORTED" read-only="true"/><tx:method name="get*" propagation="NOT_SUPPORTED" read-only="true"/><!--设置其他方法不启用事务--><tx:method name="*" propagation="NOT_SUPPORTED" read-only="true"/></tx:attributes></tx:advice>
  1. 为事务通知绑定PointCut切点
<!--定义声明式事务的作用范围--><aop:config><aop:pointcut id="pointcut" expression="execution(* spring.jdbc..*Service.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/></aop:config>
事务传播行为propagation

多个拥有事务的方法在嵌套调用时的事务控制方式。

在这里插入图片描述

注解配置声明式事务
  1. xml配置
	<context:component-scan base-package="spring.jdbc"/><!--数据源--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/test"></property><property name="username" value="root"></property><property name="password" value="root"></property></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!--事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--启用注解形式声明式事务--><tx:annotation-driven transaction-manager="transactionManager"/>
  1. 分层添加组件注解,实例化对象
@Repository
public class EmployeeDao {@Resourceprivate JdbcTemplate jdbcTemplate;...
@Service
public class EmployeeService {@Resourceprivate EmployeeDao employeeDao;...
  1. 需要开启事务的类添加@Transactional注解,可以设置事务传播行为,如@Transactional(propagation = Propagation.REQUIRED

在这里插入图片描述

或者为方法单独设置事务管理方式,程序执行时优先应用方法上的配置

在这里插入图片描述

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

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

相关文章

数据分析基础之《numpy(2)—ndarray属性》

一、ndarray的属性 1、属性方法 属性名字属性解释ndarray.shape数组维度的元组&#xff08;形状&#xff09;ndarray.ndim数组维数ndarray.size数组中的元素数量ndarray.itemsize一个数组元素的长度&#xff08;字节&#xff09;ndarray.dtype数组元素的类型使用方法 数组名.…

数组越界死循环

目录 一、数组越界死循环 二、strcpy函数 三、memcpy函数 四、memmove函数 五、memcmp函数 六、memset函数​ 一、数组越界死循环 数组越界死循环问题&#xff08;详细&#xff0c;通俗&#xff0c;易懂&#xff09;_数组加i死循环-CSDN博客https://blog.csdn.net/weixin…

孜然地址引导页V9(带后台)

刚刚在浏览之前经常访问的网站的时候我发现他不用那个域名了&#xff0c;然后我见这个页面好看&#xff0c;就把他干下来了&#xff0c;然后把给他写了个后台。另外如果你的子页面收录多的话&#xff0c;人家百度访问你的子页面会显示404的&#xff0c;所以为了流量可观安装这个…

百科词条可以删除吗?如何删除自己的百度百科?

近日&#xff0c;小马识途营销顾问接到不少客户删除自己百科词条的咨询&#xff0c;有不少人自己并没有去建立百科词条&#xff0c;但是网上已经有了&#xff0c;有的信息不正确&#xff0c;甚至有的信息是负能量的&#xff0c;对当事人自己造成一定的困扰&#xff0c;所以寻求…

JVM虚拟机系统性学习-运行时数据区(堆)

运行时数据区 JVM 由三部分组成&#xff1a;类加载系统、运行时数据区、执行引擎 下边讲一下运行时数据区中的构成 根据线程的使用情况分为两类&#xff1a; 线程独享&#xff08;此区域不需要垃圾回收&#xff09; 虚拟机栈、本地方法栈、程序计数器 线程共享&#xff08;数…

kali linux无法使用root打开vlc观看视频的解决办法

kali linux陆续装了几个视频播放器&#xff0c;都比较不够友好&#xff0c;无奈安装vlc,vlc安装方法就是 apt install vlc这个没什么好说的&#xff0c;多数源都集成这个著名软件了&#xff0c;kali linux打开闪退&#xff0c;终端下运行出现&#xff1a; VLC is not supposed…

DDD领域驱动设计系列-原理篇-战略设计

概述 DDD领域驱动设计是架构方法论&#xff0c;适用于业务逻辑较复杂系统。 DDD核心目的能输出领域如何划分&#xff0c;以及架构分层如何构建。 本文章系列会分2部分讲述DDD&#xff1a;1、DDD原理&#xff1b;2、DDD实践。DDD原理分为战略及战术设计2篇来讲述&#xff1b;…

Realme X7 Pro Root 刷机教程

Realme X7 Pro 刷机教程 Just For Fun&#xff0c;最近倒腾了下Realme X7 Pro 刷root。此博客为个人记录刷机过程&#xff0c;如有机友跟随本教程操作&#xff0c;请谨慎操作&#xff01;&#xff01;&#xff01; 以下教程真针对Realme X7 Pro&#xff0c;其他版本方法未知&…

无人机巡山护林,林业无人机智能助力绿色守护

随着全球环保意识的不断提高&#xff0c;无人机巡山护林已经成为解决森林巡检难题的一种独特而高效的方式。在我国&#xff0c;各地正积极探索无人机在森林防火、病虫害监测以及生态调查等领域的创新应用。随着无人机技术的不断演进&#xff0c;其在推动森林保护和可持续发展方…

每日一博 - 图解5种Cache策略

文章目录 概述读策略Cache AsideRead Through 写策略Write ThroughWrite AroundWrite Back 使用场景举例 概述 缓存是在系统中存储数据的临时存储器&#xff0c;用于提高访问速度。缓存策略定义了如何在缓存和主存之间管理数据 读策略 Read data from the system: &#x1f5…

大师学SwiftUI第18章Part2 - 存储图片和自定义相机

存储图片 在前面的示例中&#xff0c;我们在屏幕上展示了图片&#xff0c;但也可以将其存储到文件或数据库中。另外有时使用相机将照片存储到设备的相册薄里会很有用&#xff0c;这样可供其它应用访问。UIKit框架提供了如下两个保存图片和视频的函数。 UIImageWriteToSavedPh…

一文搞懂Lombok Plugins使用与原理

目录 一文搞懂Lombok使用与原理 1.前言2.什么是Lombok3. IntelliJ安装Lombok3.1通过IntelliJ的插件中心安装3.2在项目中使用Lombok Plugins 4.Lombok 注解大全说明4.1POJO类常用注解4.2其他注解 5.Lombok常见问题6.总结7.参考 文章所属专区 超链接 1.前言 2.什么是Lombok Lo…