ibatis2与Spring2.5集成

代码即王道。集成方式有三种,详见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 {
	@Test
	public 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 table
create table t_user(
  id    number,
  name  varchar2(10),
  birth date
);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值