第五阶段spring3框架技术_第1页
第五阶段spring3框架技术_第2页
第五阶段spring3框架技术_第3页
第五阶段spring3框架技术_第4页
第五阶段spring3框架技术_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

北京传智播客教育Spring3传智•左慈主要内容事务管理SSH整合事务管理传智•左慈北京传智播客教育知识点0.1:事务的概念:事务是一组操作的执行单元,相对于数据库操作来讲,事务管理的是一组SQL指令,比如增加,修改,删除等,事务的一致性,要求,这个事务内的操作必须全部执行成功,如果在此过程种出现了差错,比如有一条SQL语句没有执行成功,那么这一组操作都将全部回滚仅用四个词解释事务(ACID)atomic(原子性):要么都发生,要么都不发生。

consistent(一致性):数据应该不被破坏。

Isolate(隔离性):用户间操作不相混淆Durable(持久性):永久保存,例如保存到数据库中等北京传智播客教育如果使用Spring,

我们就不再需要手工控制事务知识点1:Spring事务管理Spring事务管理机制顶层抽象主要包括三个核心组件PlatformTransactionManager平台事务管理器TransactionDefinition事务定义信息和事务管理相关参数隔离级别、传播级别超时、事务是否只读TransactionStatus事务运行过程中的动态信息北京传智播客教育知识点2:理解事务管理器事务管理器实现目标org.springframework.jdbc.datasource.DataSourceTransactionManager在单一的JDBC

Datasource中的管理事务org.springframework.orm.hibernate3.HibernateTransactionManager当持久化机制是hibernate时,用它来管理事务org.springframework.jdo.JdoTransactionManager当持久化机制是Jdo时,用它来管理事务。org.springframework.transaction.jta.JtaTransactionManager使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用org.springframework.orm.ojb.PersistenceBrokerTransactionManager当apache的ojb用作持久化机制时,用它来管理事务。介绍spring的事务管理器spring没有直接管理事务,而是将管理事务的责任委托给JTA或相应的持久性机制所提供的某个特定平台的事物实现知识点2:事务管理器知识点3:数据库系统提供了四种事务隔离级别隔离级别含义DEFAULT使用后端数据库默认的隔离级别(spring中的的选择项)READ_UNCOMMITED允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读READ_COMMITTED允许在并发事务已经提交后读取。可防止脏读,但幻读和不可重复读仍可发生REPEATABLE_READ对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。SERIALIZABLE完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。北京传智播客教育北京传智播客教育知识点3:数据库系统提供了四种事务隔离级别不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read mited的隔离级别最低。大多数据库默认的隔离级别为Read

Commited,如SqlServer当然也有少部分数据库默认的隔离级别为Repeatable_Read

,如Mysql,Oracle数据库支持READCOMMITTED和SERIALIZABLE两种事务隔离性级别,不支持READ

UNCOMMITTED和REPEATABLE

READ这两种隔离性级别。虽然SQL标准定义的默认事务隔离性级别是SERIALIZABLE,但是Oracle数据库默认使用的事务隔离性级别却是READ

COMMITTED.北京传智播客教育知识点4:理解事务属性传播行为:定义关于客户端和被调用方法的事物边界及两个被事务管理的方式相互调用的问题北京传智播客教育知识点4:理解事务属性--事物传播行为传播行为意义REQUIRED业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务SUPPORTS这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行REQUIRESNEW属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行NOT_SUPPORTED声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行MANDATORY该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器就会抛出例外。Never指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中.如果没有活动事务,则按

REQUIRED属性执行.它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效知识点4:理解事务属性--事物传播行为传播行为Api提示PROPAGATION_REQUIRED支持当前事务,如果不存在,创建一个新的。默认PROPAGATION_SUPPORTS支持当前事务,如果不存在,就不使用事务PROPAGATION_REQUIRES_NEW如果有事务存在,挂起当前事务,创建一个新的事务PROPAGATION_NOT_SUPPORTED以非事务方式运行,如果有事务存在,挂起当前事务PROPAGATION_MANDATORY支持当前事务,如果不存在,抛出异常PROPAGATION_NEVER以非事务方式运行,如果有事务存在,抛出异常PROPAGATION_NESTED如果当前事务存在,则嵌套事务执行。Savepoint北京传智播客教育知识点5:理解事务Spring提供了两种事务管理方式编程序事务管理编写程序式的事务管理可以清楚的定义事务的边界,可以实现细粒度的事务控制,比如你可以通过程序代码来控制你的事务何时开始,何时结束等,与后面介绍的声明式事务管理相比,它可以实现细粒度的事务控制。开发时很少用。通过TransactionTemplate手动管理事务声明式事务管理(*****)如果你并不需要细粒度的事务控制,你可以使用声明式事务,在

Spring中,你只需要在Spring配置文件中做一些配置,即可将操作纳入到事务管理中,解除了和代码的耦合,这是对应用代码影响最小的选择,从这一点再次验证了Spring关于AOP的概念。当你不需要事务管理的时候,可以直接从Spring配置文件中移除该设置转账案例:--数据库与表#数据库CREATE

DATABASE

springdb3;USE

springdb3;#数据表CREATE

TABLE

`account`

(`id`

int(11)

PRIMARY

KEY

NOT

NULL

AUTO_INCREMENT,`name`

varchar(20)

NOT

NULL,`money`

double

DEFAULT

NULL)

;INSERT

INTO

`account`

VALUES

('1',

'jack',

'1000');INSERT

INTO

`account`

VALUES

('2',

'rose',

'1000');转账案例:环境搭建创建web项目导入jar包springaopjdbcc3p0驱动在src目录编写配置applicationContext.xmlperties转账案例:实现DaoIAccountDao接口out(String

outAccouont,double

money)in(String

inAccount

,double

money)AccountDaoImpl实现类ServiceIAccountService接口transfer(String

outAccount

,String

inAccount,double

money)AccountServiceImpl实现类DomainTest转账案例:dao实现类public

class

AccountDaoImpl

extends

JdbcDaoSupport

implements

IAccountDao

{@Overridepublic

void

out(String

outAccount,

double

money)

{//查询账号Account

account

=this.getJdbcTemplate().queryForObject("select

*

from

account

where

name

=

?",

newRowMapper<Account>(){@Overridepublic

Account

mapRow(ResultSet

rs,

int

rowNum)

throws

SQLException

{Account

account

=

new

Account();account.setId(rs.getInt("id"));account.setName(rs.getString("name"));account.setMoney(rs.getDouble("money"));return

account;}}

,outAccount);if(account.getMoney()

<

money){throw

new

RuntimeException("账号余额不足");}this.getJdbcTemplate().update("update

account

set

money

=money

-

?

where

name

=?",

money,outAccount);}@Overridepublic

void

in(String

inAccount,

double

money)

{this.getJdbcTemplate().update("update

account

set

money

=money

+

?

where

name

=?",

money,inAccount);}}转账案例:service实现类package

cn.itcast.service.impl;import

cn.itcast.dao.IAccountDao;import

cn.itcast.service.IAccountService;public

class

AccountServiceImpl

implements

IAccountService

{private

IAccountDao

accountDao;public

void

setAccountDao(IAccountDao

accountDao)

{this.accountDao

=

accountDao;}@Overridepublic

void

transfer(String

outAccount,

String

inAccount,

double

money)

{accountDao.out(outAccount,

money);//int

i=1/0; //有错

accountDao.in(inAccount,

money);}}转账案例:spring容器—数据初始化数据源,c3p0Jdbc模板,JdbcTemplateDaoService事务管理器,DataSourceTransactionManager代码看备注1

Spring事务管理编程式管理声明式管理原始方式tx/aop方法注解2

Spring事务管理--编程式管理使用事务模板TransactionTemplate2

Spring事务管理--编程式管理使用TransactionCallbackWithoutResult进行简单处理将需要使用事务的代理放 置到默认方法中即可3

Spring事务管理—声明式:原始方式使用TransactionProxyFactoryBean生存代理事务管理器transactionManager目标类target接口proxyInterfaces事务定义参数transactionAttributes参数需要使用<props>进行配置格式:PROPAGATION,ISOLATION,readOnly,-Exception,+ExceptionPROPAGATION

传播行为ISOLATION

隔离级别readOnly:只读事务,不能进行修改操作-Exception:发生这些异常回滚事务+Exception:发生这些异常仍然提交事务3

Spring事务管理—声明式:原始方式4

Spring事务管理—声明式:基于tx/aop配置事务管理器使用<tx:advice>对事务管理器增强配置aop使切入点与通知关联4

Spring事务管理—声明式:基于tx/aop4

Spring事务管理—声明式:基于tx/aop4

Spring事务管理—声明式:注解在spring容器中注册驱动<tx:annotation-driven

transaction-manager="txManager"/>在业务类中添加注解@Transactional4

Spring事务管理—声明式:注解@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT,readOnly=false,rollbackFor=ArithmeticException.class)propagation=Propagation.REQUIRED

传播行为isolation=Isolation.DEFAULT

隔离级别readOnly=false

是否只读rollbackFor=ArithmeticException.class发生异常回滚noRollbackFor=xxx.class

发生异常仍然提交事务SSH整合传智•左慈大纲Jar包手动方式api整合Spring整合Hibernate使用hibernate.cfg.xml不使用hibernate.cfg.xmlStruts整合SpringSpring配置actionStruts配置action纯注解整合1.1整合jar--strutsstruts2-core-2.3.14.jar

:Struts

2框架的核心类库xwork-core-2.3.14.jar

:Command模式框架,WebWork和Struts2都基于

xworkognl-3.0.6.jar:对象图导航语言(Object

Graph

Navigation

Language),struts2框架通过其读写对象的属性freemarker-2.3.19.jar

:Struts

2的UI标签的模板使用FreeMarker编写commons-fileupload-1.2.2.jar文件上传组件,2.1.6版本后需要加入此文件commons-io-2.0.1.jar

传文件依赖的jar包commons-lang3-3.1.jar

对java.lang包的增强asm-3.3.jar:提供了字节码的读写的功能,包含了核心的功能,而其他的jar,都是基于这个核心的扩展.mons-3.3.jar:

提供了基于事件的表现形式。asm-tree-3.3.jar:

提供了基于对象的表现形式。javassist-3.11.0.GA.jar:代码生成工具,struts2用它在运行时扩展Java类commons-logging-1.1.x.jar:ASF出品的日志包,Struts2框架使用这个日志包来支持Log4J和JDK

1.4+的日志记录。(spring也会导入)1.2整合jar--struts在struts整合spring时在导入struts2-spring-plugin-2.3.14.jarStruts注解开发jarstruts2-convention-plugin-2.3.14.jar注意:如果不使用注解开发,千万不到导入此包!!!1.3整合jar--springspring基本开发,4个核心,1个日志spring-beans-3.2.2.RELEASE.jarspring-context-3.2.2.RELEASE.jarspring-core-3.2.2.RELEASE.jarspring-expression-3.2.2.RELEASE.jarmons.logging-1.1.1.jarweb开发:spring-web-3.2.2.RELEASE.jarJunit测试spring-test-3.2.2.RELEASE.jarAOP开发spring-aop-3.2.2.RELEASE.jarspring-aspects-3.2.2.RELEASE.jar.aopalliance-1.0.0.jar.aspectj.weaver-1.6.8.RELEASE.jarJDBC开发spring-jdbc-3.2.2.RELEASE.jarspring-tx-3.2.2.RELEASE.jar1.4整合jar--spring与ORM框架整合需要的包(hibernate)spring-orm-3.2.2.RELEASE.jar1.5

整合jar--hibernate核心jarhibernate3.jar必须jarantlr-2.7.6.jar,一个语言转换工具,Hibernate利用它实现HQL

到SQL

的转换commons-collections-3.1.jar,collections

Apache的工具集,用来增强Java对集合的处理能力dom4j-1.6.1.jar,dom4j

XML

解析器javassist-3.12.0.GA.jar,代码生成工具,Hibernate用它在运行时扩展Java类jta-1.1.jar,标准的JAVA

事务(跨数据库)处理接口slf4j-api-1.6.1.jar,hibernate使用的日志框架jpa(注解开发)hibernate-jpa-2.0-api-1.0.1.Final.jar,JPA

接口开发包整合log4jslf4j-log4j12-1.7.5.jarehcacheehcache-1.5.0.jarbackport-util-concurrent-2.1.jarcommons-logging

(spring已经提供)1.6整合jar—连接池&驱动C3P0.mchange.v2.c3p0-.jarDBCPmons.dbcp-1.2.2.osgi.jarmons.pool-1.5.3.jar驱动mysql-connector-java-5.1.22-bin.jar2

整合—手动使用API2

整合—手动使用APIHibernateTemplate

api1)

增加操作save2)

修改操作update3)

删除操作delete4)

根据id查询get/loadList

find(String

queryString,Object...values)

查询一个集合对象(带条件查询)

-----手动写HQL语句List

findByCriteria(DetachedCriteria

criteria)

条件查询

------面向对象方式封装,自动生成HQLList

findByCriteria(DetachedCriteria

criteria,int

firstResult,

intmaxResults)

-----分页查询List

findByNamedQuery(String

queryName,

Object...values)将HQL语句命名,配置到配置文件,进行查询3

SH—有配置文件导入:spring-orm-3.2.2.RELEASE.jar使用HibernateTemplate操作PO类需要注入SessionFactory使用LocalSessionFactoryBean

获得SessionFactory通过configLocation属性设置hibernate.cfg.xml位置使用HibernateTransactionManager配置事务需要注入SessionFactory3

SH—有配置文件3

SH—有配置文件配置数据源3

SH—有配置文件配置sessionFactory和HibernateTemplate模板3

SH—有配置文件事务管理4

SH—没有配置文件使用HibernateDaoSupport直接操作HibernateTemplate需要注入sessionFactory使用LocalSessionFactoryBean配置SessionFactory通过hibernateProperties配置hibernate的其他参数通过mappingLocations确定映射文件mappingDirectoryLocations确定映射文件所在目录4

SH—没有配置文件4

SH—没有配置文件5

SS—spring配置action导入:struts2-spring-plugin-2.3.14.jar将Action配置到spring容器中,bean必须配置scope="prototype"5

SS—spring配置actionAction类6

SS—struts配置action7

SSH

注解--hibernate@Entity

实体类@Table

生成目标表@Id

主键@GeneratedValue

主键生成策略@Column

定义生成列@GeneratedValue只支持IDENTITY

SEQUENCE

和TABLE如果使用其它类型的生成策略需要自定义@GenericGenerator

用于自定义生成策略@GeneratedValue

的generator

用于指定自定义生成策略@Temporal

生成日期类型@OneToMany

配置一对多@ManyToOne

配置多对一@JoinColumn(name="")在多方配置外键@ManyToMany配置多对多@JoinTable(name="中间表",joinColumns=@JoinColumn(name="自己外键"),inverseJoinColumns=@JoinCol

温馨提示

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

评论

0/150

提交评论