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



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


    網站導航:
     
    主站蜘蛛池模板: h片在线观看免费| 国拍在线精品视频免费观看| 亚洲欧洲在线播放| 国产成人高清精品免费鸭子| 中文字幕无码免费久久9一区9| 亚洲国产精品美女| 久久亚洲国产精品123区| 亚洲高清免费在线观看| 曰批全过程免费视频观看免费软件| 亚洲AV无码乱码在线观看富二代| 最近免费中文字幕大全视频 | 国产亚洲男人的天堂在线观看| 亚洲Av永久无码精品三区在线| 日本一道一区二区免费看| 午夜免费福利小电影| 特级毛片A级毛片100免费播放| 久久亚洲AV无码精品色午夜| 亚洲精品一级无码鲁丝片| 麻豆最新国产剧情AV原创免费| 日韩免费高清播放器| 美国毛片亚洲社区在线观看| 亚洲理论精品午夜电影| 亚洲国产成人影院播放| 手机看黄av免费网址| 成人免费区一区二区三区| 国产午夜亚洲精品不卡| 精品亚洲AV无码一区二区| 久久99国产亚洲精品观看| 亚洲精品国产日韩无码AV永久免费网| 免费看韩国黄a片在线观看| 小草在线看片免费人成视久网| 噼里啪啦电影在线观看免费高清| 少妇亚洲免费精品| 亚洲日本一线产区和二线| 亚洲美女视频免费| 精品国产_亚洲人成在线高清| 免费一级肉体全黄毛片| 青青草国产免费久久久91| 免费看黄视频网站| 57pao国产成视频免费播放| 免费无码av片在线观看|