tbwshc

          主題:Spring3開發(fā)實戰(zhàn) 之 第四章:對JDBC和ORM的支持

          簡介
          Spring提供的DAO(數(shù)據(jù)訪問對象)支持主要的目的是便于以標(biāo)準(zhǔn)的方式使用不同的數(shù)據(jù)訪問技術(shù),如JDBC,Hibernate或者JDO等。它不僅可以讓你方便地在這些持久化技術(shù)間切換, 而且讓你在編碼的時候不用考慮處理各種技術(shù)中特定的異常。
          一致的異常層次
          Spring提供了一種方便的方法,把特定于某種技術(shù)的異常,如SQLException, 轉(zhuǎn)化為自己的異常,這種異常屬于以 DataAccessException 為根的異常層次。這些異常封裝了原始異常對象,這樣就不會有丟失任何錯誤信息的風(fēng)險。
          如果使用攔截器方式,你在應(yīng)用中 就得自己小心處理HibernateException、 JDOException等,最好是委托給 SessionFactoryUtils的 convertHibernateAccessException、 convertJdoAccessException等方法。這些方法可以把相應(yīng)的異常轉(zhuǎn) 化為與org.springframework.dao中定義的異常層次相兼容的異常。
          一致的DAO支持抽象類
          為了便于以一種一致的方式使用各種數(shù)據(jù)訪問技術(shù),如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO類供你擴展。這些抽象類提供了一些方法,通過它們你可以 獲得與你當(dāng)前使用的數(shù)據(jù)訪問技術(shù)相關(guān)的數(shù)據(jù)源和其他配置信息。
          1:JdbcDaoSupport - JDBC數(shù)據(jù)訪問對象的基類。 需要一個DataSource,同時為子類提供 JdbcTemplate。
          2:HibernateDaoSupport - Hibernate數(shù)據(jù)訪問對象的基類。 需要一個SessionFactory,同時為子類提供 HibernateTemplate。也可以選擇直接通過 提供一個HibernateTemplate來初始化。
          3:JdoDaoSupport - JDO數(shù)據(jù)訪問對象的基類。 需要設(shè)置一個PersistenceManagerFactory, 同時為子類提供JdoTemplate。
          4:JpaDaoSupport - JPA數(shù)據(jù)訪問對象的基類。 需要一個EntityManagerFactory,同時 為子類提供JpaTemplate。
          簡介
          Spring JDBC抽象框架所帶來的價值將在以下幾個方面得以體現(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òu)成:core、 dataSource、object以及support
          1:core包由JdbcTemplate類以及相關(guān)的回調(diào)接口和類組成。
          2:datasource包由一些用來簡化DataSource訪問的工具類,以及各種DataSource接口的簡單實現(xiàn)(主要用于單元測試以及在J2EE容器之外使用JDBC)組成。
          3:object包由封裝了查詢、更新以及存儲過程的類組成,這些類的對象都是線程安全并且可重復(fù)使用的。它們類似于JDO,與JDO的不同之處在于查詢結(jié)果與數(shù)據(jù)庫是“斷開連接”的。它們是在core包的基礎(chǔ)上對JDBC更高層次的抽象。
          4:support包提供了一些SQLException的轉(zhuǎn)換類以及相關(guān)的工具類。
           
          在JDBC處理過程中拋出的異常將被轉(zhuǎn)換成org.springframework.dao包中定義的異常。因此使用Spring JDBC進行開發(fā)將不需要處理JDBC或者特定的RDBMS才會拋出的異常。所有的異常都是unchecked exception,這樣我們就可以對傳遞到調(diào)用者的異常進行有選擇的捕獲。
          JdbcTemplate是core包的核心類。它替我們完成了資源的創(chuàng)建以及釋放工作,tb從而簡化了對JDBC的使用。它還可以幫助我們避免一些常見的錯誤,比如忘記關(guān)閉數(shù)據(jù)庫連接。
          定義接口如下:

          java代碼:
          1. public interface Api {  
          2. public boolean create(UserModel um);     
          3. }  
          定義實現(xiàn)類如下:

          java代碼:
          1. public class Impl implements Api{  
          2. private DataSource ds = null;  
          3. public void setDs(DataSource ds){  
          4. this.ds = ds;  
          5. }  
          6. public boolean create(UserModel um) {  
          7. JdbcTemplate jt = new JdbcTemplate(ds);  
          8. jt.execute("insert into tbl_user (uuid,name) values('"+um.getUuid()+"','"+um.getName()+"')");  
          9. return false;  
          10. }  
          11. }  
          配置文件

          java代碼:
          1. <bean name="api" class="cn.javass.Spring3.jdbc.Impl">  
          2. <property name="ds" ref="dataSource"></property>  
          3. </bean>  
          4. <bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
          5. <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>  
          6. <property name="url"><value>jdbc:oracle:thin:@localhost:1521:orcl</value></property>  
          7. <property name="username"> <value>test</value> </property>  
          8. <property name="password" value="test"/>  
          9. </bean>  
          客戶端

          java代碼:
          1. public static void main(String[] args)throws Exception {  
          2. ApplicationContext context = new ClassPathXmlApplicationContext(  
          3.         new String[] {"applicationContext-jdbc.xml"});  
          4. Api api = (Api)context.getBean("api");  
          5. UserModel um = new UserModel();  
          6. um.setUuid("test1");  
          7. um.setName("test1");  
          8. api.create(um);  
          9. }  
          如果是需要向里面?zhèn)鬟f參數(shù)的,就需要回調(diào)接口,如下:

          java代碼:
          1. public boolean create(UserModel um1){  
          2. JdbcTemplate jt = new JdbcTemplate(ds);  
          3. final UserModel um = um1;  
          4. class myCallBack implements PreparedStatementCallback{  
          5. public Object doInPreparedStatement(PreparedStatement pstmt)  
          6. throws SQLException, DataAccessException {  
          7. pstmt.setString(1,um.getUuid());  
          8. pstmt.setString(2,um.getName());  
          9. System.out.println("dddddddd");  
          10. return pstmt.executeUpdate();  
          11. }  
          12. }  
          13. jt.execute("insert into tbl_user (uuid,name) values(?,?)",new myCallBack());  
          14. return false;  
          15. }  
           
          NamedParameterJdbcTemplate類在SQL語句中支持使用命名參數(shù),比較適合做查詢,如果做更新,同樣需要使用回調(diào)方法,如下:

          java代碼:
          1. NamedParameterJdbcTemplate jt = new NamedParameterJdbcTemplate(ds);  
          2. Map paramMap = new HashMap();  
          3. paramMap.put("uuid",um.getUuid());  
          4. List list = jt.queryForList("select * from tbl_user where uuid=:uuid",paramMap);  
          5. Iterator it = list.iterator();  
          6. while(it.hasNext()){  
          7. Map map = (Map)it.next();  
          8. System.out.println("uuid="+map.get("uuid")+",name="+map.get("name"));  
          9. }  
          NamedParameterJdbcTemplate類是線程安全的,該類的最佳使用方式不是每次操作的時候?qū)嵗粋€新的NamedParameterJdbcTemplate,而是針對每個DataSource只配置一個NamedParameterJdbcTemplate實例
          NamedParameterJdbcTemplate也可以自己做mapper,如下:

          posted on 2012-08-06 13:41 chen11-1 閱讀(1233) 評論(0)  編輯  收藏

          主站蜘蛛池模板: 汝城县| 山丹县| 东光县| 吴川市| 福建省| 巴南区| 临江市| 六盘水市| 海阳市| 织金县| 定州市| 长海县| 威海市| 当雄县| 泽州县| 土默特左旗| 内乡县| 娄底市| 博罗县| 驻马店市| 孟州市| 正蓝旗| 泊头市| 大化| 台东县| 甘孜县| 曲阜市| 兰溪市| 鸡泽县| 开江县| 固镇县| 留坝县| 磐石市| 阳江市| 临城县| 敦化市| 娄底市| 清远市| 荥经县| 洛南县| 关岭|