spring33jdbcorm事務(wù)三大框架整合表達(dá)式語(yǔ)言_第1頁(yè)
spring33jdbcorm事務(wù)三大框架整合表達(dá)式語(yǔ)言_第2頁(yè)
spring33jdbcorm事務(wù)三大框架整合表達(dá)式語(yǔ)言_第3頁(yè)
spring33jdbcorm事務(wù)三大框架整合表達(dá)式語(yǔ)言_第4頁(yè)
spring33jdbcorm事務(wù)三大框架整合表達(dá)式語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

spring33jdbcorm事務(wù)三大框架整合表達(dá)式語(yǔ)言第一頁(yè),共86頁(yè)。

DAO支持-1n

簡(jiǎn)介

Spring提供的DAO(數(shù)據(jù)訪問(wèn)對(duì)象)支持主要的目的是便于以標(biāo)準(zhǔn)的方式使用

不同的數(shù)據(jù)訪問(wèn)技術(shù),如JDBC,Hibernate或者JDO等。它不僅可以讓你方便地在

這些持久化技術(shù)間切換,

而且讓你在編碼的時(shí)候不用考慮處理各種技術(shù)中特定

的異常。n

一致的異常層次

Spring提供了一種方便的方法,把特定于某種技術(shù)的異常,如

SQLException,

轉(zhuǎn)化為自己的異常,這種異常屬于以DataAccessException

根的異常層次。這些異常封裝了原始異常對(duì)象,這樣就不會(huì)有丟失任何錯(cuò)誤信息

的風(fēng)險(xiǎn)。

如果使用攔截器方式,你在應(yīng)用中

就得自己小心處理

HibernateException、

JDOException等,最好是委托給

SessionFactoryUtils

convertHibernateAccessException、

convertJdoAccessException等方法。

這些方法可以把相應(yīng)的異常轉(zhuǎn)

化為與org.springframework.dao中定義的異常層

次相兼容的異常。第二頁(yè),共86頁(yè)。

DAO支持-2n

一致的DAO支持抽象類

為了便于以一種一致的方式使用各種數(shù)據(jù)訪問(wèn)技術(shù),如JDBC、JDO和

Hibernate,

Spring提供了一套抽象DAO類供你擴(kuò)展。這些抽象類提供了一些方

法,通過(guò)它們你可以

獲得與你當(dāng)前使用的數(shù)據(jù)訪問(wèn)技術(shù)相關(guān)的數(shù)據(jù)源和其他配

置信息。1:JdbcDaoSupport

-

JDBC數(shù)據(jù)訪問(wèn)對(duì)象的基類。

需要一個(gè)DataSource,同時(shí)為子

類提供

JdbcTemplate。2:HibernateDaoSupport

-

Hibernate數(shù)據(jù)訪問(wèn)對(duì)象的基類。

需要一個(gè)

SessionFactory,同時(shí)為子類提供

HibernateTemplate。也可以選擇直接通過(guò)

提供一個(gè)HibernateTemplate來(lái)初始化。3:JdoDaoSupport

-

JDO數(shù)據(jù)訪問(wèn)對(duì)象的基類。

需要設(shè)置一個(gè)

PersistenceManagerFactory,

同時(shí)為子類提供JdoTemplate。4:JpaDaoSupport

-

JPA數(shù)據(jù)訪問(wèn)對(duì)象的基類。

需要一個(gè)EntityManagerFactory,

同時(shí)

為子類提供JpaTemplate。第三頁(yè),共86頁(yè)。

對(duì)JDBC的支持-1n

簡(jiǎn)介

Spring

JDBC抽象框架所帶來(lái)的價(jià)值將在以下幾個(gè)方面得以體現(xiàn):(注:使

用了Spring

JDBC抽象框架之后,應(yīng)用開(kāi)發(fā)人員只需要完成斜體加粗字部分的編

碼工作。)1:指定數(shù)據(jù)庫(kù)連接參數(shù)2:打開(kāi)數(shù)據(jù)庫(kù)連接3:聲明SQL語(yǔ)句4:預(yù)編譯并執(zhí)行SQL語(yǔ)句5:遍歷查詢結(jié)果(如果需要的話)6:處理每一次遍歷操作7:處理拋出的任何異常8:處理事務(wù)9:關(guān)閉數(shù)據(jù)庫(kù)連接Spring將替我們完成所有單調(diào)乏味的JDBC底層細(xì)節(jié)處理工作第四頁(yè),共86頁(yè)。

對(duì)JDBC的支持-2n

Spring

JDBC抽象框架由四個(gè)包構(gòu)成:core、

dataSource、object以及support1:core包由JdbcTemplate類以及相關(guān)的回調(diào)接口和類組成。2:datasource包由一些用來(lái)簡(jiǎn)化DataSource訪問(wèn)的工具類,以及各種DataSource接

口的簡(jiǎn)單實(shí)現(xiàn)(主要用于單元測(cè)試以及在J2EE容器之外使用JDBC)組成。3:object包由封裝了查詢、更新以及存儲(chǔ)過(guò)程的類組成,這些類的對(duì)象都是線程安

全并且可重復(fù)使用的。它們類似于JDO,與JDO的不同之處在于查詢結(jié)果與數(shù)據(jù)庫(kù)

是“斷開(kāi)連接”的。它們是在core包的基礎(chǔ)上對(duì)JDBC更高層次的抽象。4:support包提供了一些SQLException的轉(zhuǎn)換類以及相關(guān)的工具類。

在JDBC處理過(guò)程中拋出的異常將被轉(zhuǎn)換成org.springframework.dao包中定

義的異常。因此使用Spring

JDBC進(jìn)行開(kāi)發(fā)將不需要處理JDBC或者特定的RDBMS才

會(huì)拋出的異常。所有的異常都是unchecked

exception,這樣我們就可以對(duì)傳遞

到調(diào)用者的異常進(jìn)行有選擇的捕獲。第五頁(yè),共86頁(yè)。

JdbcTemplate類-1n

JdbcTemplate是core包的核心類。它替我們完成了資源的創(chuàng)建以及釋放工作,從而簡(jiǎn)化了

對(duì)JDBC的使用。它還可以幫助我們避免一些常見(jiàn)的錯(cuò)誤,比如忘記關(guān)閉數(shù)據(jù)庫(kù)連接。n

定義接口如下:public

interface

Api

{

public

boolean

create(UserModel

um);}n

定義實(shí)現(xiàn)類如下:public

class

Impl

implements

Api{

private

DataSource

ds

=

null;

public

void

setDs(DataSource

ds){

this.ds

=

ds;

}

public

boolean

create(UserModel

um)

{

JdbcTemplate

jt

=

new

JdbcTemplate(ds);jt.execute("insert

into

tbl_user

(uuid,name)

values('"+um.getUuid()+"','"+um.getName()+"')");

return

false;

}}第六頁(yè),共86頁(yè)。n配置文件<bean

name="api"

class="cn.javass.Spring3.jdbc.Impl">

<property

name="ds"

ref="dataSource"></property></bean><bean

name="dataSource"

class="mons.dbcp.BasicDataSource"><property

name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property><property

name="url"><value>jdbc:oracle:thin:@localhost:1521:orcl</value></property>

<property

name="username">

<value>test</value>

</property>

<property

name="password"

value="test"/></bean>n客戶端public

static

void

main(String[]

args)throws

Exception

{

ApplicationContext

context

=

new

ClassPathXmlApplicationContext(

new

String[]

{"applicationContext-jdbc.xml"});

Api

api

=

(Api)context.getBean("api");

UserModel

um

=

new

UserModel();

um.setUuid("test1");

um.setName("test1");

api.create(um);}

JdbcTemplate類-2第七頁(yè),共86頁(yè)。

JdbcTemplate類-3n

如果是需要向里面?zhèn)鬟f參數(shù)的,就需要回調(diào)接口,如下:public

boolean

create(UserModel

um1){

JdbcTemplate

jt

=

new

JdbcTemplate(ds);

final

UserModel

um

=

um1;

class

myCallBack

implements

PreparedStatementCallback{

public

Object

doInPreparedStatement(PreparedStatement

pstmt)

throws

SQLException,

DataAccessException

{

pstmt.setString(1,um.getUuid());

pstmt.setString(2,um.getName());

System.out.println("dddddddd");

return

pstmt.executeUpdate();

}

}jt.execute("insert

into

tbl_user

(uuid,name)

values(?,?)",new

myCallBack());

return

false;}第八頁(yè),共86頁(yè)。

JdbcTemplate類-4n

JdbcTemplate類的基本實(shí)現(xiàn)方式:

模板方法設(shè)計(jì)模式+回調(diào)方法,把變和不變的部分分離開(kāi)來(lái),不變化的部分,實(shí)

現(xiàn)在模板里面,而變化的部分通過(guò)回調(diào)方法的方式,由外部傳入。n

JdbcTemplate類的回調(diào)方法體系第九頁(yè),共86頁(yè)。

NamedParameterJdbcTemplate類-1n

NamedParameterJdbcTemplate類在SQL語(yǔ)句中支持使用命名參數(shù),比較適合做查

詢,如果做更新,同樣需要使用回調(diào)方法,如下:NamedParameterJdbcTemplate

jt

=

new

NamedParameterJdbcTemplate(ds);Map

paramMap

=

new

HashMap();paramMap.put("uuid",um.getUuid());List

list

=

jt.queryForList("select

*

from

tbl_user

where

uuid=:uuid",paramMap);Iterator

it

=

list.iterator();while(it.hasNext()){

Map

map

=

(Map)it.next();System.out.println("uuid="+map.get("uuid")+",name="+map.get("name"));}n

NamedParameterJdbcTemplate類是線程安全的,該類的最佳使用方式不是每次操

作的時(shí)候?qū)嵗粋€(gè)新的NamedParameterJdbcTemplate,而是針對(duì)每個(gè)

DataSource只配置一個(gè)NamedParameterJdbcTemplate實(shí)例第十頁(yè),共86頁(yè)。

NamedParameterJdbcTemplate類-2n

NamedParameterJdbcTemplate也可以自己做mapper,如下:NamedParameterJdbcTemplate

jt

=

new

NamedParameterJdbcTemplate(ds);Map

paramMap

=

new

HashMap();paramMap.put("uuid",um1.getUuid());RowMapper

mapper

=

new

RowMapper()

{

public

Object

mapRow(ResultSet

rs,

int

rowNum)

throws

SQLException

{

UserModel

um

=

new

UserModel();

um.setName(rs.getString("name"));

um.setUuid(rs.getString("uuid"));

return

um;

}

};List

list

=

jt.query("select

*

from

tbl_user

where

uuid=:uuid",paramMap,mapper);Iterator

it

=

list.iterator();while(it.hasNext()){

UserModel

tempUm

=

(UserModel)it.next();

System.out.println("uuid="+tempUm.getUuid()+",name="+tempUm.getName());}第十一頁(yè),共86頁(yè)。

其它JdbcTemplate類n

SimpleJdbcTemplate類

SimpleJdbcTemplate類是JdbcTemplate類的一個(gè)包裝器(wrapper),它利

用了Java

5的一些語(yǔ)言特性,比如Varargs和Autoboxing。n

SQLExceptionTranslator接口

SQLExceptionTranslator是一個(gè)接口,如果你需要在

SQLException和

org.springframework.dao.DataAccessException之間作轉(zhuǎn)換,那么必須實(shí)現(xiàn)該

接口。

轉(zhuǎn)換器類的實(shí)現(xiàn)可以采用一般通用的做法(比如使用JDBC的SQLState

code),如果為了使轉(zhuǎn)換更準(zhǔn)確,也可以進(jìn)行定制(比如使用Oracle的error

code)。

SQLErrorCodeSQLExceptionTranslator是SQLExceptionTranslator的默認(rèn)

實(shí)現(xiàn)。

該實(shí)現(xiàn)使用指定數(shù)據(jù)庫(kù)廠商的error

code,比采用SQLState更精確。第十二頁(yè),共86頁(yè)。nAbstractDataSource類

它實(shí)現(xiàn)了DataSource接口的

一些無(wú)關(guān)痛癢的方法,如果你需要實(shí)現(xiàn)自己的

DataSource,那么繼承

該類是個(gè)好主意

。n

SingleConnectionDataSource類

是SmartDataSource接口

的一個(gè)實(shí)現(xiàn),其內(nèi)部包裝了一個(gè)單連接。該連接

在使用之后將不會(huì)關(guān)閉,很顯然它不能在多線程

的環(huán)境下使用

控制數(shù)據(jù)庫(kù)連接n

DataSourceUtils類

DataSourceUtils是一個(gè)幫助類提供易用且強(qiáng)大的數(shù)據(jù)庫(kù)訪問(wèn)能力,們可以

使用該類提供的靜態(tài)方法從JNDI獲取數(shù)據(jù)庫(kù)連接以及在必要的時(shí)候關(guān)閉之。

尤其在使用標(biāo)準(zhǔn)JDBC,但是又想要使用Spring的事務(wù)的時(shí)候,最好從

DataSourceUtils類來(lái)獲取JDBC的連接。n

SmartDataSource接口

SmartDataSource是DataSource

接口的一個(gè)擴(kuò)展,用來(lái)提供數(shù)據(jù)庫(kù)連接。

使用該接口的類在指定的操作之后可以檢查是否需要關(guān)閉連接。第十三頁(yè),共86頁(yè)。

本節(jié)課程小結(jié)n

Spring對(duì)JDBC的支持

包括:DAO支持,JdbcTemplate類的使用、

NamedParameterJdbcTemplate類的使用等。n

作業(yè):1:在前面的項(xiàng)目練習(xí)中挑選一個(gè)模塊,把DAO部分的實(shí)現(xiàn),添加一個(gè)使用Spring對(duì)

JDBC支持的實(shí)現(xiàn)第十四頁(yè),共86頁(yè)。

第四章:對(duì)JDBC和ORM的支持-2第十五頁(yè),共86頁(yè)。

本節(jié)課程概覽n

Spring對(duì)ORM的支持

包括:DAO支持,HibernateTemplate類的使用、HibernateDaoSupport類的使

用等。第十六頁(yè),共86頁(yè)。

對(duì)ORM的支持n

簡(jiǎn)介

Spring在資源管理,DAO實(shí)現(xiàn)支持以及事務(wù)策略等方面提供了與

JDO、

JPA、Hibernate、TopLink及iBATIS的集成。以Hibernate為例,Spring通過(guò)使用

許多IoC的便捷特性對(duì)它提供了一流的支持,幫助你處理很多典型的Hibernate整

合的問(wèn)題。所有的這些支持,都遵循Spring通用的事務(wù)和DAO異常體系。通常來(lái)

說(shuō)有兩種不同的整合風(fēng)格:你可以使用Spring提供的DAO模板,或者直接使用

Hibernate/JDO/TopLink等工具的原生API編寫DAO。無(wú)論采取哪種風(fēng)格,這些DAO

都可以通過(guò)IoC進(jìn)行配置,并參與到Spring的資源和事務(wù)管理中去。n

使用Spring構(gòu)建你的O/R

Mapping

DAO的好處包括:1:測(cè)試簡(jiǎn)單2:異常封裝3:通用的資源管理4:綜合的事務(wù)管理5:避免綁定特定技術(shù)允許mix-and-match的實(shí)現(xiàn)策略第十七頁(yè),共86頁(yè)。

結(jié)合Hibernaten

在Spring的application

context中創(chuàng)建

SessionFactory

,如下:<bean

id="hbConfig"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property

name="dataSource"><ref

local="dataSource"/></property>

<property

name="mappingResources">

<list>

<value>com/lx/Parent.hbm.xml</value>

</list>

</property>

<property

name="hibernateProperties">

<props>

<prop

key="hibernate.dialect">

org.hibernate.dialect.Oracle9Dialect

</prop>

<prop

key="hibernate.show_sql">true</prop>

</props>

</property></bean>第十八頁(yè),共86頁(yè)。

結(jié)合Hibernate示例-1n

定義接口如下:public

interface

Api

{

public

boolean

create(UserModel

um);}n

實(shí)現(xiàn)類如下:public

class

Impl

implements

Api{

private

SessionFactory

sf

=

null;

public

void

setSf(SessionFactory

sf){

this.sf

=

sf;

}

public

boolean

create(UserModel

um){

HibernateTemplate

ht

=

new

HibernateTemplate(sf);

ht.save(um);

return

false;

}}第十九頁(yè),共86頁(yè)。

結(jié)合Hibernate示例-2n

配置文件如下:<bean

name="api"

class="cn.javass.Spring3.h3.Impl">

<property

name="sf"

ref="hbConfig"></property></bean><bean

id="dataSource"

class="mons.dbcp.BasicDataSource">

<property

name="driverClassName">

<value>oracle.jdbc.driver.OracleDriver</value>

</property>

<property

name="url">

<value>jdbc:oracle:thin:@localhost:1521:orcl</value>

</property>

<property

name="username">

<value>test</value>

</property>

<property

name="password"

value="test"/></bean>第二十頁(yè),共86頁(yè)。

結(jié)合Hibernate示例-3n

配置文件如下:<bean

id="hbConfig"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property

name="dataSource"><ref

local="dataSource"/></property>

<property

name="mappingResources">

<list>

<value>cn/javass/Spring3/h3/UserModel.hbm.xml</value>

</list>

</property>

<property

name="hibernateProperties">

<props>

<prop

key="hibernate.dialect">

org.hibernate.dialect.Oracle8iDialect

</prop>

<prop

key="hibernate.show_sql">true</prop>

</props>

</property></bean>第二十一頁(yè),共86頁(yè)。

結(jié)合Hibernate示例-4n

客戶端文件如下:public

static

void

main(String[]

args)throws

Exception

{

ApplicationContext

context

=

new

ClassPathXmlApplicationContext(

new

String[]

{"applicationContext-h3.xml"});

Api

api

=

(Api)context.getBean("api");

UserModel

um

=

new

UserModel();

um.setUuid("test1");

um.setName("test1");

api.create(um);}n

前面的演示是更新操作,那么查詢?cè)趺醋瞿??如下:List<UserModel>

list

=

ht.find("select

o

from

UserModel

o");n

要傳入?yún)?shù)怎么做呢?如下:Object

params[]

=

new

Object[1];params[0]

=

"test1";List<UserModel>

list

=

ht.find("select

o

from

UserModel

o

where

o.uuid=?",params);第二十二頁(yè),共86頁(yè)。

結(jié)合Hibernate示例-5n

要傳入命名參數(shù)怎么做呢?如下:Object

params[]

=

new

Object[1];params[0]

=

"test1";String

names[]

=

new

String[1];names[0]

=

"uuid";List<UserModel>

list

=

ht.findByNamedParam("select

o

from

UserModel

o

where

o.uuid=:uuid",names,params);n

如果需要使用Hibernate的Query接口,該怎么做呢?如下:HibernateCallback

hcb

=new

HibernateCallback(){public

Object

doInHibernate(Session

session)throws

HibernateException,

SQLException

{

Query

q

=

session.createQuery("select

o

from

UserModel

o

where

o.uuid=:uuid");

q.setString("uuid",

um.getUuid());

return

q.list();

}};Collection<UserModel>

list

=

(Collection<UserModel>)ht.execute(hcb);n

一個(gè)回調(diào)實(shí)現(xiàn)能夠有效地在任何Hibernate數(shù)據(jù)訪問(wèn)中使用。HibernateTemplate

會(huì)確保當(dāng)

前Hibernate的

Session

對(duì)象的正確打開(kāi)和關(guān)閉,并直接參與到事務(wù)管理中去。

Template

實(shí)例不僅是線程安全的,同時(shí)它也是可重用的。因而他們可以作為外部對(duì)象的實(shí)例變量而

被持有。第二十三頁(yè),共86頁(yè)。

基于Spring的DAO實(shí)現(xiàn)n

實(shí)現(xiàn)類改成如下:public

class

Impl

extends

HibernateDaoSupport

implements

Api{

public

Collection

testQuery(){List<UserModel>

list

=

this.getHibernateTemplate().find("select

o

from

UserModel

o");

for(UserModel

tempUm

:

list){

System.out.println("uuid=="+tempUm.getUuid()+",name="+tempUm.getName());

}

return

list;

}}n

配置文件改成如下:<bean

name="api"

class="cn.javass.Spring3.h3.Impl">

<property

name="sessionFactory"

ref="hbConfig"></property></bean>n

要想使用Session怎么辦?如下:Session

session

=

getSession(getSessionFactory(),

false);

通常將一個(gè)false作為參數(shù)(表示是否允許創(chuàng)建)傳遞到

getSession(..)

方法中進(jìn)行調(diào)用。

此時(shí),整個(gè)調(diào)用將在同一個(gè)事務(wù)內(nèi)完成(它的整個(gè)生命周期

由事務(wù)控制,避免了關(guān)閉返回的

Session

的需要)。第二十四頁(yè),共86頁(yè)。

本節(jié)課程小結(jié)n

Spring對(duì)ORM的支持

包括:DAO支持,HibernateTemplate類的使用、HibernateDaoSupport類

的使用等。n

作業(yè):1:在前面的項(xiàng)目練習(xí)中挑選一個(gè)模塊,把DAO部分的實(shí)現(xiàn),添加一個(gè)使用Spring對(duì)

Hibernate支持的實(shí)現(xiàn)第二十五頁(yè),共86頁(yè)。

第五章:Spring中的事務(wù)第二十六頁(yè),共86頁(yè)。

本節(jié)課程概覽n

Spring的事務(wù)

包括:Spring對(duì)事務(wù)的解決方案、Spring中事務(wù)管理器體系、AOP的解決方案、

基本的事務(wù)配置、聲明性事務(wù)管理第二十七頁(yè),共86頁(yè)。Session

session

=

null;Transaction

transaction

=

null;try

{

session

=

factory.openSession();

//開(kāi)啟事務(wù)

transaction

=

session.beginTransaction();

transation.begin();

session.save(user);

mit();//提交事務(wù)}

catch

(Exception

e)

{

e.printStackTrace();

transaction.rollback();//回滾事務(wù)

return

false;}finally{

session.close();}Connection

conn

=

DataSourceUtils.getConnection();

//開(kāi)啟事務(wù)conn.setAutoCommit(false);try

{

Object

retVal

=

callback.doInConnection(conn);

mit();

//提交事務(wù)

return

retVal;}catch

(Exception

e)

{

conn.rollback();//回滾事務(wù)

throw

e;}finally

{

conn.close();}

Spring中事務(wù)簡(jiǎn)介-1n

現(xiàn)有的問(wèn)題:各種技術(shù)的事務(wù)處理方式不統(tǒng)一,導(dǎo)致編程的復(fù)雜性,如:第二十八頁(yè),共86頁(yè)。

Spring中事務(wù)簡(jiǎn)介-2n

Spring框架引人注目的重要因素之一是它全面的事務(wù)支持。Spring框架提供了一

致的事務(wù)管理抽象,這帶來(lái)了以下好處:1:為復(fù)雜的事務(wù)API提供了一致的編程模型,如JTA、JDBC、Hibernate、JPA和JDO2:支持聲明式事務(wù)管理3:提供比復(fù)雜的事務(wù)API(諸如JTA)更簡(jiǎn)單的、更易于使用的編程式事務(wù)管理API4:非常好地整合Spring的各種數(shù)據(jù)訪問(wèn)抽象n

Spring事務(wù)抽象的關(guān)鍵是事務(wù)策略的概念。這個(gè)概念由

org.springframework.transaction.PlatformTransactionManager接口定義:public

interface

PlatformTransactionManager

{

TransactionStatus

getTransaction(TransactionDefinition

definition)

throws

TransactionException;

void

commit(TransactionStatus

status)

throws

TransactionException;

void

rollback(TransactionStatus

status)

throws

TransactionException;}第二十九頁(yè),共86頁(yè)。

Spring中事務(wù)簡(jiǎn)介-3n

getTransaction(..)方法根據(jù)一個(gè)類型為

TransactionDefinition

的參數(shù)返回

一個(gè)

TransactionStatus

對(duì)象。返回的

TransactionStatus

對(duì)象可能代表一個(gè)

新的或已經(jīng)存在的事務(wù)(如果在當(dāng)前調(diào)用堆棧有一個(gè)符合條件的事務(wù)。如同J2EE

事務(wù)環(huán)境,一個(gè)

TransactionStatus

也是和執(zhí)行

線程

綁定的)n

TransactionDefinition接口指定1:事務(wù)隔離:當(dāng)前事務(wù)和其它事務(wù)的隔離的程度。例如,這個(gè)事務(wù)能否看到其他事

務(wù)未提交的寫數(shù)據(jù)?2:事務(wù)傳播:通常在一個(gè)事務(wù)中執(zhí)行的所有代碼都會(huì)在這個(gè)事務(wù)中運(yùn)行。但是,如

果一個(gè)事務(wù)上下文已經(jīng)存在,有幾個(gè)選項(xiàng)可以指定一個(gè)事務(wù)性方法的執(zhí)行行為:

例如,簡(jiǎn)單地在現(xiàn)有的事務(wù)中繼續(xù)運(yùn)行(大多數(shù)情況);或者掛起現(xiàn)有事務(wù),創(chuàng)

建一個(gè)新的事務(wù)。Spring提供EJB

CMT中常見(jiàn)的事務(wù)傳播選項(xiàng)。3:事務(wù)超時(shí):

事務(wù)在超時(shí)前能運(yùn)行多久(自動(dòng)被底層的事務(wù)基礎(chǔ)設(shè)施回滾)。4:只讀狀態(tài):

只讀事務(wù)不修改任何數(shù)據(jù)。只讀事務(wù)在某些情況下(例如當(dāng)使用

Hibernate時(shí)),是一種非常有用的優(yōu)化。第三十頁(yè),共86頁(yè)。

Spring中事務(wù)簡(jiǎn)介-4n

Spring的事務(wù)管理器體系第三十一頁(yè),共86頁(yè)。

資源同步方案n

高層次方案:

首選的方法是使用Spring的高層持久化集成API。這種方式不會(huì)替換原始的

API,而是在內(nèi)部封裝資源創(chuàng)建、復(fù)用、清理、事務(wù)同步以及異常映射等功能,

這樣用戶的數(shù)據(jù)訪問(wèn)代碼就不必關(guān)心這些,而集中精力于自己的持久化邏輯。n

低層次方案

在較低層次上,有以下這些類:DataSourceUtils(針對(duì)JDBC),

SessionFactoryUtils(針對(duì)Hibernate),PersistenceManagerFactoryUtils

(針對(duì)JDO)等等。也就是說(shuō),在純JDBC中,如果你需要使用Spring的事務(wù),那

么就需要使用上面的類來(lái)管理連接,如下:

Connection

conn=DataSourceUtils.getConnection(dataSource);n

當(dāng)然,一旦你用過(guò)Spring的JDBC支持或Hibernate支持,你一般就不再會(huì)選擇

DataSourceUtils

或是別的輔助類了,因?yàn)槟銜?huì)更樂(lè)意與Spring抽象一起工作,

而不是直接使用相關(guān)的API。第三十二頁(yè),共86頁(yè)。

AOP的解決方案-1第三十三頁(yè),共86頁(yè)。

AOP的解決方案-2n

Spring框架提供了一致的事務(wù)管理抽象,通常實(shí)施事務(wù)的步驟是:1:定義資源(DataSource/SessionFactory……)2:定義事務(wù)管理器(管理資源的事務(wù))3:定義事務(wù)通知:定義了如何實(shí)施事務(wù)(實(shí)施事務(wù)的方法名和對(duì)應(yīng)的事務(wù)屬性),

需要使用事務(wù)管理器管理事務(wù),定義了如何選擇目標(biāo)對(duì)象的方法及實(shí)施的事務(wù)屬

性4:定義advisor(切入點(diǎn)和事務(wù)通知):切入點(diǎn)選擇需要實(shí)施事務(wù)的目標(biāo)對(duì)象(通

常是業(yè)務(wù)邏輯層)5:Spring織入事務(wù)通知到目標(biāo)對(duì)象(AOP代理)第三十四頁(yè),共86頁(yè)。

Spring中事務(wù)配置-1n

要使用Spring的事務(wù),首先要先定義一個(gè)與數(shù)據(jù)源連接的DataSource,然后使用

Spring的DataSourceTransactionManager,并傳入指向DataSource的引用,比

如,JDBC的事務(wù)配置如下:<bean

name="dataSource"

class="mons.dbcp.BasicDataSource"><property

name="driverClassName">

<value>oracle.jdbc.driver.OracleDriver</value></property><property

name="url"><value>jdbc:oracle:thin:@localhost:1521:orcl</value></property>

<property

name="username">

<value>test</value>

</property>

<property

name="password"

value="test"/></bean><bean

id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property

name="dataSource"

ref="dataSource"/></bean>第三十五頁(yè),共86頁(yè)。

Spring中事務(wù)配置-2n

如果使用JTA,示例如下:<beans

xmlns=""xmlns:xsi=""xmlns:context=""xmlns:aop=""xmlns:tx=""xmlns:jee=""xsi:schemaLocation="

-

3.0.xsd

">

<jee:jndi-lookup

id="dataSource"

jndi-name="jdbc/jpetstore"/>

<bean

id="txManager"

class="org.springframework.transaction.jta.JtaTransactionManager"

/></beans>第三十六頁(yè),共86頁(yè)。

Spring中事務(wù)配置-3n

Hibernate的事務(wù)配置,示例如下:1:Spring對(duì)Hibernate的集成2:然后配置事務(wù)如下:<bean

id="txManager“class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property

name="sessionFactory"

ref="sessionFactory"

/></bean>n

可以簡(jiǎn)單地使用

JtaTransactionManager

來(lái)處理Hibernate事務(wù)和JTA事務(wù),就

像我們處理JDBC,或者任何其它的資源策略一樣,如下:<bean

id="txManager"class="org.springframework.transaction.jta.JtaTransactionManager"/>n

注意任何資源的JTA配置都是這樣的,因?yàn)樗鼈兌际侨质聞?wù),可以支持任何事

務(wù)性資源。在所有這些情況下,應(yīng)用程序代碼根本不需要做任何改動(dòng)。僅僅通過(guò)

改變配置就可以改變事務(wù)管理方式,即使這些更改是在局部事務(wù)和全局事務(wù)間切

換。第三十七頁(yè),共86頁(yè)。nSpring的聲明式事務(wù)管理是通過(guò)AOP實(shí)現(xiàn)的,Xml風(fēng)格的聲明式事務(wù)配置如下:<beans

xmlns=""xmlns:xsi=""xmlns:context=""xmlns:aop=""xmlns:tx=""xsi:schemaLocation="

-

3.0.xsd

">

<bean

id="txManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property

name="dataSource"

ref="dataSource"/>

</bean>

<tx:advice

id="txAdvice"

transaction-manager="txManager">

<tx:attributes>

<tx:method

name="get*"

read-only="true"/>

<tx:method

name="*"/>

</tx:attributes>

</tx:advice>

<aop:config>

<aop:pointcut

id="myPointCut"

expression="execution(*

cn.javass.spring3.jdbc.Impl.*(..))"/>

<aop:advisor

advice-ref="txAdvice"

pointcut-ref="myPointCut"/>

</aop:config>

聲明性事務(wù)管理-1第三十八頁(yè),共86頁(yè)。

聲明性事務(wù)管理-2

<bean

name="api"

class="cn.javass.spring3.jdbc.Impl">

<property

name="ds"

ref="dataSource"></property>

</bean>

<bean

name="dataSource"

class="mons.dbcp.BasicDataSource">

<property

name="driverClassName">

<value>oracle.jdbc.driver.OracleDriver</value>

</property>

<property

name="url">

<value>jdbc:oracle:thin:@localhost:1521:orcl</value>

</property>

<property

name="username">

<value>ztb</value>

</property>

<property

name="password"

value="ztb"/>

</bean></beans>第三十九頁(yè),共86頁(yè)。

聲明性事務(wù)管理-3n

事務(wù)回滾:可以在配置中指定需要回滾的Exception,如下:<tx:advice

id="txAdvice"

transaction-manager="txManager">

<tx:attributes>

<tx:method

name="get*"

read-only="false"

rollback-for="NoProductInStockException"/>

<tx:method

name="*"/>

</tx:attributes></tx:advice>n

<tx:advice/>

有關(guān)的設(shè)置,默認(rèn)的

<tx:advice/>

設(shè)置如下:1:事務(wù)傳播設(shè)置是

REQUIRED2:隔離級(jí)別是

DEFAULT3:事務(wù)是

讀/寫4:事務(wù)超時(shí)默認(rèn)是依賴于事務(wù)系統(tǒng)的,或者事務(wù)超時(shí)沒(méi)有被支持。5:任何

RuntimeException

將觸發(fā)事務(wù)回滾,但是任何

checked

Exception

將不

觸發(fā)事務(wù)回滾第四十頁(yè),共86頁(yè)。

聲明性事務(wù)管理-4n

<tx:advice/>

有關(guān)的設(shè)置:第四十一頁(yè),共86頁(yè)。

本節(jié)課程小結(jié)n

Spring的事務(wù)

包括:Spring對(duì)事務(wù)的解決方案、Spring中事務(wù)管理器體系、AOP的解決

方案、基本的事務(wù)配置、聲明性事務(wù)管理n

作業(yè):1:復(fù)習(xí)和掌握這些理論知識(shí)2:動(dòng)手配置和測(cè)試一下Spring的聲明性事務(wù),體會(huì)Spring事務(wù)的無(wú)侵入性第四十二頁(yè),共86頁(yè)。

第五章:Spring中的事務(wù)-2第四十三頁(yè),共86頁(yè)。

本節(jié)課程概覽n

Spring的事務(wù)

包括:使用@Transactional進(jìn)行聲明性事務(wù)管理、編程式事務(wù)管理,使用

Spring的TransactionTemplate、或者使用Spring的

PlatformTransactionManager進(jìn)行事務(wù)管理第四十四頁(yè),共86頁(yè)。

聲明性事務(wù)管理-5n

更簡(jiǎn)單的方式是使用@Transactional1:在配置文件中開(kāi)啟對(duì)@Transactional的支持<tx:annotation-driven

transaction-manager="txManager"/>2:在類或者方法上配置@Transactional3:@Transactional后面可以跟屬性配置,如下:@Transactional(readOnly

=

false,

propagation

=

Propagation.REQUIRES_NEW)n

默認(rèn)的@Transactional配置如下:1:事務(wù)傳播設(shè)置是

PROPAGATION_REQUIRED2:事務(wù)隔離級(jí)別是

ISOLATION_DEFAULT3:事務(wù)是

讀/寫4:事務(wù)超時(shí)默認(rèn)是依賴于事務(wù)系統(tǒng)的,或者事務(wù)超時(shí)沒(méi)有被支持。5:任何

RuntimeException

將觸發(fā)事務(wù)回滾,但是任何

checked

Exception

將不

觸發(fā)事務(wù)回滾第四十五頁(yè),共86頁(yè)。

聲明性事務(wù)管理-6第四十六頁(yè),共86頁(yè)。

聲明性事務(wù)管理-7第四十七頁(yè),共86頁(yè)。

編程式事務(wù)管理-1n

Spring提供兩種方式的編程式事務(wù)管理:1:使用

TransactionTemplate2:直接使用一個(gè)

PlatformTransactionManager

實(shí)現(xiàn)

如果你選擇編程式事務(wù)管理,Spring小組推薦你采用第一種方法(即使用

TransactionTemplate)。第二種方法類似使用JTA的

UserTransaction

API

(除了異常處理簡(jiǎn)單點(diǎn)兒)。n

使用

TransactionTemplate:TransactionTemplate

采用與Spring中別的摸板同

樣的方法,使用回調(diào)機(jī)制,將應(yīng)用代碼從樣板式的資源獲取和釋放代碼中解放出

來(lái),不再有大量的try/catch/finally/try/catch代碼塊。同樣,和別的模板類

一樣,TransactionTemplate

類的實(shí)例是線程安全的。n

使用TransactionTemplate示例如下:第四十八頁(yè),共86頁(yè)。

編程式事務(wù)管理-2n

直接使用TransactionTemplate//獲取事務(wù)管理器PlatformTransactionManager

txManager

=

(PlatformTransactionManager)

ctx.getBean("txManager");//定義事務(wù)管理的模板TransactionTemplate

transactionTemplate

=

new

TransactionTemplate(txManager);//定義事務(wù)屬性transactionTemplate.

setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);//回調(diào),執(zhí)行真正的數(shù)據(jù)庫(kù)操作,如果需要返回值需要在回調(diào)里返回transactionTemplate.execute(new

TransactionCallback()

{

@Override

public

Object

doInTransaction(TransactionStatus

status)

{

//執(zhí)行數(shù)據(jù)庫(kù)操作

new

JdbcTemplate(ds).execute("insert

into

tbl_user

(uuid,name)

values('"+um1.getUuid()+"','"+um1.getName()+"')");

return

null;

}});第四十九頁(yè),共86頁(yè)。

編程式事務(wù)管理-3n

使用

PlatformTransactionManager

你也可以直接使用PlatformTransactionManager的實(shí)現(xiàn)來(lái)管理事務(wù)。只需

通過(guò)bean引用簡(jiǎn)單地傳入一個(gè)

PlatformTransactionManager

實(shí)現(xiàn),然后使用

TransactionDefinition

TransactionStatus

對(duì)象,你就可以啟動(dòng)一個(gè)事

務(wù),提交或回滾。n

使用

PlatformTransactionManager示例如下:第五十頁(yè),共86頁(yè)。

編程式事務(wù)管理-4n

直接使用統(tǒng)一的PlatformTransactionManager//獲取事務(wù)管理器PlatformTransactionManager

txManager

=

(PlatformTransactionManager)

ctx.getBean("txManager");//定義事務(wù)屬性DefaultTransactionDefinition

td

=

new

DefaultTransactionDefinition();td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);//開(kāi)啟事務(wù),得到事務(wù)狀態(tài)TransactionStatus

status

=

txManager.getTransaction(td);try

{

//執(zhí)行數(shù)據(jù)庫(kù)操作new

JdbcTemplate(ds).execute("insert

into

tbl_user

(uuid,name)

values('"+um1.getUuid()+"','"+um1.getName()+"')");

//提交事務(wù)

txMmit(status);}catch

(Exception

e)

{

//回滾事務(wù)

txManager.rollback(status);}第五十一頁(yè),共86頁(yè)。

本節(jié)課程小結(jié)n

Spring的事務(wù)

包括:使用@Transactional進(jìn)行聲明性事務(wù)管理、編程式事務(wù)管理,使用

Spring的TransactionTemplate、或者使用Spring的

PlatformTransactionManager進(jìn)行事務(wù)管理n

作業(yè):1:把前面測(cè)試事務(wù)的實(shí)現(xiàn),該成使用@Transactional來(lái)實(shí)現(xiàn)2:編程體會(huì)一下Spring提供的兩種編程式事務(wù)管理的方法3:為前面的應(yīng)用程序添加上事務(wù)管理的功能第五十二頁(yè),共86頁(yè)。

第六章:Struts2+Spring3+Hibernate3整合第五十三頁(yè),共86頁(yè)。

本節(jié)課程概覽n

Struts2+Spring3+Hibernate3整合第五十四頁(yè),共86頁(yè)。

Spring3整合Struts2-1n

準(zhǔn)備三個(gè)框架結(jié)合的lib包n

Spring3結(jié)合Struts2的步驟如下:1:開(kāi)啟Struts2結(jié)合Spring3,在struts.xml中添加如下語(yǔ)句:<constant

name="struts.objectFactory"

value="spring"/>2:在web.xml中添加listener,如下:<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>3:在web.xml中指定需要初始讀取的spring配置文件,如下:<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/applicationContext-

*.xml,classpath*:applicationContext-*.xml</param-value></context-param>當(dāng)然別忘了加上Struts2自己的filter。第五十五頁(yè),共86頁(yè)。

Spring3整合Struts2-24:在struts.xml中Action配置的時(shí)候,如下:<action

name="testAction"

class="springBeanName">

<result

name="success">/index.jsp</result></action>5:在Spring中正常定義Bean就可以了,把Action定義成為Bean,如下:<bean

id="testAction"

class="cn.javass.test.web.TestActioin">

<property

name="ebi"

ref="testEbi"/></bean>6:在Struts的Action中,就可以通過(guò)依賴注入的方式來(lái)注入需要使用的接口了。第五十六頁(yè),共86頁(yè)。

本節(jié)課程小結(jié)n

掌握Struts2+Spring3+Hibernate3整合的方式

分成兩個(gè)部分,一個(gè)是Spring3和Hibernate3的整合;另外一個(gè)是Spring3

和Struts2的整合。

對(duì)于整合又要注意兩個(gè)方面,一個(gè)是如何配置和部署;另外一個(gè)是整合過(guò)

后,程序?qū)懛ǚ矫嬗惺裁醋兓?。n

作業(yè):1:按照課堂講述,把Struts2+Spring3+Hibernate3整合起來(lái)2:從前面的項(xiàng)目中找一個(gè)模塊,把它修改成使用Struts2+Spring3+Hibernate3結(jié)合

起來(lái)開(kāi)發(fā)的方式。第五十七頁(yè),共86頁(yè)。

第七章:Spring3的表達(dá)式語(yǔ)言第五十八頁(yè),共86頁(yè)。

概述n

是什么

Spring表達(dá)式語(yǔ)言全稱為“Spring

Expression

Language”,縮寫為

“SpEL”,類似于Struts2x中使用的OGNL表達(dá)式語(yǔ)言,能在運(yùn)行時(shí)構(gòu)建復(fù)雜表達(dá)式、

存取對(duì)象圖屬性、對(duì)象方法調(diào)用等等,并能與Spring功能完美整合。

表達(dá)式語(yǔ)言給靜態(tài)Java語(yǔ)言增加了動(dòng)態(tài)功能。

SpEL是單獨(dú)模塊,只依賴于core模塊,不依賴于其他模塊,可單獨(dú)使用。n

能干什么

表達(dá)式語(yǔ)言一般是用較為簡(jiǎn)單的形式完成主要的工作,減少開(kāi)發(fā)的工作量。

SpEL支持如下表達(dá)式:一、基本表達(dá)式:字面量表達(dá)式、關(guān)系,邏輯與算數(shù)運(yùn)算表達(dá)式、字符串連接及截取表

達(dá)式、三目運(yùn)算及Elivis表達(dá)式、正則表達(dá)式、括號(hào)優(yōu)先級(jí)表達(dá)式;二、類相關(guān)表達(dá)式:類類型表達(dá)式、類實(shí)例化、instanceof表達(dá)式、變量定義及引用、

賦值表達(dá)式、自定義函數(shù)、對(duì)象屬性存取及安全導(dǎo)航表達(dá)式、對(duì)象方法調(diào)用、Bean引

用;三、集合相關(guān)表達(dá)式:內(nèi)聯(lián)List、內(nèi)聯(lián)數(shù)組、集合,字典訪問(wèn)、列表,字典,數(shù)組修

改、集合投影、集合選擇;不支持多維內(nèi)聯(lián)數(shù)組初始化;不支持內(nèi)聯(lián)字典定義;四、其他表達(dá)式:模板表達(dá)式。第五十九頁(yè),共86頁(yè)。

HelloWorldn

在Java中使用SpringEL是非常簡(jiǎn)單的,示例如下:public

class

HelloWorld

{

public

static

void

main(String[]

args)

{

//構(gòu)造上下文:準(zhǔn)備比如變量定義等等表達(dá)式運(yùn)行需要的上下文數(shù)據(jù)

EvaluationContext

context

=

new

StandardEvaluationContext();

//創(chuàng)建解析器:提供SpelExpressionParser默認(rèn)實(shí)現(xiàn)

ExpressionParser

parser

=

new

SpelExpressionParser();

//解析表達(dá)式:使用ExpressionParser來(lái)解析表達(dá)式為相應(yīng)的Expression對(duì)象

Expression

expression

=

parser.parseExpression("('Hello'

+

'

World').concat(#end)");

//設(shè)置上下文中的變量的值

context.setVariable("end",

"!SpringEL");

//執(zhí)行表達(dá)式,獲取運(yùn)行結(jié)果

String

str

=

(String)expression.getValue(context);

System.out.println("the

str="+str);

}}第六十頁(yè),共86頁(yè)。

SpEL的基本概念n

表達(dá)式

表達(dá)式是表達(dá)式語(yǔ)言的核心,從我們角度來(lái)看就是“要做什么”n

解析器

用于將字符串表達(dá)式解析為表達(dá)式對(duì)象,從我們角度來(lái)看是“誰(shuí)來(lái)做”n

上下文

表達(dá)式對(duì)象執(zhí)行的環(huán)境,該環(huán)境可能定義變量、定義自定義函數(shù)、提供類

型轉(zhuǎn)換等等,從我們角度看就是“在哪做”第六十一頁(yè),共86頁(yè)。

SpEL的基本運(yùn)行原理第六十二頁(yè),共86頁(yè)。}}public

boolean

isTemplate()

{public

String

getExpressionPrefix()

{public

String

getExpressionSuffix()

{return

true;return

"#{";return

"}";}

};

String

template

=

"#{'Hello

'}#{'World!'}";

Expression

expression

=

parser.parseExpression(template,

parserContext);

System.out.println(

expression.getValue());}

SpEL的主要接口-1n

ExpressionParser接口

表示解析器,默認(rèn)實(shí)現(xiàn)是org.springframework.expression.spel.standard包中的

SpelExpressionParser類,使用parseExpression方法將字符串表達(dá)式轉(zhuǎn)換為Expression對(duì)

象。

配合ExpressionParser

接口使用的ParserContext接口用于定義字符串表達(dá)式是不

是模板,及模板開(kāi)始與結(jié)束字符,示例如下:public

static

void

main(String[]

args)

{

ExpressionParser

parser

=

new

SpelExpressionParser();

//自定義一個(gè)解析模板的規(guī)則

ParserContext

parserContext

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論