Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版)课件 第9章 Spring的数据库开发及事务管理_第1页
Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版)课件 第9章 Spring的数据库开发及事务管理_第2页
Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版)课件 第9章 Spring的数据库开发及事务管理_第3页
Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版)课件 第9章 Spring的数据库开发及事务管理_第4页
Java EE轻量级框架应用实战-SSM框架(Spring MVC+Spring+MyBatis)(第2版)课件 第9章 Spring的数据库开发及事务管理_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SpringJDBCSpringJdbcTemplate类的常用方法Spring事务管理概述声明式事务管理第9章

Spring的数据库开发及事务管理2024/1/29学习目标/Target2了解JDBC模块的作用

熟悉SpringJDBC的配置

掌握JdbcTemplate类常用方法的使用

熟悉Spring事务管理的3个核心接口

了解Spring事务管理的两种方式掌握基于XML和基于注解的声明式事务的使用章节概述/Summary3数据库用于处理持久化业务产生的数据,应用程序在运行过程中经常要操作数据库。一般情况下,数据库的操作由持久层来实现。作为扩展性较强的一站式开发框架,Spring也提供了持久层SpringJDBC功能,SpringJDBC可以管理数据库连接资源,简化传统JDBC的操作,进而提升程序数据库操作的效率。本章将对SpringJDBC相关知识进行详细讲解。

目录/CONTENTSSpringJDBC声明式事务管理Spring事务管理概述SpringJdbcTemplate类的常用方法41432SpringJDBC01第9章Spring的数据库开发及事务管理SpringJDBC模块有什么作用?SpringJDBC6

Spring的JDBC模块负责数据库资源管理和错误处理,大大简化了开发人员对数据库的操作,使得开发人员可以从繁琐的数据库操作中解脱出来,从而将更多的精力投入到编写业务逻辑当中。SpringJdbcTemplate的解析7

针对数据库的操作,Spring框架提供了JdbcTemplate类,该类是Spring框架数据抽象层的基础。可以说,JdbcTemplate类是SpringJDBC的核心类。

接口JdbcOperations抽象类JdbcAccessor核心类JdbcTemplateextendsimplementsJdbcTemplate类的继承结构具体如下图所示:SpringJdbcTemplate的解析8

从JdbcTemplate的继承关系图可以看出,JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些访问数据库时使用的公共属性。

其主要功能是获取数据库连接,还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口。DataSource:

该接口负责对SQLException进行转译工作。通过必要的设置获取SQLExceptionTranslator中的方法,可以使JdbcTemplate在需要处理SQLException时,委托SQLExceptionTranslator的实现类来完成相关的转译工作。SQLExceptionTranslator:

而JdbcOperations接口定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作。SpringJDBC的配置9

SpringJDBC模块主要由4个包组成,分别是core(核心包)、dataSource(数据源包)、object(对象包)和support(支持包)。说明说明core包含JDBC的核心功能,即JdbcTemplate类、SimpleJdbclnsert类、SimpleJdbcCall类、NamedParameterJdbcTemplate类dataSource访问数据源的实用工具类,它有多种数据源的实现,可以在JavaEE容器外部测试JDBC代码object以面向对象的方式访问数据库,它允许执行查询并将返回结果作为业务对象,可以在数据表的列和业务对象的属性之间映射查询结果support包含core包和object包的支持类,如提供异常转换功能的SQLException类SpringJDBC的配置10

从上表可以看出,Spring对数据库的操作都封装在了这几个包中,而想要使用SpringJDBC,就需要对其进行配置。<beanid="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/spring"/><propertyname="username"value="root"/><propertyname="password"value="root"/></bean><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><propertyname="dataSource"ref="dataSource"/></bean><beanid="xxx"class="Xxx"><propertyname="jdbcTemplate"ref="jdbcTemplate"/></bean> 1.配置数据源2.配置JDBC模板3.配置需要实例化的Bean注入数据源注入JDBC模板SpringJDBC的配置11

关于上述示例dataSource配置中的4个属性说明,如下表所示:注意:上表中的属性值在实际配置时,需要根据数据库类型和设置进行相应配置。属性名含义driverClassName所使用的驱动名称,对应驱动JAR包中的Driver类url数据源所在地址username访问数据库的用户名password访问数据库的密码SpringJdbcTemplate类

的常用方法02第9章Spring的数据库开发及事务管理SpringJdbcTemplate的常用方法13

在JdbcTemplate核心类中,提供了大量的更新和查询数据库的方法,我们就是使用的这些方法来操作数据库的。execute()execute(Stringsql)方法可用于执行sql语句update()update()用于执行插入、更新和删除操作query()query()用于执行数据查询操作execute()14

使用execute(Stringsql)方法执行建表的案例实现步骤如下:在MySQL中创建一个名为spring的数据库;创建Web项目,导入相关Jar包;创建Spring配置文件,配置数据源和JDBC模板;创建测试类,测试程序。publicclassJdbcTemplateTest{publicstaticvoidmain(String[]args){ApplicationContextapplicationContext= newClassPathXmlApplicationContext("applicationContext.xml");JdbcTemplatejdTemplate=(JdbcTemplate)applicationContext.getBean("jdbcTemplate");jdTemplate.execute("createtableaccount("idintprimarykeyauto_increment,"+ "usernamevarchar(50),"+ "balancedouble)");}}<beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"value="com.mysql.jdbc.Driver"/> <propertyname="url"value="jdbc:mysql://localhost/spring"/> <propertyname="username"value="root"/> <propertyname="password"value="root"/></bean><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"> <propertyname="dataSource"ref="dataSource"/></bean>update()15

update()方法可以完成插入、更新和删除数据的操作。在JdbcTemplate类中,提供了一系列的update()方法,其常用方法下表所示:方法说明intupdate(Stringsql)该方法是update方法的重载形式,可直接执行传入的SQL语句,并返回受影响的行数intupdate(PreparedStatementCreatorpsc)该方法执行从PreparedStatementCreator返回的语句,并返回受影响的行数intupdate(Stringsql,PreparedStatementSetterpss)该方法通过PreparedStatementSetter设置SQL语句中的参数,并返回受影响的行数intupdate(Stringsql,Object...args)该方法使用Object...设置SQL语句中的参数,要求参数不能为NULL,并返回受影响的行数query()16

JdbcTemplate类中还提供了大量的query()方法来处理各种对数据库表的查询操作。其中,常用的几个query()方法如下表所示:方法说明Listquery(Stringsql,RowMapperrowMapper)执行String类型参数提供的SQL语句,并通过RowMapper返回一个List类型的结果Listquery(Stringsql,PreparedStatementSetterpss,RowMapperrowMapper)根据String类型参数提供的SQL语句创建PreparedStatement对象,通过RowMapper将结果返回List中Listquery(Stringsql,Object[]args,RowMapperrowMapper)使用Object[]的值来设置SQL语句中的参数值,采用RowMapper回调方法可以直接返回List类型的数据queryForObject(Stringsql,RowMapperrowMapper,Object...args)将args参数绑定到SQL语句中,并通过RowMapper返回一个Object类型的单行记录queryForList(Stringsql,Object[]args,class<T>elementType)该方法可以返回多行数据的结果,但必须是返回列表,elementType参数返回的是List元素类型Spring事务

管理概述03第9章Spring的数据库开发及事务管理什么是Spring的事务管理?Spring事务管理概述18

在实际开发中,操作数据库时都会涉及到事务管理问题,为此Spring提供了专门用于事务处理的API。Spring的事务管理简化了传统的事务管理流程,并且在一定程度上减少了开发者的工作量。事务管理的核心接口19

在Spring的所有JAR包中,包含一个名为spring-tx.RELEASE的JAR包,该包就是Spring提供的用于事务管理的依赖包。在该JAR包的org.springframework.transaction包中,有3个接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus,如下图所示:Spring事务管理的三个核心接口事务管理的核心接口201.PlatformTransactionManager

PlatformTransactionManager接口是Spring提供的平台事务管理器,主要用于管理事务。该接口中提供了三个事务操作的方法,具体如下:TransactionStatusgetTransaction(TransactionDefinitiondefinition);用于获取事务状态信息voidcommit(TransactionStatusstatus);用于提交事务voidrollback(TransactionStatusstatus);用于回滚事务事务管理的核心接口21PlatformTransactionManager接口只是代表事务管理的接口,并不知道底层是如何管理事务的,具体如何管理事务则由它的实现类来完成。该接口常见的几个实现类如下:1org.springframework.jdbc.datasource.DataSourceTransactionManager用于配置JDBC数据源的事务管理器2org.springframework.orm.hibernate4.HibernateTransactionManager用于配置Hibernate的事务管理器3org.springframework.transaction.jta.JtaTransactionManager用于配置全局事务管理器小提示:当底层采用不同的持久层技术时,系统只需使用不同的PlatformTransactionManager实现类即可。常用接口实现类事务管理的核心接口222.TransactionDefinition

TransactionDefinition接口是事务定义(描述)的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法,具体如下:StringgetName();获取事务对象名称intgetIsolationLevel();获取事务的隔离级别intgetPropagationBehavior();获取事务的传播行为intgetTimeout();获取事务的超时时间booleanisReadOnly();获取事务是否只读属性名称值描述PROPAGATION_REQUIREDREQUIRED表示当前方法必须运行在一个事务环境当中,如果当前方法已处于事务环境中,则可以直接使用该方法,否则在开启一个新事务后执行该方法PROPAGATION_SUPPORTSSUPPORTS如果当前方法处于事务环境中,则使用当前事务,否则不使用事务PROPAGATION_MANDATORYMANDATORY表示调用该方法的线程必须处于当前事务环境中,否则拋出异常PROPAGATION_REQUIRES_NEWREQUIRES_NEW要求方法在新的事务环境中执行。如果当前方法已在事务环境中,则先暂停当前事务,在启动新的事务后执行该方法;如果当前方法不在事务环境中,则在启动一个新的事务后执行该方法PROPAGATION_NONSUPPORTEDNOT_SUPPORTED不支持当前事务,总是以非事务状态执行。如果调用该方法的线程处于事务环境中,则先暂停当前事务,然后执行该方法PROPAGATION_NEVERNEVER不支持当前事务。如果调用该方法的线程处于事务环境中,则拋出异常PROPAGATION_NESTEDNESTED即使当前执行的方法处于事务环境中,依然会启动一个新的事务,并且方法在嵌套的事务里执行。即使当前执行的方法不在事务环境中,也会启动一个新事务,然后执行该方法事务管理的核心接口23

上述方法中,事务的传播行为是指在同一个方法中,不同操作前后所使用的事务。传播行为有很多种,具体如下表所示:

在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创建事务,通常情况下,数据的查询不会影响原数据的改变,所以不需要进行事务管理,而对于数据的插入、更新和删除操作,必须进行事务管理。如果没有指定事务的传播行为,Spring默认传播行为是REQUIRED。事务管理的核心接口243.TransactionStatusTransactionStatus接口是事务的状态,它描述了某一时间点上事务的状态信息。该接口中包含6个方法,具体如下:voidflush();刷新事务booleanhasSavepoint();获取是否存在保存点booleanisCompleted();获取事务是否完成booleanisNewTransaction();获取是否为新事务booleanisRollbackOnly();获取事务是否回滚voidsetRollbackOnly();设置事务回滚事务管理的方式25通过编写代码实现的事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚编程式事务管理声明式事务管理通过AOP技术实现的事务管理,主要思想是将事务作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”植入到业务目标类中Spring事务管理分两种方式

声明式事务管理最大的优点在于开发者无需通过编程的方式来管理事务,只需在配置文件中进行相关的事务规则声明,就可以将事务应用到业务逻辑中。这使得开发人员可以更加专注于核心业务逻辑代码的编写,在一定程度上减少了工作量,提高了开发效率,所以在实际开发中,通常都推荐使用声明式事务管理。声明式事务管理04第9章Spring的数据库开发及事务管理如何实现Spring的声明式事务管理?声明式事务管理27

Spring的声明式事务管理可以通过两种方式来实现,一种是基于XML的方式,另一种是基于Annotation的方式。接下来的两个小节中,将对这两种声明式事务管理方式进行详细讲解。

基于XML方式的声明式事务是在配置文件中通过<tx:advice>元素配置事务规则来实现的。当配置了事务的增强处理后,就可以通过编写的AOP配置,让Spring自动对目标生成代理。<tx:advice>元素及其子元素如下图所示:基于XML方式的声明式事务28

配置<tx:advice>元素的重点是配置<tx:method>子元素,上图中使用灰色标注的几个属性是<tx:method>元素中的常用属性。其属性描述具体如下:基于XML方式的声明式事务29属性名称描述name该属性为必选属性,它指定了与事务属性相关的方法名,其属性值支持使用通配符,如'get*'、'handle*'、'*Order'等propagation用于指定事务的传播行为,其属性值就是表9-5中的值,它的默认值为REQUIREDisolation该属性用于指定事务的隔离级别,其属性值可以为DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。它的默认值为DEFAULTread-only该属性用于指定事务是否只读,其默认值为falsetimeout该属性用于指定事务超时的时间,其默认值为-1,即永不超时rollback-for该属性用于指定触发事务回滚的异常类,在指定多个异常类时,异常类之间以英文逗号分隔no-rollback-for该属性用于指定不触发事务回滚的异常类,在指定多个异常类时,异常类之间以英文逗号分隔基于Annotation方式的声明式事务1在Spring容器中注册事务注解驱动;2在需要事务管理的类或方法上使用@Transactional注解。<tx:annotation-driventransaction-manager="transactionManager"/>

如果将注解添加在Bean类上,则表示事务的设置对整个Bean类的所有方法都起作用;如果将注解添加在Bean类中的某个方法上,则表示事务的设置只对该方法有效。基于Annotation方式的声明式事务30

使用@Transactional注解时,可以通过参数配置事务详情:基于Annotation方式的声明式事务31属性类型说明valueString用于指定需要使用的事务管理器,默认为"",其别名为transactionManagertransactionManager指定事务的限定符值,可用于确定目标事务管理器,匹配特定的限定值(或者Bean的name值),默认为"",其别名为valuepropagation枚举型:Propagation可选的传播性设置,用于指定事务的传播行为,默认为Propagation.REQUIRED。使用举例:@Transactional(propagation=Propagation.REQUIRES_NEW)isolation枚举型:Isolation可选的隔离性级别,用于指定事务的隔离级别,默认为Isolation.DEFAULT(底层事务的隔离级别)。使

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论