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

          五、Spring 持久層

          對于不同的數據庫技術,某些步驟是固定的,只有少部分不同。Spring運用Template Method模式,將固定的流程編寫與Temp類(JdbcTemplateHibernateTemplate)之中,對不同的一些細節步驟,依托特定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>



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


          網站導航:
           
          主站蜘蛛池模板: 巴楚县| 利津县| 左权县| 丰县| 筠连县| 怀宁县| 信宜市| 耒阳市| 龙山县| 泰来县| 静宁县| 来安县| 澳门| 海林市| 龙井市| 玛纳斯县| 兴安县| 论坛| 永善县| 卢龙县| 林州市| 宣汉县| 安西县| 甘孜| 铜陵市| 济阳县| 祁东县| 肇庆市| 漯河市| 方城县| 霍邱县| 沛县| 彩票| 琼中| 平利县| 凤凰县| 赤峰市| 元阳县| 高青县| 大名县| 安陆市|