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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

spring33jdbcorm事務三大框架整合表達式語言第一頁,共86頁。

DAO支持-1n

簡介

Spring提供的DAO(數(shù)據(jù)訪問對象)支持主要的目的是便于以標準的方式使用

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

這些持久化技術間切換,

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

的異常。n

一致的異常層次

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

SQLException,

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

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

的風險。

如果使用攔截器方式,你在應用中

就得自己小心處理

HibernateException、

JDOException等,最好是委托給

SessionFactoryUtils

convertHibernateAccessException、

convertJdoAccessException等方法。

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

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

次相兼容的異常。第二頁,共86頁。

DAO支持-2n

一致的DAO支持抽象類

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

Hibernate,

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

法,通過它們你可以

獲得與你當前使用的數(shù)據(jù)訪問技術相關的數(shù)據(jù)源和其他配

置信息。1:JdbcDaoSupport

-

JDBC數(shù)據(jù)訪問對象的基類。

需要一個DataSource,同時為子

類提供

JdbcTemplate。2:HibernateDaoSupport

-

Hibernate數(shù)據(jù)訪問對象的基類。

需要一個

SessionFactory,同時為子類提供

HibernateTemplate。也可以選擇直接通過

提供一個HibernateTemplate來初始化。3:JdoDaoSupport

-

JDO數(shù)據(jù)訪問對象的基類。

需要設置一個

PersistenceManagerFactory,

同時為子類提供JdoTemplate。4:JpaDaoSupport

-

JPA數(shù)據(jù)訪問對象的基類。

需要一個EntityManagerFactory,

同時

為子類提供JpaTemplate。第三頁,共86頁。

對JDBC的支持-1n

簡介

Spring

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

用了Spring

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

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

對JDBC的支持-2n

Spring

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

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

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

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

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

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

義的異常。因此使用Spring

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

會拋出的異常。所有的異常都是unchecked

exception,這樣我們就可以對傳遞

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

JdbcTemplate類-1n

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

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

定義接口如下:public

interface

Api

{

public

boolean

create(UserModel

um);}n

定義實現(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;

}}第六頁,共86頁。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第七頁,共86頁。

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;}第八頁,共86頁。

JdbcTemplate類-4n

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

模板方法設計模式+回調(diào)方法,把變和不變的部分分離開來,不變化的部分,實

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

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

NamedParameterJdbcTemplate類-1n

NamedParameterJdbcTemplate類在SQL語句中支持使用命名參數(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類是線程安全的,該類的最佳使用方式不是每次操

作的時候?qū)嵗粋€新的NamedParameterJdbcTemplate,而是針對每個

DataSource只配置一個NamedParameterJdbcTemplate實例第十頁,共86頁。

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());}第十一頁,共86頁。

其它JdbcTemplate類n

SimpleJdbcTemplate類

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

用了Java

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

SQLExceptionTranslator接口

SQLExceptionTranslator是一個接口,如果你需要在

SQLException和

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

接口。

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

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

code)。

SQLErrorCodeSQLExceptionTranslator是SQLExceptionTranslator的默認

實現(xiàn)。

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

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

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

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

DataSource,那么繼承

該類是個好主意

。n

SingleConnectionDataSource類

是SmartDataSource接口

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

在使用之后將不會關閉,很顯然它不能在多線程

的環(huán)境下使用

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

DataSourceUtils類

DataSourceUtils是一個幫助類提供易用且強大的數(shù)據(jù)庫訪問能力,們可以

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

尤其在使用標準JDBC,但是又想要使用Spring的事務的時候,最好從

DataSourceUtils類來獲取JDBC的連接。n

SmartDataSource接口

SmartDataSource是DataSource

接口的一個擴展,用來提供數(shù)據(jù)庫連接。

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

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

Spring對JDBC的支持

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

NamedParameterJdbcTemplate類的使用等。n

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

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

第四章:對JDBC和ORM的支持-2第十五頁,共86頁。

本節(jié)課程概覽n

Spring對ORM的支持

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

用等。第十六頁,共86頁。

對ORM的支持n

簡介

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

JDO、

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

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

合的問題。所有的這些支持,都遵循Spring通用的事務和DAO異常體系。通常來

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

Hibernate/JDO/TopLink等工具的原生API編寫DAO。無論采取哪種風格,這些DAO

都可以通過IoC進行配置,并參與到Spring的資源和事務管理中去。n

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

Mapping

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

結(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>第十八頁,共86頁。

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

定義接口如下:public

interface

Api

{

public

boolean

create(UserModel

um);}n

實現(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;

}}第十九頁,共86頁。

結(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>第二十頁,共86頁。

結(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>第二十一頁,共86頁。

結(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

前面的演示是更新操作,那么查詢怎么做呢?如下: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);第二十二頁,共86頁。

結(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

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

會確保當

前Hibernate的

Session

對象的正確打開和關閉,并直接參與到事務管理中去。

Template

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

被持有。第二十三頁,共86頁。

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

實現(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);

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

getSession(..)

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

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

由事務控制,避免了關閉返回的

Session

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

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

Spring對ORM的支持

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

的使用等。n

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

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

第五章:Spring中的事務第二十六頁,共86頁。

本節(jié)課程概覽n

Spring的事務

包括:Spring對事務的解決方案、Spring中事務管理器體系、AOP的解決方案、

基本的事務配置、聲明性事務管理第二十七頁,共86頁。Session

session

=

null;Transaction

transaction

=

null;try

{

session

=

factory.openSession();

//開啟事務

transaction

=

session.beginTransaction();

transation.begin();

session.save(user);

mit();//提交事務}

catch

(Exception

e)

{

e.printStackTrace();

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

return

false;}finally{

session.close();}Connection

conn

=

DataSourceUtils.getConnection();

//開啟事務conn.setAutoCommit(false);try

{

Object

retVal

=

callback.doInConnection(conn);

mit();

//提交事務

return

retVal;}catch

(Exception

e)

{

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

throw

e;}finally

{

conn.close();}

Spring中事務簡介-1n

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

Spring中事務簡介-2n

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

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

Spring事務抽象的關鍵是事務策略的概念。這個概念由

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;}第二十九頁,共86頁。

Spring中事務簡介-3n

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

TransactionDefinition

的參數(shù)返回

一個

TransactionStatus

對象。返回的

TransactionStatus

對象可能代表一個

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

事務環(huán)境,一個

TransactionStatus

也是和執(zhí)行

線程

綁定的)n

TransactionDefinition接口指定1:事務隔離:當前事務和其它事務的隔離的程度。例如,這個事務能否看到其他事

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

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

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

建一個新的事務。Spring提供EJB

CMT中常見的事務傳播選項。3:事務超時:

事務在超時前能運行多久(自動被底層的事務基礎設施回滾)。4:只讀狀態(tài):

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

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

Spring中事務簡介-4n

Spring的事務管理器體系第三十一頁,共86頁。

資源同步方案n

高層次方案:

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

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

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

低層次方案

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

SessionFactoryUtils(針對Hibernate),PersistenceManagerFactoryUtils

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

么就需要使用上面的類來管理連接,如下:

Connection

conn=DataSourceUtils.getConnection(dataSource);n

當然,一旦你用過Spring的JDBC支持或Hibernate支持,你一般就不再會選擇

DataSourceUtils

或是別的輔助類了,因為你會更樂意與Spring抽象一起工作,

而不是直接使用相關的API。第三十二頁,共86頁。

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

AOP的解決方案-2n

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

需要使用事務管理器管理事務,定義了如何選擇目標對象的方法及實施的事務屬

性4:定義advisor(切入點和事務通知):切入點選擇需要實施事務的目標對象(通

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

Spring中事務配置-1n

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

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

如,JDBC的事務配置如下:<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>第三十五頁,共86頁。

Spring中事務配置-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>第三十六頁,共86頁。

Spring中事務配置-3n

Hibernate的事務配置,示例如下:1:Spring對Hibernate的集成2:然后配置事務如下:<bean

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

<property

name="sessionFactory"

ref="sessionFactory"

/></bean>n

可以簡單地使用

JtaTransactionManager

來處理Hibernate事務和JTA事務,就

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

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

注意任何資源的JTA配置都是這樣的,因為它們都是全局事務,可以支持任何事

務性資源。在所有這些情況下,應用程序代碼根本不需要做任何改動。僅僅通過

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

換。第三十七頁,共86頁。nSpring的聲明式事務管理是通過AOP實現(xiàn)的,Xml風格的聲明式事務配置如下:<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>

聲明性事務管理-1第三十八頁,共86頁。

聲明性事務管理-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>第三十九頁,共86頁。

聲明性事務管理-3n

事務回滾:可以在配置中指定需要回滾的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/>

有關的設置,默認的

<tx:advice/>

設置如下:1:事務傳播設置是

REQUIRED2:隔離級別是

DEFAULT3:事務是

讀/寫4:事務超時默認是依賴于事務系統(tǒng)的,或者事務超時沒有被支持。5:任何

RuntimeException

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

checked

Exception

將不

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

聲明性事務管理-4n

<tx:advice/>

有關的設置:第四十一頁,共86頁。

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

Spring的事務

包括:Spring對事務的解決方案、Spring中事務管理器體系、AOP的解決

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

作業(yè):1:復習和掌握這些理論知識2:動手配置和測試一下Spring的聲明性事務,體會Spring事務的無侵入性第四十二頁,共86頁。

第五章:Spring中的事務-2第四十三頁,共86頁。

本節(jié)課程概覽n

Spring的事務

包括:使用@Transactional進行聲明性事務管理、編程式事務管理,使用

Spring的TransactionTemplate、或者使用Spring的

PlatformTransactionManager進行事務管理第四十四頁,共86頁。

聲明性事務管理-5n

更簡單的方式是使用@Transactional1:在配置文件中開啟對@Transactional的支持<tx:annotation-driven

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

=

false,

propagation

=

Propagation.REQUIRES_NEW)n

默認的@Transactional配置如下:1:事務傳播設置是

PROPAGATION_REQUIRED2:事務隔離級別是

ISOLATION_DEFAULT3:事務是

讀/寫4:事務超時默認是依賴于事務系統(tǒng)的,或者事務超時沒有被支持。5:任何

RuntimeException

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

checked

Exception

將不

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

聲明性事務管理-6第四十六頁,共86頁。

聲明性事務管理-7第四十七頁,共86頁。

編程式事務管理-1n

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

TransactionTemplate2:直接使用一個

PlatformTransactionManager

實現(xiàn)

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

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

UserTransaction

API

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

使用

TransactionTemplate:TransactionTemplate

采用與Spring中別的摸板同

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

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

一樣,TransactionTemplate

類的實例是線程安全的。n

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

編程式事務管理-2n

直接使用TransactionTemplate//獲取事務管理器PlatformTransactionManager

txManager

=

(PlatformTransactionManager)

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

transactionTemplate

=

new

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

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

TransactionCallback()

{

@Override

public

Object

doInTransaction(TransactionStatus

status)

{

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

new

JdbcTemplate(ds).execute("insert

into

tbl_user

(uuid,name)

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

return

null;

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

編程式事務管理-3n

使用

PlatformTransactionManager

你也可以直接使用PlatformTransactionManager的實現(xiàn)來管理事務。只需

通過bean引用簡單地傳入一個

PlatformTransactionManager

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

TransactionDefinition

TransactionStatus

對象,你就可以啟動一個事

務,提交或回滾。n

使用

PlatformTransactionManager示例如下:第五十頁,共86頁。

編程式事務管理-4n

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

txManager

=

(PlatformTransactionManager)

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

td

=

new

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

status

=

txManager.getTransaction(td);try

{

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

JdbcTemplate(ds).execute("insert

into

tbl_user

(uuid,name)

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

//提交事務

txMmit(status);}catch

(Exception

e)

{

//回滾事務

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

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

Spring的事務

包括:使用@Transactional進行聲明性事務管理、編程式事務管理,使用

Spring的TransactionTemplate、或者使用Spring的

PlatformTransactionManager進行事務管理n

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

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

本節(jié)課程概覽n

Struts2+Spring3+Hibernate3整合第五十四頁,共86頁。

Spring3整合Struts2-1n

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

Spring3結(jié)合Struts2的步驟如下:1:開啟Struts2結(jié)合Spring3,在struts.xml中添加如下語句:<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>當然別忘了加上Struts2自己的filter。第五十五頁,共86頁。

Spring3整合Struts2-24:在struts.xml中Action配置的時候,如下:<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中,就可以通過依賴注入的方式來注入需要使用的接口了。第五十六頁,共86頁。

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

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

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

和Struts2的整合。

對于整合又要注意兩個方面,一個是如何配置和部署;另外一個是整合過

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

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

起來開發(fā)的方式。第五十七頁,共86頁。

第七章:Spring3的表達式語言第五十八頁,共86頁。

概述n

是什么

Spring表達式語言全稱為“Spring

Expression

Language”,縮寫為

“SpEL”,類似于Struts2x中使用的OGNL表達式語言,能在運行時構(gòu)建復雜表達式、

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

表達式語言給靜態(tài)Java語言增加了動態(tài)功能。

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

能干什么

表達式語言一般是用較為簡單的形式完成主要的工作,減少開發(fā)的工作量。

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

達式、三目運算及Elivis表達式、正則表達式、括號優(yōu)先級表達式;二、類相關表達式:類類型表達式、類實例化、instanceof表達式、變量定義及引用、

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

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

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

HelloWorldn

在Java中使用SpringEL是非常簡單的,示例如下:public

class

HelloWorld

{

public

static

void

main(String[]

args)

{

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

EvaluationContext

context

=

new

StandardEvaluationContext();

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

ExpressionParser

parser

=

new

SpelExpressionParser();

//解析表達式:使用ExpressionParser來解析表達式為相應的Expression對象

Expression

expression

=

parser.parseExpression("('Hello'

+

'

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

//設置上下文中的變量的值

context.setVariable("end",

"!SpringEL");

//執(zhí)行表達式,獲取運行結(jié)果

String

str

=

(String)expression.getValue(context);

System.out.println("the

str="+str);

}}第六十頁,共86頁。

SpEL的基本概念n

表達式

表達式是表達式語言的核心,從我們角度來看就是“要做什么”n

解析器

用于將字符串表達式解析為表達式對象,從我們角度來看是“誰來做”n

上下文

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

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

SpEL的基本運行原理第六十二頁,共86頁。}}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接口

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

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

象。

配合ExpressionParser

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

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

static

void

main(String[]

args)

{

ExpressionParser

parser

=

new

SpelExpressionParser();

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

ParserContext

parserContext

溫馨提示

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

最新文檔

評論

0/150

提交評論