Spring IBatis Struts2 集成(包含junit)
Spring,IBatis,Hibernate等框架,同部门的另一个项目组赶进度,我们整个项目组都加入开发的行列。Spring,IBatis如何配置,如何使用等都忘光了,上网找一找资料,看看以前写的项目,花了近半天,完成了 Spring + IBatis + Struts2 的集成。好脑袋不如写博客,记录下来,备用。
集成Spring IBatis 的整个过程如下:
- 引入所有需要的*.jar文件。
- 配置web.xml。
- 配置log4j。
- 配置C3P0数据库连接池。
- 配置Spring以及与IBatis集成。
- 建立数据库表结构及其domain类和配置
- 编写dao类。
- 编写单元测试类。
一、所需类库 | Required jar list
c3p0-0.9.1.2.jar // 连接池实现类库
commons-logging-1.0.4.jar
ibatis-2.3.4.726.jar
log4j-1.2.15.jar
ojdbc14-10g.jar // Oracle JDBC驱动类库
spring-2.5.6.jar
spring-test.jar // 单元测试需要用到的类库
junit-4.4.jar // 单元测试需要用到的类库
二、配置web.xml | How to configure web.xml
1、在web.xml中增加如下内容:
<!-- 载入Spring配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:ApplicationContext.xml
</param-value>
</context-param>
<!-- Spring 监听器配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
三、配置log4j | How to configure log4j
1、在src/main/resouces 目录下建立 log4j.xml,其内容如下:
<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="sis_log_file" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="log/sis.log" />
<param name="DatePattern" value=".yyyyMMddHH" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d %p %t %C{3} %m%n" />
</layout>
</appender>
<root>
<level value="info" />
<appender-ref ref="sis_log_file" />
</root>
</log4j:configuration>
四、配置C3P0数据库连接池 | How to configure c3p0 jdbc connection pool
1、在src/main/resouces 目录下建立 jdbc.properties,其内容如下:
#c3p0 数据源配置; |
2、然后在Spring的配置ApplicationContext.xml中添加如下配置:
<!-- 载入资源文件,下面的dataSource就引用了资源文件中的配置项 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 数据源配置 -->
<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>
五、配置Spring与IBatis集成 | How to configure spring integrates with ibatis
1、在src/main/resouces 目录下建立IBatis的SQL映射配置文件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配置文件 -->
</sqlMapConfig>
2、在Spring的配置ApplicationContext.xml中添加如下配置:
<!-- 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" />
六、建立数据表结构及Domain类 | Create table and its corresponding domain class
1、测试Spring与IBatis集成的表结构如下:
create table USER
(
USER_ID NUMBER(10) not null,
USER_TYPE NUMBER(2),
USER_STATUS NUMBER(1) not null,
USER_NAME VARCHAR2(11) not null,
USER_PASSWD VARCHAR2(20) not null,
CREATE_TIME DATE not null,
UPDATE_TIME DATE not null,
LAST_LOGIN_TIME DATE
);
alter table USER
add constraint PK_USER primary key (USER_ID)
using index;
2、建立User表对应的domain类:User.java,其内容如下:
/** |
3、在与User.java的同一个package下建立User表的SqlMap映射配置文件:USER_SqlMap.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" >
<resultMap id="BaseResultMap" class="cn.aofeng.sis.domain.User" >
<result column="USER_ID" property="userId" jdbcType="DECIMAL" />
<result column="USER_TYPE" property="userType" jdbcType="DECIMAL" />
<result column="USER_STATUS" property="userStatus" jdbcType="DECIMAL" />
<result column="USER_NAME" property="userName" jdbcType="VARCHAR" />
<result column="USER_PASSWD" property="userPasswd" jdbcType="VARCHAR" />
<result column="CREATE_TIME" property="createTime" jdbcType="DATE" />
<result column="UPDATE_TIME" property="updateTime" jdbcType="DATE" />
<result column="LAST_LOGIN_TIME" property="lastLoginTime" jdbcType="DATE" />
</resultMap>
<select id="selectByUserIdOrUserName" resultMap="BaseResultMap" parameterclass="cn.aofeng.sis.domain.User" >
select USER_ID, USER_TYPE, USER_STATUS, USER_NAME, USER_PASSWD, CREATE_TIME, UPDATE_TIME,
LAST_LOGIN_TIME
from TEST_PTL_USER
<dynamic prepend=" where" >
<isNotNull prepend="or" property="userId" >
USER_ID = #userId:DECIMAL#
</isNotNull>
<isNotNull prepend="or" property="userName" >
USER_NAME= #userName:VARCHAR#
</isNotNull>
</dynamic>
</select>
<delete id="deleteByUserId" parameterclass="Long" >
delete from TEST_PTL_USER
where USER_ID = #value#
</delete>
</sqlMap>
4、在IBatis的配置文件SqlMapConfig.xml中加入USER_SqlMap.xml:
<sqlMap resource ="cn/aofeng/sis/domain/USER_SqlMap.xml" />
七、编写DAO类 | Write dao class
1、编写DAO接口类:UserDAO.java,其内容如下:
/** |
2、编写DAO实现类:UserDAOImpl.java,其内容如下:
/** |
八、编写JUnit单元测试 | Write junit testcase class
1、编写JUnit公用类:DaoBaseTestCase.java,其内容如下:
/** |
2、编写UserDAOImpl的单元测试类:UserDaoImplTest,其内容如下:
/** |
3
、运行单元测试,结果如下:
至此,完成Spring与IBatis的集成。
附录I:项目结构及完整配置 | Appendix I: Project structure and complete configuration
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>
附录II:Spring配置项说明 | Appendix II: Spring configuration items description
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' 属性来指定它。