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

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

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

       :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    五、Spring 持久層

    對于不同的數據庫技術,某些步驟是固定的,只有少部分不同。Spring運用Template Method模式,將固定的流程編寫與Temp類(JdbcTemplate、HibernateTemplate)之中,對不同的一些細節步驟,依托特定DAO支持對象來處理。

    SpringDAO框架并不拋出與數據庫技術相關的異常,Spring所有異常都是DataAccessException的子類,一個與數據庫技術無關的通用異常類,該類繼承至RuntimeException

    對于Jdbc存取,SpringSQLException等轉化為自己的DAO異常對象。

    DataSource注入

    對于不同的數據庫鏈接來源需求,Spring提供了javax.sql.DataSource注入,更換數據來源只需在Bean定義文件中修改配置,不需修改程序代碼。
    例如可以在Bean文件中編寫如下:

     1<!-- 帶連接池的DataSource -->
     2<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     3    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     4    <property name="url" value="jdbc:mysql://localhost:3306/test" />
     5    <property name="username" value="root" />
     6    <property name="password" value="root" />
     7</bean>
     8    
     9<bean id="peopleDao" class="SpringPersistence.PeopleDaoMySQLImpl">
    10    <property name="dataSource" ref="dataSource" />
    11</bean>

    要建立JdbcTemplate的實例,

     1public class PeopleDaoMySQLImpl implements PeopleDao {
     2    
     3    private DataSource dataSource;
     4    
     5    public void setDataSource(DataSource dataSource){
     6        this.dataSource = dataSource;
     7    }

     8
     9    public void save(People people) {
    10        Connection conn = null;
    11        Statement stmt = null;
    12        try {
    13            conn = dataSource.getConnection();
    14            stmt = conn.createStatement();
    15            stmt.execute("INSERT INTO people VALUES (" + people.getId()
    16                    + ",'" + people.getName() + "'," + people.getAge() + ")");
    17            stmt.execute("");
    18        }
     catch (SQLException e) {
    19            e.printStackTrace();
    20        }
     finally {
    21            if(stmt != null){
    22                try {
    23                    stmt.close();
    24                }
     catch (SQLException e) {
    25                    e.printStackTrace();
    26                }

    27            }
        
    28            if(conn != null){
    29                try {
    30                    conn.close();
    31                }
     catch (SQLException e) {
    32                    e.printStackTrace();
    33                }

    34            }

    35        }

    36    }

    37}


        使用JdbcTemplate

    JdbcTemplate封裝了Connection的取得,Statement的建立,異常的處理,Statement的關閉,Connection的關閉等。它被設計為線程安全的。

    要建立JdbcTemplate的實例,必須要有一個DataSource對象作為構造對象。

    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

    Spring事務管理

    Spring提供編程式事務管理與聲明式事務管理。

    編程式事務管理

    Spring提供了兩種方式實現編程式事務管理:使用PlatformTransactionManager實現;使用org.springframework.transaction.support.TransactionTemplate。

        PlatformTransactionManager接口定義如下:

    1public class interface PlatformTransactionManager {
    2    public void commit(TransactionStatus status) throws TransactionException;
    3    public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
    4    public void rollback(TransactionStatus arg0) throws TransactionException;
    5}

    DataSourceTransactionManager是其一個實現類。

    修改添加新用戶的代碼段作為示例:

     1public class PeopleDaoMySQLImpl2 implements PeopleDao {
     2
     3    private DataSource dataSource;
     4    private DataSourceTransactionManager transactionManager;
     5    private DefaultTransactionDefinition def;
     6    private JdbcTemplate jdbcTemplate;
     7
     8    public void setDataSource(DataSource dataSource) {
     9        this.dataSource = dataSource;
    10        jdbcTemplate = new JdbcTemplate(dataSource);
    11        transactionManager = new DataSourceTransactionManager(dataSource);
    12        def = new DefaultTransactionDefinition();
    13        def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
    14    }

    15
    16    public void save(People people) {
    17        TransactionStatus status = transactionManager.getTransaction(def);
    18        try {
    19            jdbcTemplate.execute("INSERT INTO people VALUES (" + people.getId()
    20                        + ",'" + people.getName() + "'," + people.getAge() + ")");
    21            //jdbcTemplate.execute("");
    22        }
     catch (DataAccessException e) {
    23            transactionManager.rollback(status);
    24            throw e;
    25        }

    26        transactionManager.commit(status);
    27    }

    28}

    另一個編程式事務管理方法是使用TransactionTemplate,它需要一個TransactionManager實例,如下:

     1public class PeopleDaoMySQLImpl3 implements PeopleDao {
     2
     3    private DataSource dataSource;
     4    private DataSourceTransactionManager transactionManager;
     5    private JdbcTemplate jdbcTemplate;
     6
     7    public void setDataSource(DataSource dataSource) {
     8        this.dataSource = dataSource;
     9        jdbcTemplate = new JdbcTemplate(dataSource);
    10        transactionManager = new DataSourceTransactionManager(dataSource);
    11    }

    12
    13    public void save(People people) {
    14        final int id = people.getId();
    15        final String name = people.getName();
    16        final int age = people.getAge();
    17        TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
    18        transactionTemplate.execute(new TransactionCallbackWithoutResult(){
    19            public void doInTransactionWithoutResult(TransactionStatus status){
    20                try {
    21                    jdbcTemplate.execute("INSERT INTO people VALUES (" + id
    22                            + ",'" + name + "'," + age + ")");
    23                    //jdbcTemplate.execute("");
    24                }
     catch (DataAccessException e) {
    25                    status.setRollbackOnly();
    26                }

    27            }

    28        }
    );
    29    }

    30}

    聲明式事務管理

    Spring的聲明式事務管理依賴于它的AOP框架來完成,使用聲明式的事務管理的好處是,事務管理不侵入開發的組件。

    定義文件如下:

     1<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     2    <property name="dataSource" ref="dataSource" />
     3</bean>
     4
     5<bean id="peopleDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     6    <property name="proxyInterfaces">
     7        <list>
     8            <value>SpringPersistence.PeopleDao</value>
     9        </list>
    10    </property>
    11    <property name="target" ref="peopleDao"/>
    12    <property name="transactionManager" ref="transactionManager" />
    13    <property name="transactionAttributes">
    14        <props>
    15            <prop key="sa*">PROPAGATION_REQUIRED</prop>
    16        </props>
    17    </property>
    18</bean>



    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品国自产拍在线观看| 亚洲国产精品va在线播放 | 男女啪啪免费体验区| 亚洲乱码中文字幕久久孕妇黑人| 色欲色香天天天综合网站免费| 亚洲18在线天美| 亚洲A丁香五香天堂网| 最近2022中文字幕免费视频| 亚洲AV日韩AV无码污污网站 | 亚洲色精品vr一区二区三区| 精品国产sm捆绑最大网免费站| 国产99久久亚洲综合精品| 久久久久亚洲Av片无码v| 在线观看免费成人| 免费一级不卡毛片| 看亚洲a级一级毛片| 亚洲精品福利网站| 亚洲区日韩区无码区| 成人激情免费视频| 黄网站免费在线观看| 男男gvh肉在线观看免费| 久久亚洲精品成人无码网站| 亚洲日韩中文字幕日韩在线| 一个人免费观看在线视频www| 三年片免费高清版| 美女18毛片免费视频| 国产成人精品亚洲日本在线 | 亚洲日韩欧洲乱码AV夜夜摸| 女人被男人桶得好爽免费视频| 无码人妻AV免费一区二区三区| 五月婷婷免费视频| 亚洲国产aⅴ成人精品无吗| 亚洲黄色网址在线观看| 国产亚洲AV无码AV男人的天堂| 国产精品美女自在线观看免费 | 国产男女猛烈无遮挡免费视频| 91青青国产在线观看免费| 97国免费在线视频| 色老头综合免费视频| 老牛精品亚洲成av人片| 亚洲最大的成人网|