1、编写JUnit公用类:DaoBaseTestCase.java,其内容如下:
/**
* 建立时间:2011-3-19
*/
package cn.aofeng.sis.dao;
import java.util.Date;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import cn.aofeng.sis.domain.UserStatus;
import cn.aofeng.sis.domain.UserType;
/**
* DAO单元测试公用类.
*
* @author 傲风 <a href="mailto:[email protected]">[email protected]</a>
*/
public class DaoBaseTestCase extends AbstractTransactionalJUnit4SpringContextTests {
/**
* Default constructor.
*/
public DaoBaseTestCase() {
}
/**
* 向数据库插入一条账号记录.
*
* @param userId 账号ID.
* @return 插入记录成功返回1;插入记录失败返回0.
*/
public int insertUser(Long userId) {
final String sql = "insert into USER(USER_ID, USER_TYPE, USER_STATUS, USER_NAME, USER_PASSWD, CREATE_TIME, UPDATE_TIME) values(?, ?, ?, ?, ?, ?, ?)";
int result = simpleJdbcTemplate.update(sql, userId, UserType.OPERATOR, UserStatus.NORMAL, "aofeng"+userId, "aofeng", new Date(), new Date());
return result;
}
/**
* 删除指定账号ID的账号记录.
*
* @param userId 账号ID.
* @return 删除记录成功返回1;删除记录失败返回0.
*/
public int deleteUserByUserId(Long userId) {
final String sql = "delete from USER where USER_ID = ?";
int result = simpleJdbcTemplate.update(sql, userId);
return result;
}
}
2、编写UserDAOImpl的单元测试类:UserDaoImplTest,其内容如下:
/**
* 建立时间:2011-3-19
*/
package cn.aofeng.sis.dao;
import static org.junit.Assert.*;
import javax.annotation.Resource;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import cn.aofeng.sis.domain.User;
/**
* {@link cn.aofemg.sis.dao.UserDAOImpl}的单元测试代码.
*
* @author 傲风 <a href="mailto:[email protected]">[email protected]</a>
*/
@ContextConfiguration(locations={"/ApplicationContext.xml"}, inheritLocations=false)
public class UserDAOImplTest extends DaoBaseTestCase {
protected Long _userId = 1L;
@Resource(name="userDAO")
protected UserDAO _userDAO;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
int result = super.insertUser(_userId);
assertEquals(1, result);
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
@SuppressWarnings("unused")
int result = super.deleteUserByUserId(_userId);
}
/**
* Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#deleteByUserId(java.lang.Long)}.
*/
@Test
public void testDeleteByUserIdForExist() {
// 测试删除已经存在的记录.
int result = _userDAO.deleteByUserId(_userId);
assertEquals(1, result);
}
/**
* Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#deleteByUserId(java.lang.Long)}.
*/
@Test
public void testDeleteByUserIdForNotExist() {
// 测试删除不存在的记录.
int result = _userDAO.deleteByUserId(100L);
assertEquals(0, result);
}
/**
* Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#selectByUserId(java.lang.Long)}.
*/
@Test
public void testSelectByUserIdForExist() {
// 测试查询已经存在的记录
User record = _userDAO.selectByUserId(_userId);
assertNotNull(record);
assertEquals(1, record.getUserId().longValue());
assertEquals("aofeng"+_userId, record.getUserName());
}
/**
* Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#selectByUserId(java.lang.Long)}.
*/
@Test
public void testSelectByUserIdForNotExist() {
// 测试查询不存在的记录
User record = _userDAO.selectByUserId(100L);
assertNull(record);
}
/**
* Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#selectByUserName(java.lang.String)}.
*/
@Test
public void testSelectByUserNameForExist() {
// 测试查询用户名存在的记录
User record = _userDAO.selectByUserName("aofeng"+_userId);
assertNotNull(record);
assertEquals(1, record.getUserId().longValue());
assertEquals("aofeng"+_userId, record.getUserName());
}
/**
* Test method for {@link cn.aofeng.sis.dao.UserDAOImpl#selectByUserName(java.lang.String)}.
*/
@Test
public void testSelectByUserNameForNotExist() {
// 测试查询用户名不存在的记录
User record = _userDAO.selectByUserName("userNotExists");
assertNull(record);
}
}
3、运行单元测试,结果如下:
至此,完成Spring与IBatis的集成。
1、项目结构如下图所示:
2、Spring 配置文件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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<!-- 载入资源文件,下面的dataSource就引用了资源文件中的配置项 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<context:component-scan base-package="cn.aofeng.sis" />
<context:annotation-config />
<!-- 数据源配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxIdleTime" value="${maxIdleTime}"/>
<property name="maxPoolSize" value="${maxPoolSize}"/>
<property name="minPoolSize" value="${minPoolSize}"/>
<property name="initialPoolSize" value="${initialPoolSize}"/>
<property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}"/>
</bean>
<!-- IBatis ORM 操作类 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
</bean>
<!-- Spring的IBatis模板 -->
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient"></property>
</bean>
<!-- 事务管理配置 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
3、IBatis 配置文件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>
<settings cacheModelsEnabled="true" useStatementNamespaces="true"/>
<sqlMap resource ="cn/aofeng/sis/domain/USER_SqlMap.xml" />
</sqlMapConfig>
1、<context:component-scan/>说明。
<context:component-scan/> 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。
2、<context:annotationconfig/>说明。
<context:annotationconfig/> 将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。
3、<tx:annotation-driven /> 说明。
<tx:annotation-driven /> 表示使用声明式事务。如果用 'transactionManager' 来定义 PlatformTransactionManager bean的名字的话,你就可以忽略 <tx:annotation-driven/> 标签里的 'transaction-manager' 属性。 如果 PlatformTransactionManager bean你要通过其它名称来注入的话,你必须用 'transaction-manager' 属性来指定它。
见下文Spring IBatis Struts2 集成之三