黑马程序员郑州中心编著黑马程序员:三大框架Spring-day11笔记Spring事务管理机制Spring事务管理的四个优点:1.提供一致的对于不同的事务管理的API2.支持声明式事务管理(重点)3.编程事务管理(在开发中应用比较少)4.优秀的整合与Spring的数据访问我们重点讲解spring的事务管理的相关的API,还有声明式事务管理Spring事务管理主要提供了三个接口来完成1.org.springframework.transaction.PlatformTransactionManager这是一个事务管理器,可以来选择相关的平台(jdbchibernatejpa…)2.TransactionDefinition它定义事务的一些相关信息例如隔离传播超时只读3.TransactionStatus它主要描述事务具体的运行状态1.1.1PlatformTransactionManager平台事务管理器在不同的持久化层解决技术它的事务代码不一样。JDBC开发Connectioncon=……;con.setAutoCommit(false);//开启事务con.rollback();con.commit();Hibernate开发Sessionsession=….;Transactiont=session.beginTransaction();t.commit();t.rollback();黑马程序员郑州中心编著PlatformTransactionManager接口APIDataSourceTransactionManager主要针对于JdbcTemplate开发MyBatis开发HibernateTransactionManasger主要针对于Hibernate开发JpaTransactionManager主要针对于JPA开发。1.1.2TransactionDefinition它描述的是事务的定义信息。在TransactionDefinition中定义了大量的常量黑马程序员郑州中心编著1.1.2.1隔离以下是关于隔离性相关信息事务的四个特性ACID原子性一致性隔离性持久性。不考虑事务隔离性有什么问题?脏读,不可重复读虚读。ISOLATION_DEFUALT它使用后端数据库的默认隔离级别(spring中选项)ISOLATION_READ_UNCOMMITTED不能解决问题,会发生脏读不可重复读虚读ISOLATION_READ_COMMITTED可以解决脏读会产生不可重复读与虚读。ISOLATION_REPEATABLE_READ可以解决脏读,不可重复读解决不了虚读ISOLATION_SERIALIZABLE串行化,可以解决所有问题对于不现的数据库,它的底层默认事务隔离级别不一样。Oracle数据库它默认的是read_committedMysql数据库它默认的是repeatable_read.1.1.2.2超时黑马程序员郑州中心编著默认值是-1它使用的是数据库默认的超时时间。1.1.2.3只读它的值有两个true/false,如果选择true一般是在select操作时1.1.2.4传播它解决的是两个被事务管理的方法互相调用问题。它与数据库没关系,是程序内部维护的问题。以下定义了事务的传播行为以上操作中最常用的三种:PROPAGATION_REQUIRED默认值两个操作处于同一个事务,如果之前没有事务,新建一个事务PROPAGATION_REQUIRES_NEW两个操作处于不同的事务PROPAGATION_NESTED黑马程序员郑州中心编著它是一种嵌套事务,它是使用SavePoint来实现的。事务回滚时可以回滚到指定的savepoint,注意:它只对DataSourceTransactionManager有作用以下了解PROPAGATION_SUPPORTS支持当前事务,如果不存在,就不使用事务PROPAGATION_MANDATORY支持当前事务,如果不存在,抛出异常PROPAGATION_NOT_SUPPORTED以非事务运行,如果有事务存在,挂起当前事务PROPAGATION_NEVER以非事务运行,如果有事务存在,抛出异常1.1.3TransactionStatus它定义了事务状态信息,在事务运行过程中,得到某个时间点的状态黑马程序员郑州中心编著1.2声明式事务管理1.2.1事务管理方式1.编码方案不建议使用,它具有侵入性。在原有的业务代码基础上去添加事务管理代码2.声明式事务控制,基于AOP对目标进行代理,添加around环绕通知。这种方案,它不具有侵入性,不需要修改原来的业务代码1.2.2基于xml配置声明式事务管理方案第一步:在applicationContext.xml文件中添加aop与tx的名称空间第二步:在applicationContext.xml文件中配置Spring提供的advice是传统的springadvice1.声明事务管理器2.配置通知Spring为我们提供了一个TransactionInterceptor来完成增强对于这个增强,我们可以使用spring为我们提供的一个标签tx:advice来完成操作黑马程序员郑州中心编著3.配置切面因为使用的是传统的spring的advice,需要使用aop:advisor1.2.3基于annotation声明式事务管理方案可以使用@Transaction来在类或方法上添加声明式事务管理注意:需要在applicationContext.xml文件中使用相当于开启注解事务控制黑马程序员郑州中心编著问题:关于xml方式与annotation方式的优缺点?从简单上来说,使用注解更方便。使用配置的方案,可以对事务配置进行集中维护。第2章SSH框架整合SSh=struts2+spring+hibernatestruts22.3.24spring4.2.4hibernate5.0.7黑马程序员郑州中心编著2.1关于xml配置文件的整合方式2.1.1SSH整合jar包2.1.1.1Struts2框架需要jar包Asm是关于字节码操作Commons-fileupload关于文件上传Commons-io关于io流操作工具Commons-lang也是一个工具,包含了关于数据与字符串操作Freemaker标签库模板文件Javassist它也是关于字节码操作,动态代理可以使用它实现(类似于cglib)Log4j关于日志Ognl关于ognl表达式Struts2-corexwork-corstruts2框架底层是使用xwork黑马程序员郑州中心编著Struts2与spring整合还需要这个包如果需要使用struts2提供的json处理注意:如果使用注解方案,我们还需要导入一个jar包2.1.1.2Hibernate框架需要的jar包Antlr语法解析包Dom4j解析xmlGeronimo-jtaapachegeronimo它是一个开源javaEE服务器Geronimo-jta是这个开源项目提供jar包,在hibernate中是关于jta事务相关Hibernate-commoins-annotations黑马程序员郑州中心编著这个包是我们在hibernate下来使用jpa相关的注解,这样它不依赖于hibernateHibernate-core开发hibernate必须Hibernate-jpa它是关于hibernate对jpa的支持Jandex用于索引annotationJavassist关于字节码操作(注意:strtus2中也引入这个jar包了)Jboss-logging它是关于jboss统一日志处理如果使用关于jpa相关操作需要导入jpa依赖jar包C3p0连接池还需要数据库相关的驱动jar包还需要静态日志处理2.1.1.3Spring框架需要的jar包Spring最基本jar包黑马程序员郑州中心编著AOP开发SpringjdbcSpring事务管理需要txSpring整合hibernateSpring整合web开发如果使用到junit测试还需要commons-logginjar包黑马程序员郑州中心编著2.1.2创建工程完成整合前期准备需要的配置文件:Strtsu2框架src/strtus.xmlHibernate框架src/hibernate.cfg.xml在domain有Xxx.hbm.xmlSpring框架src/applicationContext.xml关于日志log4j.properties关于数据库连接db.properties2.1.3Spring整合hibernate基本原理:就是由spring来管理hibernate的SessionFactory2.1.3.1方式一:零障碍整合(了解)我们只需要使用spring中提供的一个LocalSessionFacotry来加载Hibernate的配置文件。Ssh-xml工程加载到服务器后,如果可以自动创建表,就代表spring整合hibernateok.注意:我们必须配置spring的ContextLoaderListener黑马程序员郑州中心编著2.1.3.2方式二(spring管理hibernate配置)不在需要hibernate.cfg.xml文件,所有关于hibernate.cfg.xml文件中的配置都在spring的配置文件中来配置。首先要配置数据源接下来引入properties文件创建LocalSessionFactoryBean来完成spring管理hibernate中的SessionFactory上述的props可以简化成下面方案黑马程序员郑州中心编著加载hbm.xml配置文件mappingResources它类似于我们之前mappingresource=””mappingLocations它加载时是根据类路径加载classpath:路径mappingJarLocations它会加载jar文件中的hbm.xml文件mappingDirectoryLocations它加载的目录2.1.3.3spring整合hibernate后的DAOspring整合hiberante后,我们的dao只需要继承HibernateDaoSupport类在HibernateDaoSupport中只需要注入SessionFactory就可以获得到HibernateTemplate,它是对hibernate操作的一个简单封装,可以让我们方便使用原来hibernate的操作.黑马程序员郑州中心编著2.1.3.4编写service及测试测试黑马程序员郑州中心编著事务管理2.1.3.5HibernateTemplateAPI介绍保存操作session.save()修改操作session.update()删除操作session.delete()黑马程序员郑州中心编著类似于session.saveOrUpdate()根据持久化对象的状态来判断执行save或update获取操作get()load()Find操作类似于session.createQuery().setParameter().list()类似于hibernate中的QBC查询,完全的面向对象方案下面这个可以执行命名查询可以在User.hbm.xml文件中定义hql或sql黑马程序员郑州中心编著2.1.4Spring整合struts2框架2.1.4.1前期准备创建一个addUser.jsp页面创建UserAction类黑马程序员郑州中心编著Struts.xml文件中配置2.1.4.2Spring整合struts2原理分析1.spring整合struts2框架必须导入一个jar包struts2-spring-plugin.jar2.struts2框架配置文件加载顺序a.default.propertiesb.struts-default.xmlc.strtus-plugin.xml3.在struts2框架中所有的actioninterceptorresult全是