成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

spring對(duì)JDBC和orm的支持實(shí)例詳解

簡介

羅城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),羅城網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為羅城上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的羅城做網(wǎng)站的公司定做!

Spring提供的DAO(數(shù)據(jù)訪問對(duì)象)支持主要的目的是便于以標(biāo)準(zhǔn)的方式使用不同的數(shù)據(jù)訪問技術(shù),如JDBC,Hibernate或者JDO等。它不僅可以讓你方便地在這些持久化技術(shù)間切換, 而且讓你在編碼的時(shí)候不用考慮處理各種技術(shù)中特定的異常。

一致的異常層次

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中定義的異常層次相兼容的異常。

一致的DAO支持抽象類

為了便于以一種一致的方式使用各種數(shù)據(jù)訪問技術(shù),如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO類供你擴(kuò)展。這些抽象類提供了一些方法,通過它們你可以 獲得與你當(dāng)前使用的數(shù)據(jù)訪問技術(shù)相關(guān)的數(shù)據(jù)源和其他配置信息。

1:JdbcDaoSupport - JDBC數(shù)據(jù)訪問對(duì)象的基類。 需要一個(gè)DataSource,同時(shí)為子類提供 JdbcTemplate。

2:HibernateDaoSupport - Hibernate數(shù)據(jù)訪問對(duì)象的基類。 需要一個(gè)SessionFactory,同時(shí)為子類提供 HibernateTemplate。也可以選擇直接通過 提供一個(gè)HibernateTemplate來初始化。

3:JdoDaoSupport - JDO數(shù)據(jù)訪問對(duì)象的基類。 需要設(shè)置一個(gè)PersistenceManagerFactory, 同時(shí)為子類提供JdoTemplate。

4:JpaDaoSupport - JPA數(shù)據(jù)訪問對(duì)象的基類。 需要一個(gè)EntityManagerFactory,同時(shí) 為子類提供JpaTemplate。

簡介

Spring JDBC抽象框架所帶來的價(jià)值將在以下幾個(gè)方面得以體現(xiàn):(注:使用了Spring JDBC抽象框架之后,應(yīng)用開發(fā)人員只需要完成斜體加粗字部分的編碼工作。)

1:指定數(shù)據(jù)庫連接參數(shù)

2:打開數(shù)據(jù)庫連接

3:聲明SQL語句

4:預(yù)編譯并執(zhí)行SQL語句

5:遍歷查詢結(jié)果(如果需要的話)

6:處理每一次遍歷操作

7:處理拋出的任何異常

8:處理事務(wù)

9:關(guān)閉數(shù)據(jù)庫連接

Spring將替我們完成所有單調(diào)乏味的JDBC底層細(xì)節(jié)處理工作

Spring JDBC抽象框架由四個(gè)包構(gòu)成:core、 dataSource、object以及support

1:core包由JdbcTemplate類以及相關(guān)的回調(diào)接口和類組成。

2:datasource包由一些用來簡化DataSource訪問的工具類,以及各種DataSource接口的簡單實(shí)現(xiàn)(主要用于單元測(cè)試以及在J2EE容器之外使用JDBC)組成。

3:object包由封裝了查詢、更新以及存儲(chǔ)過程的類組成,這些類的對(duì)象都是線程安全并且可重復(fù)使用的。它們類似于JDO,與JDO的不同之處在于查詢結(jié)果與數(shù)據(jù)庫是“斷開連接”的。它們是在core包的基礎(chǔ)上對(duì)JDBC更高層次的抽象。

4:support包提供了一些SQLException的轉(zhuǎn)換類以及相關(guān)的工具類。

在JDBC處理過程中拋出的異常將被轉(zhuǎn)換成org.springframework.dao包中定義的異常。因此使用Spring JDBC進(jìn)行開發(fā)將不需要處理JDBC或者特定的RDBMS才會(huì)拋出的異常。所有的異常都是unchecked exception,這樣我們就可以對(duì)傳遞到調(diào)用者的異常進(jìn)行有選擇的捕獲。

JdbcTemplate是core包的核心類。它替我們完成了資源的創(chuàng)建以及釋放工作,從而簡化了對(duì)JDBC的使用。它還可以幫助我們避免一些常見的錯(cuò)誤,比如忘記關(guān)閉數(shù)據(jù)庫連接。

定義接口如下:

java代碼:

public interface Api { 
public boolean create(UserModel um);  
} 

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

java代碼:

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; 
} 
} 

配置文件

java代碼:

<bean name="api" class="com.bjpowernode.Spring3.jdbc.Impl"> 
<property name="ds" ref="dataSource"></property> 
</bean> 
<bean name="dataSource" class="org.apache.commons.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> 

客戶端

java代碼:

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); 
} 

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

java代碼:

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; 
} 

spring對(duì)JDBC和orm的支持實(shí)例詳解

NamedParameterJdbcTemplate類在SQL語句中支持使用命名參數(shù),比較適合做查詢,如果做更新,同樣需要使用回調(diào)方法,如下:

java代碼:

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")); 
} 

NamedParameterJdbcTemplate類是線程安全的,該類的最佳使用方式不是每次操作的時(shí)候?qū)嵗粋€(gè)新的

NamedParameterJdbcTemplate,而是針對(duì)每個(gè)DataSource只配置一個(gè)NamedParameterJdbcTemplate實(shí)例

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

java代碼:

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()); 
} 

SimpleJdbcTemplate類

SimpleJdbcTemplate類是JdbcTemplate類的一個(gè)包裝器(wrapper),它利用了Java 5的一些語言特性,比如Varargs和Autoboxing。

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ù)庫廠商的error code,比采用SQLState更精確。

DataSourceUtils類

DataSourceUtils是一個(gè)幫助類提供易用且強(qiáng)大的數(shù)據(jù)庫訪問能力,們可以使用該類提供的靜態(tài)方法從JNDI獲取數(shù)據(jù)庫連接以及在必要的時(shí)候關(guān)閉之。

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

SmartDataSource接口

SmartDataSource是DataSource 接口的一個(gè)擴(kuò)展,用來提供數(shù)據(jù)庫連接。使用該接口的類在指定的操作之后可以檢查是否需要關(guān)閉連接。

AbstractDataSource類

它實(shí)現(xiàn)了DataSource接口的 一些無關(guān)痛癢的方法,如果你需要實(shí)現(xiàn)自己的DataSource,那么繼承 該類是個(gè)好主意 。

SingleConnectionDataSource類

是SmartDataSource接口 的一個(gè)實(shí)現(xiàn),其內(nèi)部包裝了一個(gè)單連接。該連接在使用之后將不會(huì)關(guān)閉,很顯然它不能在多線程 的環(huán)境下使用

簡介

Spring在資源管理,DAO實(shí)現(xiàn)支持以及事務(wù)策略等方面提供了與 JDO、JPA、Hibernate、TopLink及iBATIS的集成。以Hibernate為例,Spring通過使用許多IoC的便捷特性對(duì)它提供了一流的支持,幫助你處理很多典型的Hibernate整合的問題。所有的這些支持,都遵循Spring通用的事務(wù)和DAO異常體系。通常來說有兩種不同的整合風(fēng)格:你可以使用Spring提供的DAO模板,或者直接使用Hibernate/JDO/TopLink等工具的原生API編寫DAO。無論采取哪種風(fēng)格,這些DAO都可以通過IoC進(jìn)行配置,并參與到Spring的資源和事務(wù)管理中去。

使用Spring構(gòu)建你的O/R Mapping DAO的好處包括:

1:測(cè)試簡單

2:異常封裝

3:通用的資源管理

4:綜合的事務(wù)管理

5:避免綁定特定技術(shù)允許mix-and-match的實(shí)現(xiàn)策略

在Spring的application context中創(chuàng)建 SessionFactory ,如下:

java代碼:

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

定義接口如下:

java代碼:

public interface Api { 
public boolean create(UserModel um); 
} 

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

java代碼:

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; 
} 
} 

配置文件如下:

java代碼:

<bean name="api" class="com.bjpowernode.Spring3.h4.Impl"> 
<property name="sf" ref="hbConfig"></property> 
</bean> 
<bean id="dataSource" class="org.apache.commons.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> 

配置文件如下:

java代碼:

<bean id="hbConfig" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="dataSource"><ref local="dataSource"/></property> 
<property name="mappingResources"> 
<list> <value>cn/bjpowernode/Spring3/h4/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>

客戶端文件如下:

java代碼:

public static void main(String[] args)throws Exception { 
ApplicationContext context = new ClassPathXmlApplicationContext( 
  new String[] {"applicationContext-h4.xml"}); 
Api api = (Api)context.getBean("api"); 
UserModel um = new UserModel(); 
um.setUuid("test1"); 
um.setName("test1"); 
api.create(um); 
} 

前面的演示是更新操作,那么查詢?cè)趺醋瞿兀咳缦拢?/p>

java代碼:

List<UserModel> list = ht.find("select o from UserModel o"); 

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

java代碼:

Object params[] = new Object[1]; 
params[0] = "test1"; 
List<UserModel> list = ht.find("select o from UserModel o where o.uuid=?",params); 

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

java代碼:

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); 

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

java代碼:

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); 

一個(gè)回調(diào)實(shí)現(xiàn)能夠有效地在任何Hibernate數(shù)據(jù)訪問中使用。HibernateTemplate 會(huì)確保當(dāng)前Hibernate的 Session 對(duì)象的正確打開和關(guān)閉,并直接參與到事務(wù)管理中去。 Template實(shí)例不僅是線程安全的,同時(shí)它也是可重用的。因而他們可以作為外部對(duì)象的實(shí)例變量而被持有。
實(shí)現(xiàn)類改成如下:

java代碼:

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; 
} 
} 

配置文件改成如下:

java代碼:

<bean name="api" class="com.bjpowernode.Spring3.h4.Impl"> 
<property name="sessionFactory" ref="hbConfig"></property> 
</bean> 

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

java代碼:

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 的需要)。

總結(jié)

以上所述是小編給大家介紹的spring對(duì)JDBC和orm的支持實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!

網(wǎng)頁標(biāo)題:spring對(duì)JDBC和orm的支持實(shí)例詳解
鏈接URL:http://jinyejixie.com/article18/pshjgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、標(biāo)簽優(yōu)化、網(wǎng)站設(shè)計(jì)、電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
甘德县| 叶城县| 扬中市| 股票| 新蔡县| 德昌县| 深州市| 盘山县| 盘山县| 江川县| 澄迈县| 福建省| 张家港市| 徐汇区| 遂川县| 屯门区| 宜昌市| 汽车| 察雅县| 朔州市| 堆龙德庆县| 田林县| 承德县| 乌拉特前旗| 子长县| 平凉市| 大洼县| 安福县| 东至县| 浠水县| 乐昌市| 自贡市| 中卫市| 法库县| 任丘市| 蓝田县| 阿图什市| 永善县| 遵义市| 桐柏县| 宁国市|