标题05-Spring JDBC和Spring事务管理
一、Spring JDBC的数据库开发
Spring的JDBC模块有什么用?
Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从紧琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑当中。
1、jar包的准备

2、JDBC Template
1.Spring JDBC 的解析
针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础。可以说|JdbcTemplate类是Spring JDBC的核心类。

从JdbcTemplate的继承关系图可以看出,JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些访问数据库时使用的公共属性。
·DataSource其主要功能是获取数据库连接,还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口***。
·SQLExceptionTranslator:该接口负责对SQLException进行转译工作*。通过必要的设置获取SQLExceptionTranslator中的方法,可以使JdbcTemplate 在需要处理SQLException时,委托SQLExceptionTranslator的实现类来完成相关的转译工作。
而JdbcOperations 接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。
2.Spring JDBC 的配置
Spring JDBC模块主要由4个包组成,分别是core(核心包)、dataSource
(数据源包)、object(对象包)和support(支持包)。
3.xml文件的配置与注意事项
(1)配置数据源

bean mysql的路径配置
<!-- 1.1配置数据库驱动 -->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
根据MySQL的版本不同,使用不同的数据库地址,并根据报错来添加一些语句解决异常
dataSource配置中的4个属性说明,如下表所示:
(注意:表中的属性值在实际配置时,需要根据数据库类型和设置进行相应配置)
(2)Spring JdbcTemplate的常用方法
在JdbcTemplate核心类中,提供了大量的更新和查询数据库的方法,我们就是使用的这些方法来操作数据库的。
**execute(String sql)**方法可用于执行sl语句
**update()**用于执行插入、更新和删除操作
**query()**用于执行数据查询操作
(3)##### xml-JDBC配置的注意事项
注意1:如果出现驱动与数据库字符集不匹配异常(255character…),url可以换成:jdbc:mysql://localhost:3306/test?characterEncoding=utf8
注意2:如果用户的权限不够,可以在mysql添加权限命令:
GRANT ALL PRIVILEGES ON *.* TO ‘root’@‘127.0.0.1’ IDENTIFIED BY ‘root’;
驱动名
name=“driverClassName” value=“com.mysql.jdbc.Driver”
注意:数据库8.0驱动 value=“com.mysql.cj.jdbc.Driver”
数据库地址
name=“url” value=“jdbc:mysql://localhost:3306/spring”
或者:jdbc:mysql://localhost:3306/spring?characterEncoding=utf8
注意:数据库8.0URL value=“jdbc:mysql://localhost:3306/spring?&serverTimezone=GMT%2B8”
(4)execute()方法和update()方法
execute(String sql)方法可用于执行sql语句,如创建、删除表等
update0方法可以完成插入、更新和删除数据的操作。在Jdbc Template类中,提供了一系列的update0方法,其常用方法下表所示:
(5) 多学一招:使用JUnit单元测试在软件开发过程中,需要有相应的测试工作。依据测试目的不同。
可以将软件测试分为单元测试、集成测试、确认测试和系统测试等。其中单元测试在软件开发阶段是最底层的测试,它易于及时发现并解决问题·JUnit就是一个进行单元测试的开源框架,下面以上个示例,来学习单元测试框架JUnit4的使用。
使用JUnit单元测试的方法:在方法上添加@Test注解,同时修改为普通方法,JUnit 控制台进度条显示绿色即运行成功
(6)JDBC操作模板类



(7)query()方法
JdbcTemplate类中还提供了大量的query()方法来处理各种对数据库表的查询操作·其中,常用的几个query0方法如下表所示:
// 创建RowMapper对象——映射Object单行数据记录,生成的每一行都是一个Account对象,则所有行就是一个Account对象集合
RowMapper<Account> rowMapper = new BeanPropertyRowMapper<Account>(Account.class);
二、Spring的事务管理
1、Spring事务管理概述
1.什么是Spring的事务管理?为什么需要事务管理?
在实际开发中,操作数据库时都会涉及到事务管理问题,但通过在业务方法中硬编码的方式进行,弊端显而易见。Spring提供声明式事务管理,基于AOP实现,无需编写任何事务管理代码,配置即可用,商化了传统的事务管理流程,并且在一定程度上减少了开发者的工作量。
事务管理实际上就是控制数据的安全访问对于数据修改,要么都执行,要么都不执行
2.事务管理器的核心接口
在Spring的所有JAR包中,包含一个名为spring-tx-4.3.6.RELEASE的JAR包,该包就是Spring提供的用于事务管理的依赖包。在该JAR包的org.springframework.transaction包中,有3个接口文件Platform TransactionManager、TransactionDefinition 和TransactionStatus,如下图
(1)Platform TransactionManager
<1> Platform TransactionManager 接口是Spring提供的平台事务管理器,主要用于管理事务。该接口中提供了三个事务操作的方法,具体如下:
- TransactionStatus get Transaction(TransactionDefinition definition):用于获取事务状态信息
void commit(TransactionStatus status):用于提交事务
void rolback(TransactionStatus status):用于回滚事务
<2> Platform TransactionManager接口只是代表事务管理的接口,并不知道底层是如何管理事务的,具体如何管理事务则由它的实现类来完成。该接口常见的几个实现类如下:(小提示:当底层采用不同的持久层技术时,系统只需使用不同的Platform TransactionManager 实现类即可。)
(2)TransactionDefinition
TransactionDefinition 接口是事务定义(描述)的对象,该对象中定义了事务规则.并提供了获取事务相关信息的方法,具体如下:
- Sting getName():获取事务对象名称
int getlsolationLevel():获取事务的隔离级别
int getpropagationBehavior():获取事务的传播行为(*)
int getTimeout();获取事务的超时时间
boolean isReadOnly():获取事务是否只读
上述方法中,事务的传播行为是指在同一个方法中,不同操作前后所使用的事务。传播行为有很多种,具体如下表所示:
在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创
建事务,通常情况下,数据的查询不会影响原数据的改变,所以不需要进行事
务管理,而对于数据的插入、更新和删除操作,必须进行事务管理。如果没有
指定事务的传播行为,Spring 默认传播行为是REQUIRED
(3)TransactionStatus
TransactionStatus 接口是事务的状态,它描述了某一时间点上事务的状态信息。该接口中包含6个方法,具体如下:
void flush();刷新事务
aboolean hasSavepoint():获取是否存在保存点
boolean isCompleted():获取事务是否完成
boolean isNewTransaction():获取是否为新事务
boolean isRollbackOnly():获取事务是否回液
void setRollbackOnly():设置事务回滚
(3)事务管理的方式

声明式事务管理最大的优点在于开发者无需通过编程的方式来管理事务,只需在配置文件中进行相关的事务规则声明,就可以将事务应用到业务逻辑中。这使得开发人员可以更加专注于核心业务逻辑代码的编写,在一定程度上减少了工作量,提高了开发效率,所以在实际开发中,通常都推荐使用声明式事务管理。
2、Spring声明式事务管理
1.如何实现Spring的声明式事务管理?
Spring的声明式事务管理可以通过两种方式来实现,一种是基于XML的方式,另一种是基于Annotation的方式。
2.配置声明式事务
(1)声明式事务关注的核心问题是
——对哪些方法,采取什么样的事务策略
(2)配置步骤(*重点)

3、基于XML方式的声明式事务
1. 元素
基于XML方式的声明式事务是在配置文件中通过元素配置事务规则来实现的。当配置了事务的增强处理后,就可以通过编写的AOP配置,让Spring自动对目标生成代理。tx:advice元素及其子元素如下图所示:
2. 配置tx:advice元素的重点是配置tx:method子元素
上图中使用灰色标注的几个属性是tx:method元素中的常用属性。其属性描述具体图
3.xml文件配置的注意事项
(1)xml配置文件的头部

(2)配置数据源

(3)配置JDBC模板

(4)事务管理器

(5)其他

3、基于Annotation方式的声明式事务
1. 基于Annotation方式的声明式事务步骤
(1) 在Spring容器中注册事务注解驱动;
<tx:annotation-driven transaction-manager="transactionManager"7>
(2) 在需要事务管理的类或方法上使用@Transactional
如果将注解添加在Bean类上.则表示事务的设置对整个Bean类的所有方法都起作用;如果将注解添加在Bean类中的某个方法上,则表示事务的设置只对该方法有效。
使用@Transactional注解时,可以通过参数配置事务详情:

3.注意事项
(1)事务管理


(2)注解
<!-- 5.开启注解,扫描全包的注解 -->
<context:component-scan back-package="miao.SpringJDBC"/>
<!-- 6.注册事务管理器驱动,自动织入事务管理 -->
<tx:annotation-driven transaction-manager="txManager"/>
(3)使用注解实现事务处理


