代碼即王道。整合方式有三種,詳見JUnit4.x測試類別的注釋。。
首先是用到的實體類User.java
package com.jadyer.model;</p><p>import java.util.Date;</p><p>public class User {<br />private Integer id;<br />private String name;<br />private Date birth;</p><p>/*--三個屬性的setter和getter略--*/</p><p>public User(){}</p><p>public User(Integer id, String name, Date birth){<br />this.id = id;<br />this.name = name;<br />this.birth = birth;<br />}<br />}
相應的實體類對應檔User.xml
<?xml version="1.0" encoding="UTF-8" ?><br /><!DOCTYPE sqlMap<br /> PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"<br /> "http://ibatis.apache.org/dtd/sql-map-2.dtd"><br /><sqlMap namespace="User"><br /><typeAlias alias="user" type="com.jadyer.model.User"/></p><p><insert id="insertUser" parameterClass="user"><br />insert into T_USER(id, name, birth) values(#id#, #name#, #birth#)<br /></insert><br /></sqlMap>
下面是位於CLASSPATH中的ibatis2.x的全域設定檔SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?><br /><!DOCTYPE sqlMapConfig<br /> PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"<br /> "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"><br /><sqlMapConfig></p><p><!-- 使用spring之後,資料來源的配置移植到了spring上,所以iBATIS本身的配置可以取消 --></p><p><sqlMap resource="com/jadyer/model/User.xml" /><br /></sqlMapConfig>
下面是位於CLASSPATH中的Spring2.5的全域設定檔applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><br /><beans xmlns="http://www.springframework.org/schema/beans"<br />xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />xmlns:tx="http://www.springframework.org/schema/tx"<br />xsi:schemaLocation="http://www.springframework.org/schema/beans </p><p>http://www.springframework.org/schema/beans/spring-beans-2.5.xsd</p><p>http://www.springframework.org/schema/tx</p><p>http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"></p><p><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><br /><property name="driverClassName" value="oracle.jdbc.OracleDriver"/><br /><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:jadyer"/><br /><property name="username" value="scott"/><br /><property name="password" value="jadyer"/><br /></bean></p><p><bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><br /><property name="configLocation" value="classpath:SqlMapConfig.xml" /><br /><property name="dataSource" ref="dataSource" /><br /></bean></p><p><bean id="userDao" class="com.jadyer.dao.ibatis.UserDaoIbatis"><br /><property name="sqlMapClient" ref="sqlMapClient" /><br /></bean></p><p><!-- 聲明一個交易管理員 --><br /><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><br /><property name="dataSource" ref="dataSource" /><br /></bean><br /><!-- 聲明一個已被納入交易管理的DAO介面實作類別的代理類 --><br /><bean id="userDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><br /><property name="transactionManager" ref="transactionManager" /><br /><property name="target" ref="userDao" /><br /><property name="transactionAttributes"><br /><props><br /><prop key="insert*">PROPAGATION_REQUIRED</prop><br /><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop><br /></props><br /></property><br /></bean><br /></beans>
用到的操縱資料庫表的介面UserDao.java
package com.jadyer.dao;</p><p>import java.util.List;</p><p>import com.jadyer.model.User;</p><p>public interface UserDao {<br />public void insertUser(User user);</p><p>/**<br /> * 批次更新<br /> */<br />public void batchInsertUser(final List<User> userList, final String statement);<br />}
然後是該介面的實作類別UserDaoIbatis.java
package com.jadyer.dao.ibatis;</p><p>import java.sql.SQLException;<br />import java.util.List;</p><p>import org.springframework.dao.DataAccessException;<br />import org.springframework.orm.ibatis.SqlMapClientCallback;<br />import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;</p><p>import com.ibatis.sqlmap.client.SqlMapExecutor;<br />import com.jadyer.dao.UserDao;<br />import com.jadyer.model.User;</p><p>/**<br /> * SqlMapClientDaoSupport是Spring面向ibatis2.x的輔助類,它負責調度DataSource<br /> * SqlMapClientTemplate對傳統SqlMapClient調用模式進行了封裝,簡化了上層存取碼<br /> * SqlMapClientTemplate能夠完成ibatis操作,而DAO則通過對此類進行擴充獲得上述功能<br /> */<br />public class UserDaoIbatis extends SqlMapClientDaoSupport implements UserDao {<br />public void insertUser(User user) {<br />getSqlMapClientTemplate().insert("insertUser", user);<br />}</p><p>public void batchInsertUser(final List<User> userList, final String statement) throws DataAccessException {<br />getSqlMapClientTemplate().execute(new SqlMapClientCallback() {<br />public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {<br />executor.startBatch();<br />int batch = 0;<br />for(User user : userList){<br />executor.update(statement, user);<br />batch++;<br />if(200 == batch){ //每200條批量提交一次<br />executor.executeBatch();<br />batch = 0;<br />}<br />}<br />executor.executeBatch();<br />return null;<br /> }<br /> });<br /> }<br />}
接著是使用了JUnit4.x的單元測試類IbatisSpringTest.java
package com.jadyer.test;</p><p>import java.io.FileNotFoundException;<br />import java.sql.Date;</p><p>import org.junit.Test;<br />import org.springframework.context.ApplicationContext;<br />import org.springframework.context.support.ClassPathXmlApplicationContext;</p><p>import com.jadyer.dao.UserDao;<br />import com.jadyer.model.User;</p><p>/**<br /> * Ibatis2.x與Spring的三種整合方式<br /> * @see ----------------------------------------------------------------------------------------------------------<br /> * @see 第一種:將sqlMapClient注入給繼承了SqlMapClientDaoSupport類的DAO介面實作類別<br /> * @see 範例程式碼,請見本例。並且此時不需要在DAO介面實作類別中添加setSqlMapClient()方法<br /> * @see 優點是可以直接使用Spring封裝後的getSqlMapClientTemplate,缺點是不便於移植<br /> * @see ----------------------------------------------------------------------------------------------------------<br /> * @see 第二種:將sqlMapClient注入給未繼承任何類的DAO介面實作類別<br /> * @see 此時需要在DAO介面實作類別中增加setSqlMapClient(SqlMapClient sqlMapClient)方法<br /> * @see 然後我們就可以基於原生的iBATIS API來編程,而無需對Spring產生任何依賴<br /> * @see ----------------------------------------------------------------------------------------------------------<br /> * @see 第三種:將sqlMapClientTemplate注入給DAO介面實作類別<br /> * @see 此時需要在DAO介面實作類別中增加setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate)方法<br /> * @see <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"><br /> * @see <property name="sqlMapClient" ref="sqlMapClient" /><br /> * @see </bean><br /> * @see <bean id="userDao" class="com.jadyer.dao.ibatis.UserDaoIbatis"><br /> * @see <property name="sqlMapClientTemplate" ref="sqlMapClientTemplate" /><br /> * @see </bean><br /> * @see ----------------------------------------------------------------------------------------------------------<br /> */<br />public class IbatisSpringTest {<br />@Test<br />public void insert() throws FileNotFoundException{<br />ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");<br />//UserDao userDao = (UserDao)factory.getBean("userDaoProxy"); //加入事務控制<br />UserDao userDao = (UserDao)factory.getBean("userDao"); //未加事務控制<br />User user = new User(22, "張起靈", Date.valueOf("2011-03-26"));<br />userDao.insertUser(user);<br />}<br />}
最後是用到的資料庫指令碼檔案
-- Oracle 11g</p><p>-- Create table<br />create table t_user(<br /> id number,<br /> name varchar2(10),<br /> birth date<br />);