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

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

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

    歲月如哥
    人生非夢
    posts - 50,comments - 144,trackbacks - 0
      http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2398

    這邊以一個簡單的例子來示範Spring的事務管理,對於事務管理定義,我們使用Spring提供的DefaultTransactionDefinition。

      以JDBC DataSource為例,我們可以使用org.springframework.jdbc.datasource.DataSourceTransactionManager(PlatformTransactionManager的一個實現)作為我們的事務管理員,我們在Bean定義檔中配置,並將DataSource注入給它,例如:

     代碼:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="url">
    <value>jdbc:mysql://localhost:3306/TestDB</value>
            
    </property>
    <property name="username">
    <value>root</value>
    </property>
    <property name="password">
    <value></value>
    </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    </bean>
    <bean id="userDAO" class="onlyfun.caterpillar.UserDAO">
    <property name="dataSource">
    <ref bean="dataSource"/>
    </property>
    <property name="transactionManager">
    <ref bean="transactionManager"/>
    </property>
    </bean>
    </beans>

      我們定義了一個簡單的DAO物件,將transactionManager與dataSource注入至其中,UserDAO如下:

     代碼:

    UserDAO.java
    package onlyfun.caterpillar;
    import javax.sql.DataSource;
    import org.springframework.jdbc.core.*;
    import org.springframework.transaction.*;
    import org.springframework.transaction.support.*;
    import org.springframework.dao.*;
    public class UserDAO {
    private DataSource dataSource;
    private PlatformTransactionManager transactionManager;
    public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
    }
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
    this.transactionManager = transactionManager;
    }
    public void insertUser(User user) {
    .
    }
    }

      insertUser()方法中,我們將實現User的存儲,並使用事務管理,首先看看直接使用trransactionManager如何實現事務,我們需要事務定義,作為示範,這邊先使用Spring預設的即可:DefaultTransactionDefinition,我們的程式示範如下:

     代碼:

    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    TransactionStatus status 
    = transactionManager.getTransaction(def);
    try {
    JdbcTemplate jdbcTemplate 
    = new JdbcTemplate(dataSource);
    jdbcTemplate.update(
    "INSERT INTO USER VALUES('Spring008', 'caterpillar', 'M', 29)");
    jdbcTemplate.update(
    "INSERT INTO USER VALUES('Spring009', 'momor', 'F', 26)");
    jdbcTemplate.update(
    "INSERT INTO USER VALUES('Spring010, 'beckyday', 'F', 35)");
    catch (DataAccessException ex) {
    transactionManager.rollback(status); 
    // 也可以執行status.setRollbackOnly();
            throw ex;
    }
    transactionManager.commit(status);

      在上面的程式中,我們照常執行我們的SQL(為了簡化,我們直接將資料寫在SQL中了,而不是從User物件中取得),注意到我們故意在最後一行SQL中Spring010少寫了一個 ' ,這使得SQL句子不合語法,因而造成DataAccessException(封裝了SQLException),這個例外被catch區塊捕捉,因而執行rollback()取消之後的SQL,如果沒有發生錯誤,則最後我們使用commit()來提交操作。

      另一個簡便的方法是使用TransactionTemplate,它封裝了上面的事務流程,透過callback來完成事務,例如:

     代碼:

    TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
    transactionTemplate.execute(
    new TransactionCallbackWithoutResult() {
    public void doInTransactionWithoutResult(TransactionStatus status) {
    JdbcTemplate jdbcTemplate 
    = new JdbcTemplate(dataSource);
    jdbcTemplate.update(
    "INSERT INTO USER VALUES('Spring008', 'caterpillar', 'M', 29)");
    jdbcTemplate.update(
    "INSERT INTO USER VALUES('Spring009', 'momor', 'F', 26)");
    jdbcTemplate.update(
    "INSERT INTO USER VALUES('Spring010, 'beckyday', 'F', 35)");
    }
    });

      這邊使用TransactionCallbackWithoutResult,並在它的doInTransactionWithoutResult()中進行SQL操作,如果執行中發生例外,則之前所有的操作取消,否則最後自動提交操作。如果操作完成您想要返回結果物件,則可以使用TransactionCallback,並實現其doInTransaction(),例如:

     代碼:

    TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
    Object result 
    = transactionTemplate.execute(
    new TransactionCallback() {
    public Object doInTransaction(TransactionStatus status) {
    // 作一些操作
                
    // 收集為結果物件 resultObject

    return resultObject;
    });
    posted on 2008-05-16 10:22 歲月如歌 閱讀(698) 評論(0)  編輯  收藏 所屬分類: spring

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲私人无码综合久久网| 永久免费AV无码网站在线观看| 久久精品国产亚洲一区二区三区| 亚洲AV无码专区在线观看成人| 午夜a级成人免费毛片| 亚洲人成自拍网站在线观看| 成人毛片18女人毛片免费视频未 | 中文无码成人免费视频在线观看| MM131亚洲国产美女久久| aa在线免费观看| 亚洲AV永久精品爱情岛论坛| 嫩草在线视频www免费观看| 亚洲国产精品第一区二区| 亚洲国产精品免费在线观看| 亚洲伊人久久大香线蕉啊| 女人张开腿给人桶免费视频| 边摸边吃奶边做爽免费视频99 | 大陆一级毛片免费视频观看 | 亚洲中文字幕丝袜制服一区| 91在线视频免费观看| 久久久久亚洲Av无码专| 免费理论片51人人看电影| 深夜免费在线视频| 亚洲久本草在线中文字幕| 日韩视频在线精品视频免费观看| 亚洲AV综合永久无码精品天堂 | 在线看片v免费观看视频777| 亚洲国产成人久久一区二区三区| 亚洲裸男gv网站| 88av免费观看入口在线| 色婷婷亚洲一区二区三区| 在线观看亚洲av每日更新| 91精品免费在线观看| 九九免费观看全部免费视频| 亚洲天堂视频在线观看| 国产成人免费a在线资源| 精品国产一区二区三区免费| 亚洲一区AV无码少妇电影| 中文亚洲AV片不卡在线观看 | 四虎影永久在线高清免费| 久艹视频在线免费观看|