ibatis2与Spring2.5集成

来源:互联网 发布:网络被挟持怎么办 编辑:程序博客网 时间:2024/05/21 07:07

代码即王道。集成方式有三种,详见JUnit4.x测试类的注释。。

首先是用到的实体类User.java

package com.jadyer.model;import java.util.Date;public class User {private Integer id;private String name;private Date birth;/*--三个属性的setter和getter略--*/public User(){}public User(Integer id, String name, Date birth){this.id = id;this.name = name;this.birth = birth;}}

相应的实体类映射文件User.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap          PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"          "http://ibatis.apache.org/dtd/sql-map-2.dtd"><sqlMap namespace="User"><typeAlias alias="user" type="com.jadyer.model.User"/><insert id="insertUser" parameterClass="user">insert into T_USER(id, name, birth) values(#id#, #name#, #birth#)</insert></sqlMap>

下面是位于CLASSPATH中的ibatis2.x的全局配置文件SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMapConfig          PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"          "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"><sqlMapConfig><!-- 使用spring之后,数据源的配置移植到了spring上,所以iBATIS本身的配置可以取消 --><sqlMap resource="com/jadyer/model/User.xml" /></sqlMapConfig>

下面是位于CLASSPATH中的Spring2.5的全局配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx   http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="oracle.jdbc.OracleDriver"/><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:jadyer"/><property name="username" value="scott"/><property name="password" value="jadyer"/></bean><bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation" value="classpath:SqlMapConfig.xml" /><property name="dataSource" ref="dataSource" /></bean><bean id="userDao" class="com.jadyer.dao.ibatis.UserDaoIbatis"><property name="sqlMapClient" ref="sqlMapClient" /></bean><!-- 声明一个事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 声明一个已被纳入事务管理的DAO接口实现类的代理类 --><bean id="userDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name="transactionManager" ref="transactionManager" /><property name="target" ref="userDao" /><property name="transactionAttributes"><props><prop key="insert*">PROPAGATION_REQUIRED</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean></beans>

用到的操纵数据库表的接口UserDao.java

package com.jadyer.dao;import java.util.List;import com.jadyer.model.User;public interface UserDao {public void insertUser(User user);/** * 批量更新 */public void batchInsertUser(final List<User> userList, final String statement);}

然后是该接口的实现类UserDaoIbatis.java


package com.jadyer.dao.ibatis;import java.sql.SQLException;import java.util.List;import org.springframework.dao.DataAccessException;import org.springframework.orm.ibatis.SqlMapClientCallback;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;import com.ibatis.sqlmap.client.SqlMapExecutor;import com.jadyer.dao.UserDao;import com.jadyer.model.User;/** * SqlMapClientDaoSupport是Spring面向ibatis2.x的辅助类,它负责调度DataSource * SqlMapClientTemplate对传统SqlMapClient调用模式进行了封装,简化了上层访问代码 * SqlMapClientTemplate能够完成ibatis操作,而DAO则通过对此类进行扩展获得上述功能 */public class UserDaoIbatis extends SqlMapClientDaoSupport implements UserDao {public void insertUser(User user) {getSqlMapClientTemplate().insert("insertUser", user);}public void batchInsertUser(final List<User> userList, final String statement) throws DataAccessException {getSqlMapClientTemplate().execute(new SqlMapClientCallback() {public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {executor.startBatch();int batch = 0;for(User user : userList){executor.update(statement, user);batch++;if(200 == batch){ //每200条批量提交一次executor.executeBatch();batch = 0;}}executor.executeBatch();return null;            }        });    }}

接着是使用了JUnit4.x的单元测试类IbatisSpringTest.java

package com.jadyer.test;import java.io.FileNotFoundException;import java.sql.Date;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.jadyer.dao.UserDao;import com.jadyer.model.User;/** * Ibatis2.x与Spring的三种集成方式 * @see ---------------------------------------------------------------------------------------------------------- * @see 第一种:将sqlMapClient注入给继承了SqlMapClientDaoSupport类的DAO接口实现类 * @see        示例代码,请见本例。并且此时不需要在DAO接口实现类中添加setSqlMapClient()方法 * @see        优点是可以直接使用Spring封装后的getSqlMapClientTemplate,缺点是不便于移植 * @see ---------------------------------------------------------------------------------------------------------- * @see 第二种:将sqlMapClient注入给未继承任何类的DAO接口实现类 * @see        此时需要在DAO接口实现类中增加setSqlMapClient(SqlMapClient sqlMapClient)方法 * @see        然后我们就可以基于原生的iBATIS API来编程,而无需对Spring产生任何依赖 * @see ---------------------------------------------------------------------------------------------------------- * @see 第三种:将sqlMapClientTemplate注入给DAO接口实现类 * @see        此时需要在DAO接口实现类中增加setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate)方法 * @see        <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate"> * @see        <property name="sqlMapClient" ref="sqlMapClient" /> * @see        </bean> * @see        <bean id="userDao" class="com.jadyer.dao.ibatis.UserDaoIbatis"> * @see        <property name="sqlMapClientTemplate" ref="sqlMapClientTemplate" /> * @see        </bean> * @see ---------------------------------------------------------------------------------------------------------- */public class IbatisSpringTest {@Testpublic void insert() throws FileNotFoundException{ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");//UserDao userDao = (UserDao)factory.getBean("userDaoProxy"); //加入事务控制UserDao userDao = (UserDao)factory.getBean("userDao");      //未加事务控制User user = new User(22, "张起灵", Date.valueOf("2011-03-26"));userDao.insertUser(user);}}

最后是用到的数据库脚本文件

-- Oracle 11g-- Create tablecreate table t_user(  id    number,  name  varchar2(10),  birth date);