:: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理

          五、Spring 持久層

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

          SpringDAO框架并不拋出與數(shù)據(jù)庫技術(shù)相關(guān)的異常,Spring所有異常都是DataAccessException的子類,一個(gè)與數(shù)據(jù)庫技術(shù)無關(guān)的通用異常類,該類繼承至RuntimeException

          對(duì)于Jdbc存取,SpringSQLException等轉(zhuǎn)化為自己的DAO異常對(duì)象。

          DataSource注入

          對(duì)于不同的數(shù)據(jù)庫鏈接來源需求,Spring提供了javax.sql.DataSource注入,更換數(shù)據(jù)來源只需在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的實(shí)例,

           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的關(guān)閉,Connection的關(guān)閉等。它被設(shè)計(jì)為線程安全的。

          要建立JdbcTemplate的實(shí)例,必須要有一個(gè)DataSource對(duì)象作為構(gòu)造對(duì)象。

          JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

          Spring事務(wù)管理

          Spring提供編程式事務(wù)管理與聲明式事務(wù)管理。

          編程式事務(wù)管理

          Spring提供了兩種方式實(shí)現(xiàn)編程式事務(wù)管理:使用PlatformTransactionManager實(shí)現(xiàn);使用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是其一個(gè)實(shí)現(xiàn)類。

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

           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}

          另一個(gè)編程式事務(wù)管理方法是使用TransactionTemplate,它需要一個(gè)TransactionManager實(shí)例,如下:

           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}

          聲明式事務(wù)管理

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

          定義文件如下:

           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>



          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 琼结县| 辽源市| 永年县| 五家渠市| 搜索| 乌兰县| 蒙阴县| 乐东| 剑川县| 弋阳县| 璧山县| 灵宝市| 聂拉木县| 黑龙江省| 木兰县| 航空| 五寨县| 西林县| 黄平县| 会昌县| 吉林省| 文水县| 青铜峡市| 房产| 白玉县| 枞阳县| 易门县| 齐河县| 永清县| 伊宁县| 禄劝| 江津市| 宿州市| 桃江县| 灵石县| 乐陵市| 廉江市| 毕节市| 类乌齐县| 奇台县| 安顺市|