版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西電力職業(yè)技術(shù)學(xué)院《社會(huì)保障史》2023-2024學(xué)年第一學(xué)期期末試卷
- 吉林體育學(xué)院《解剖和生理(生理)》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南食品藥品職業(yè)學(xué)院《高等數(shù)理統(tǒng)計(jì)一》2023-2024學(xué)年第一學(xué)期期末試卷
- 湖南大眾傳媒職業(yè)技術(shù)學(xué)院《國(guó)際物流與供應(yīng)鏈管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 【物理】《壓強(qiáng)》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年人教版(2024)初中物理八年級(jí)下冊(cè)
- 高考物理總復(fù)習(xí)《力與物體的平衡》專項(xiàng)測(cè)試卷含答案
- 年產(chǎn)5萬(wàn)臺(tái)模塊化操動(dòng)機(jī)構(gòu)及高壓斷路器生產(chǎn)線項(xiàng)目可行性研究報(bào)告寫作模板-備案審批
- 鄭州軟件職業(yè)技術(shù)學(xué)院《鋼結(jié)構(gòu)設(shè)計(jì)B》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江電力職業(yè)技術(shù)學(xué)院《光電技術(shù)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 長(zhǎng)安大學(xué)《個(gè)體防護(hù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海車位交易指南(2024版)
- 醫(yī)學(xué)脂質(zhì)的構(gòu)成功能及分析專題課件
- 新疆塔城地區(qū)(2024年-2025年小學(xué)六年級(jí)語(yǔ)文)部編版期末考試(下學(xué)期)試卷及答案
- 2024年9月時(shí)事政治試題帶答案
- 汽車供應(yīng)商審核培訓(xùn)
- 《計(jì)算機(jī)網(wǎng)絡(luò) 》課件第1章
- 1《地球的表面》說(shuō)課稿-2024-2025學(xué)年科學(xué)五年級(jí)上冊(cè)教科版
- GB/T 44764-2024石油、石化和天然氣工業(yè)腐蝕性石油煉制環(huán)境中抗硫化物應(yīng)力開(kāi)裂的金屬材料
- 自動(dòng)化招聘筆試試題及答案
- 重慶市主城四區(qū)2025屆高一物理第一學(xué)期期末聯(lián)考試題含解析
- 燃?xì)庑袠I(yè)有限空間作業(yè)安全管理制度
評(píng)論
0/150
提交評(píng)論