<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    tbwshc

    主題:Spring3開發實戰 之 第四章:對JDBC和ORM的支持

    簡介
    Spring提供的DAO(數據訪問對象)支持主要的目的是便于以標準的方式使用不同的數據訪問技術,如JDBC,Hibernate或者JDO等。它不僅可以讓你方便地在這些持久化技術間切換, 而且讓你在編碼的時候不用考慮處理各種技術中特定的異常。
    一致的異常層次
    Spring提供了一種方便的方法,把特定于某種技術的異常,如SQLException, 轉化為自己的異常,這種異常屬于以 DataAccessException 為根的異常層次。這些異常封裝了原始異常對象,這樣就不會有丟失任何錯誤信息的風險。
    如果使用攔截器方式,你在應用中 就得自己小心處理HibernateException、 JDOException等,最好是委托給 SessionFactoryUtils的 convertHibernateAccessException、 convertJdoAccessException等方法。這些方法可以把相應的異常轉 化為與org.springframework.dao中定義的異常層次相兼容的異常。
    一致的DAO支持抽象類
    為了便于以一種一致的方式使用各種數據訪問技術,如JDBC、JDO和Hibernate, Spring提供了一套抽象DAO類供你擴展。這些抽象類提供了一些方法,通過它們你可以 獲得與你當前使用的數據訪問技術相關的數據源和其他配置信息。
    1:JdbcDaoSupport - JDBC數據訪問對象的基類。 需要一個DataSource,同時為子類提供 JdbcTemplate。
    2:HibernateDaoSupport - Hibernate數據訪問對象的基類。 需要一個SessionFactory,同時為子類提供 HibernateTemplate。也可以選擇直接通過 提供一個HibernateTemplate來初始化。
    3:JdoDaoSupport - JDO數據訪問對象的基類。 需要設置一個PersistenceManagerFactory, 同時為子類提供JdoTemplate。
    4:JpaDaoSupport - JPA數據訪問對象的基類。 需要一個EntityManagerFactory,同時 為子類提供JpaTemplate。
    簡介
    Spring JDBC抽象框架所帶來的價值將在以下幾個方面得以體現:(注:使用了Spring JDBC抽象框架之后,應用開發人員只需要完成斜體加粗字部分的編碼工作。)
    1:指定數據庫連接參數
    2:打開數據庫連接
    3:聲明SQL語句
    4:預編譯并執行SQL語句
    5:遍歷查詢結果(如果需要的話)
    6:處理每一次遍歷操作
    7:處理拋出的任何異常
    8:處理事務
    9:關閉數據庫連接
    Spring將替我們完成所有單調乏味的JDBC底層細節處理工作
    Spring JDBC抽象框架由四個包構成:core、 dataSource、object以及support
    1:core包由JdbcTemplate類以及相關的回調接口和類組成。
    2:datasource包由一些用來簡化DataSource訪問的工具類,以及各種DataSource接口的簡單實現(主要用于單元測試以及在J2EE容器之外使用JDBC)組成。
    3:object包由封裝了查詢、更新以及存儲過程的類組成,這些類的對象都是線程安全并且可重復使用的。它們類似于JDO,與JDO的不同之處在于查詢結果與數據庫是“斷開連接”的。它們是在core包的基礎上對JDBC更高層次的抽象。
    4:support包提供了一些SQLException的轉換類以及相關的工具類。
     
    在JDBC處理過程中拋出的異常將被轉換成org.springframework.dao包中定義的異常。因此使用Spring JDBC進行開發將不需要處理JDBC或者特定的RDBMS才會拋出的異常。所有的異常都是unchecked exception,這樣我們就可以對傳遞到調用者的異常進行有選擇的捕獲。
    JdbcTemplate是core包的核心類。它替我們完成了資源的創建以及釋放工作,tb從而簡化了對JDBC的使用。它還可以幫助我們避免一些常見的錯誤,比如忘記關閉數據庫連接。
    定義接口如下:

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

    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. }  
    如果是需要向里面傳遞參數的,就需要回調接口,如下:

    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語句中支持使用命名參數,比較適合做查詢,如果做更新,同樣需要使用回調方法,如下:

    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類是線程安全的,該類的最佳使用方式不是每次操作的時候實例化一個新的NamedParameterJdbcTemplate,而是針對每個DataSource只配置一個NamedParameterJdbcTemplate實例
    NamedParameterJdbcTemplate也可以自己做mapper,如下:

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

    主站蜘蛛池模板: 天黑黑影院在线观看视频高清免费| 不卡一卡二卡三亚洲| 亚洲av日韩综合一区二区三区 | 未满十八私人高清免费影院| 亚洲中文字幕无码久久2017| 粉色视频免费入口| 亚洲韩国精品无码一区二区三区| 精品国产无限资源免费观看| 亚洲AV无码国产精品麻豆天美| 久青草国产免费观看| 亚洲成人国产精品| 免费人成视频在线播放| 免费国产a国产片高清网站| 狠狠入ady亚洲精品| 亚洲&#228;v永久无码精品天堂久久 | 亚洲精品午夜国产VA久久成人| 9277手机在线视频观看免费| 亚洲网站在线观看| 国产精品99久久免费| 999任你躁在线精品免费不卡| 亚洲AV无码乱码在线观看富二代 | 51午夜精品免费视频| 亚洲综合校园春色| 亚洲色中文字幕无码AV| a级毛片100部免费观看| 亚洲精品9999久久久久无码| 亚洲成人精品久久| 亚洲成a人片在线观看日本麻豆| www视频在线观看免费| 亚洲成人激情小说| 韩国免费三片在线视频| 亚洲成在人线在线播放无码 | 亚洲国产亚洲片在线观看播放| 国产精品亚洲不卡一区二区三区| 巨波霸乳在线永久免费视频 | 99久久久精品免费观看国产| 两个人看的www高清免费视频| 久久亚洲AV成人无码国产电影| 亚洲视频欧洲视频| 亚洲不卡中文字幕无码| 亚洲午夜爱爱香蕉片|