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

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

在这里插入图片描述

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

在这里插入图片描述

相关文章:

  • Python实现获取b站视频的弹幕内容
  • 想学编程,但不知道从哪里学起,应该怎么办?
  • TCP对数据的拆分
  • 软件设计模式原则(四)里氏替换原则
  • 本地如何使用PHP搭建简单Imagewheel云图床,结合内网穿透实现在外远程访问?
  • SpringCloud | Dubbo 微服务实战——注册中心详解
  • 48.0/图片和多媒体文件的使用(详细版)
  • 2023年【G1工业锅炉司炉】考试及G1工业锅炉司炉作业考试题库
  • docker-ubuntu中基于keepalived+niginx模拟主从热备完整过程
  • k8s的Pod常见的几种调度形式
  • LeetCode56. Merge Intervals
  • 【办公软件】Outlook启动一直显示“正在启动”的解决方法
  • JVM 运行时参数
  • 科技提升安全,基于YOLOv4开发构建商超扶梯场景下行人安全行为姿态检测识别系统
  • docker基本管理和概念
  • C++类的相互关联
  • CSS 三角实现
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java超时控制的实现
  • maven工程打包jar以及java jar命令的classpath使用
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • vue 配置sass、scss全局变量
  • 后端_ThinkPHP5
  • 聊聊hikari连接池的leakDetectionThreshold
  • 使用parted解决大于2T的磁盘分区
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 追踪解析 FutureTask 源码
  • ​520就是要宠粉,你的心头书我买单
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #HarmonyOS:基础语法
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (java)关于Thread的挂起和恢复
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (二)hibernate配置管理
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (一)u-boot-nand.bin的下载
  • (转)visual stdio 书签功能介绍
  • *2 echo、printf、mkdir命令的应用
  • ./configure、make、make install 命令
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Reactor简单使用教程
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET6 命令行启动及发布单个Exe文件
  • .net通用权限框架B/S (三)--MODEL层(2)
  • ::什么意思
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [HAOI2016]食物链
  • [jquery]this触发自身click事件,当前控件向上滑出
  • [JS] node.js 入门