第一个问题可以使用批查询,batch第二个问题:spring有自己的管理事务,这点很重要,我们不需要自己管理数据库的事务的

解决方案 »

  1.   

    我已经找到了這邊以一個簡單的例子來示範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; 
            });
      

  2.   

    to jFresH_MaN(TM)
    请问一下 多条update ( String sql , final Object[] args , final int[] argTypes )
    这样的语问批处理,怎么用的??谢谢