Spring MVC + Spring + Hibernate整合 Spring 3.1.1 AND Hibernate 4.1.0
1、搭建环境:推荐jar包下载地址:
search.maven.org
2、编写web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>rumourdie</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/config/spring/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>rumourdie</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/config/spring/rumourdie-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rumourdie</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 防止乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- openSessionInViewFilter开启,不开启就会抛出 no session from current thread 由session.getCurrentSession()引起-->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
2、编写Spring MVC的配置文件
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 使用该标签表示启用spring mvc 的注解功能 默认会注册支持注解的类-->
<mvc:annotation-driven/>
<!-- 自动扫描,自动进行属性注入 -->
<context:component-scan base-package="org.lxl.rumourdie" />
<!-- 声明一个视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/"
p:suffix=".jsp"/>
</beans>
3、编写Spring IOC 配置文件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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
">
<context:component-scan base-package="org.lxl.rumourdie">
</context:component-scan>
<!-- 资源文件的读取 -->
<bean class="org.lxl.rumourdie.util.encryptProperty.EncryptPropertyPlaceholderConfigurer"
p:location="classpath:config/properties/db.properties" p:fileEncoding="utf-8"/>
<!-- 数据源的设置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="maxActive" value="${maxActive}"/>
<property name="maxIdle" value="${maxIdle}"/>
<property name="maxWait" value="${maxWait}"/>
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
<property name="removeAbandoned" value="${removeAbandoned}"/>
</bean>
<!-- sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- hibernate配置 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${dialect}</prop>
<prop key="hibernate.format_sql">${format_sql}</prop>
<prop key="hibernate.show_sql">${show_sql}</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>org.lxl.rumourdie.model.entity</value>
</list>
</property>
</bean>
<!-- 开启AOP监听 只对当前配置文件有效 -->
<aop:aspectj-autoproxy expose-proxy="true"/>
<!-- 开启注解事务 只对当前配置文件有效 -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="merge*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="put*" propagation="REQUIRED" />
<tx:method name="use*" propagation="REQUIRED"/>
<!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到-->
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="count*" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" propagation="REQUIRED" read-only="true" />
<tx:method name="list*" propagation="REQUIRED" read-only="true" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config expose-proxy="true">
<!-- 只对业务逻辑层实施事务 -->
<aop:pointcut id="txPointcut" expression="execution(* org.lxl.rumourdie.model.service..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
</beans>
4、编写通用DAO(摘自
这里)
package org.lxl.rumourdie.model.dao.hibernate.generic.dao;
import java.io.Serializable;
import java.util.List;
import org.lxl.rumourdie.model.dao.hibernate.generic.dao.utils.GenericUtils;
/**
*
* @author lxl
*/
@SuppressWarnings("unchecked")
public abstract class HibernateGenericDao<T> extends HibernateDaoExtend<T> implements EntityDao<T>{
protected Class<T> entityClass;
public HibernateGenericDao(){
/**
* this.getClass()的目的是返回当前对象运行时的类
* 通过工具类GenericUtils返回泛型T的实际类对象
*/
entityClass = GenericUtils.getSuperClassGenericType(getClass());
}
public T get(Serializable id) {
return get(entityClass,id);
}
public List<T> getAll() {
return getAll(entityClass);
}
public String getIdName(Class clazz) {
return null;
}
public void removeById(Serializable id) {
removeById(entityClass,id);
}
public void save(T newInstance) {
saveOrUpdate(newInstance);
}
/**
* 查询全部,带排序
* @param orderBy
* @param isAsc
* @return
*/
public List<T> getAllByOrder(String orderBy,boolean isAsc){
return getAll(entityClass,orderBy,isAsc);
}
/**
* 根据属性名和属性值查询对象
* @param propertyName
* @param value
* @return
*/
public List<T> findBy(String propertyName,Object value){
return findBy(entityClass, propertyName, value);
}
/**
* 根据属性名和属性值进行查询对象,带排序
* @param propertyName
* @param value
* @param isAsc
* @param orderBy
* @return
*/
public List<T> findBy(String propertyName,Object value,boolean isAsc,String orderBy){
return findBy(entityClass, propertyName, value, orderBy, isAsc);
}
/**
* 根据属性名和属性值进行查询对象,返回符合条件的唯一对象。
* 如果对象不唯一将抛出异常
* @param <T>
* @param propertyName
* @param value
* @return
*/
@SuppressWarnings("hiding")
public <T> T findUniqueBy(String propertyName,Object value){
return (T) findUniqueBy(entityClass, propertyName, value);
}
}
package org.lxl.rumourdie.model.dao.hibernate.generic.dao;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.internal.CriteriaImpl;
import org.hibernate.internal.CriteriaImpl.OrderEntry;
import org.lxl.rumourdie.model.dao.hibernate.generic.dao.support.Page;
import org.lxl.rumourdie.model.dao.hibernate.generic.dao.utils.Assert;
import org.lxl.rumourdie.model.dao.hibernate.generic.dao.utils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
/**
* Dao的基类.
*
* 提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换.
* @author lxl
*/
public abstract class HibernateDaoExtend<T>{
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
@SuppressWarnings("unused")
private static final Log log = LogFactory.getLog(HibernateDaoExtend.class);
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* 获取全部的对象
* @param <T>
* @param entityClass 对象类型
* @return
*/
@SuppressWarnings({ "unchecked", "hiding" })
public <T>List<T> getAll(final Class<T> entityClass) {
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);
return criteria.list();
}
/**
* 获取全部对象,带排序功能
* @param <T>
* @param entityClass 实体对象
* @param orderBy 排序字段
* @param isAsc 升序或降序
* @return
*/
@SuppressWarnings({ "hiding", "unchecked" })
public <T> List <T> getAll(final Class<T> entityClass,final String orderBy,final boolean isAsc){
Assert.hasText(orderBy);
if (isAsc)
return sessionFactory.getCurrentSession().createCriteria(entityClass).addOrder(Order.asc(orderBy)).list();
return sessionFactory.getCurrentSession().createCriteria(entityClass).addOrder(Order.desc(orderBy)).list();
}
/**
* 保存对象
* @param newInstance
*/
public void saveOrUpdate(final T newInstance){
sessionFactory.getCurrentSession().saveOrUpdate(newInstance);
}
/**
* 删除对象
* @param transientObject
*/
public void remove(final T transientObject) {
sessionFactory.getCurrentSession().delete(transientObject);
}
/**
*
* @param entityClass
* @param id
*/
public void removeById(Class<T> entityClass, Serializable id) {
remove( get(entityClass, id));
}
/**
* 根据Id获取对象。
* @param <T>
* @param entityClass
* @param id 实体Id
* @return 实体对象
*/
@SuppressWarnings({ "hiding", "unchecked" })
public <T> T get(final Class<T> entityClass,final Serializable id) {
return (T) sessionFactory.getCurrentSession().get(entityClass, id);
}
/**
* 创建一个Query对象。
* @param hql
* @param values
* @return
*/
public Query createQuery(String hql,Object...values){
Assert.hasText(hql);
Query query = sessionFactory.getCurrentSession().createQuery(hql);
for(int i = 0;i<values.length;i++){
query.setParameter(i, values[i]);
}
return query;
}
/**
* 创建Criteria对象。
* @param <T>
* @param entityClass
* @param criterions
* @return
*/
@SuppressWarnings("hiding")
public <T>Criteria createCriteria(Class<T> entityClass,Criterion...criterions){
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(entityClass);
for(Criterion c:criterions){
criteria.add(c);
}
return criteria;
}
/**
* 创建Criteria对象,有排序功能。
* @param <T>
* @param entityClass
* @param orderBy
* @param isAsc
* @param criterions
* @return
*/
@SuppressWarnings("hiding")
public <T>Criteria createCriteria(Class<T> entityClass,String orderBy,boolean isAsc,Criterion...criterions){
Assert.hasText(orderBy);
Criteria criteria = createCriteria(entityClass,criterions);
if(isAsc){
criteria.addOrder(Order.asc(orderBy));
}else{
criteria.addOrder(Order.desc(orderBy));
}
return criteria;
}
/**
* 根据hql查询
* @param hql
* @param values
* @return
*/
public List<?> find(final String hql,final Object...values){
Assert.hasText(hql);
return createQuery(hql, values).list();
/* return (List) execute(new HibernateCallback(){
public Object doInHibernate(Session session) {
Query query = session.createQuery(hql);
for(int i = 0;i<values.length;i++){
query.setParameter(i, values[i]);
}
return query.list();
}
});*/
}
/**
* 根据属性名和属性值查询.
*
* @return
*/
@SuppressWarnings({ "unchecked", "hiding" })
public <T>List<T> findBy(Class<T> entityClass,String propertyName,Object value){
Assert.hasText(propertyName);
return createCriteria(entityClass, Restrictions.eq(propertyName, value)).list();
}
/**
* 根据属性名和属性值查询. 有排序
* @param <T>
* @param entityClass
* @param propertyName
* @param value
* @param orderBy
* @param isAsc
* @return
*/
public <T>List<T> findBy(Class<T> entityClass,String propertyName,Object value,String orderBy,boolean isAsc){
Assert.hasText(propertyName);
Assert.hasText(orderBy);
return createCriteria(entityClass, orderBy, isAsc, Restrictions.eq(propertyName, value)).list();
}
/**
* 根据属性名和属性值 查询 且要求对象唯一.
*
* @return 符合条件的唯一对象.
*/
public <T>T findUniqueBy(Class<T> entityClass,String propertyName,Object value){
Assert.hasText(propertyName);
return (T)createCriteria(entityClass, Restrictions.eq(propertyName, value)).uniqueResult();
}
/**
* 分页 通过hql进行
* @param hql
* @param pageNo
* @param pageSize
* @param values
* @return
*/
public Page pagedQuery(String hql,int pageNo,int pageSize,Object...values){
Assert.hasText(hql);
Assert.isTrue(pageNo>=1);
String countQueryString = "select count(*)" + removeSelect(removeOrders(hql));
System.out.println(countQueryString);
List countList = find(countQueryString, values);
long totalCount = (Long) countList.get(0);
System.out.println(totalCount);
if(totalCount<1){
return new Page();
}
int startIndex = Page.getStartOfPage(pageNo, pageSize);
Query query = createQuery(hql,values);
List<?> list = query.setFirstResult(startIndex).setMaxResults(pageSize).list();
return new Page(startIndex,totalCount,pageSize,list);
}
/**
* 分页 通过criteria
* @param criteria
* @param pageNo
* @param pageSize
* @return
*/
public Page pagedQuery(Criteria criteria,int pageNo,int pageSize){
Assert.notNull(criteria);
Assert.isTrue(pageNo>=1);
CriteriaImpl criteriaImpl = (CriteriaImpl) criteria;
//先把Projection和OrderBy条件取出来,清空两者来执行Count操作
Projection projection = criteriaImpl.getProjection();
List<CriteriaImpl.OrderEntry> orderEntitys = null;
try {
orderEntitys=(List<OrderEntry>) BeanUtils.forceGetProperty(criteriaImpl, "orderEntries");
BeanUtils.forceSetProperty(criteriaImpl, "orderEntries", new ArrayList());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
//取得总的数据数
long totalCount = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();
//将之前的Projection和OrderBy条件重新设回去
criteria.setProjection(projection);
if (projection == null) {
criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
}
try {
BeanUtils.forceSetProperty(criteriaImpl, "orderEntries", orderEntitys);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
if(totalCount<1)
return new Page();
int startIndex = Page.getStartOfPage(pageNo, pageSize);
List data = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
return new Page( startIndex, totalCount, pageSize, data);
}
/**
* 分页查询函数
* @param entityClass
* @param pageNo
* @param pageSize
* @param criterions
* @return
*/
public Page pagedQuery(Class<T> entityClass,int pageNo,int pageSize,Criterion...criterions){
Criteria criteria = createCriteria(entityClass, criterions);
return pagedQuery(criteria, pageNo, pageSize);
}
/**
* 分页查询带排序
* @param entityClass
* @param pageNo
* @param pageSize
* @param orderBy
* @param isAsc
* @param criterions
* @return
*/
public Page pagedQuery(Class<T> entityClass,int pageNo,int pageSize,String orderBy,boolean isAsc,Criterion...criterions){
Criteria criteria = createCriteria(entityClass, orderBy, isAsc, criterions);
return pagedQuery(criteria, pageNo, pageSize);
}
/**
* 去除hql的select子句。
* @param hql
* @return
* @see #pagedQuery(String,int,int,Object[])
*/
private static String removeSelect(String hql){
Assert.hasText(hql);
int beginPos = hql.toLowerCase().indexOf("from");
Assert.isTrue(beginPos!=-1,hql);
return hql.substring(beginPos);
}
/**
* 去除hql的orderBy子句。
* @param hql
* @return
* @see #pagedQuery(String,int,int,Object[])
*/
private static String removeOrders(String hql) {
Assert.hasText(hql);
Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(hql);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "");
}
m.appendTail(sb);
return sb.toString();
}
}
package org.lxl.rumourdie.model.dao.hibernate.generic.dao;
import java.io.Serializable;
import java.util.List;
/**
* 定义了针对单个实体的CRUD操作
* @author lxl
*/
public interface EntityDao<T> {
/**
* 根据Id查找一个类型为T的对象。
*
* @param id 传入的Id的值
* @return 一个类型为T的对象
*/
T get(Serializable id);
/**
* 获取对象的全部集合,集合中的对象为T
* @return 一组T对象的List集合
*/
List<T> getAll();
/**
* 持久化一个对象,该对象类型为T
* @param newInstance 需要持久化的对象
*/
void save(T newInstance);
/**
* 删除一个已经被持久化的对象,该对象类型为T
* @param transientObject 需要删除的持久化对象
*/
void remove(T transientObject);
/**
* 根据对象id删除一个对象,该对象类型为T
* @param id 需要删除的对象的id
*/
void removeById(Serializable id);
/**
* 获取Entity对像的主键名
* @param clazz
* @return
*/
String getIdName(Class<?> clazz);
}
5、编写实体DAO
package org.lxl.rumourdie.model.dao.impl;
import org.lxl.rumourdie.model.dao.hibernate.generic.dao.HibernateGenericDao;
import org.lxl.rumourdie.model.entity.Attention;
import org.springframework.stereotype.Repository;
/**
* @author LXL
* DateTime 2013-3-5 下午10:47:58
*/
@Repository
public class AttentionDAOImpl extends HibernateGenericDao<Attention>{
}
6、涉及到的工具类
package org.lxl.rumourdie.util.encryptProperty;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class DESUtils {
private static Key key; //存放密钥
private static String KEY_STR = "key_for_LXL"; //用该字符串生成密钥
static {
try {
//返回一个DES的密钥生成器
KeyGenerator generator = KeyGenerator.getInstance("DES");
//用指定字符串初始化密钥生成器
generator.init(new SecureRandom(KEY_STR.getBytes()));
//生成密钥
key = generator.generateKey();
generator = null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 对str进行DES加密
*
* @param str
* @return
*/
public static String getEncryptString(String str) {
BASE64Encoder base64en = new BASE64Encoder();
try {
byte[] strBytes = str.getBytes("UTF8");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptStrBytes = cipher.doFinal(strBytes); //得到加密后的字符数组
return base64en.encode(encryptStrBytes); //使用base64进行编码
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 对str进行DES解密
*
* @param str
* @return
*/
public static String getDecryptString(String str) {
BASE64Decoder base64De = new BASE64Decoder();
try {
byte[] strBytes = base64De.decodeBuffer(str); //使用base64进行解码
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptStrBytes = cipher.doFinal(strBytes); //根据密钥进行解码
return new String(decryptStrBytes, "UTF8"); //进行编码转换为字符串
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args){
if (args == null || args.length < 1) {
System.out.println("请输入要加密的字符,用空格分隔.");
} else {
for (String arg : args) {
System.out.println(arg + ":" + getEncryptString(arg));
}
}
}
}
package org.lxl.rumourdie.util.encryptProperty;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
//需要解密的属性
private String[] encryptPropNames ={"username","password"};
@Override
protected String convertProperty(String propertyName, String propertyValue) {
//如果是需要解密的属性就解密获得其值
if(isEncryptProp(propertyName)){
String decryptValue = DESUtils.getDecryptString(propertyValue);
// System.out.println(decryptValue);
return decryptValue;
}else{
return propertyValue;
}
}
/**
* 判断是否是加密的属性
* @param propertyName
* @return
*/
private boolean isEncryptProp(String propertyName){
for(String encryptPropName:encryptPropNames){
if(encryptPropName.equals(propertyName)){
return true;
}
}
return false;
}
}
7、进行简单测试
package test.dao;
import static org.junit.Assert.assertNotNull;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.unitils.UnitilsJUnit4;
import org.unitils.dbunit.annotation.DataSet;
import org.unitils.dbunit.annotation.ExpectedDataSet;
import org.unitils.spring.annotation.SpringApplicationContext;
import org.unitils.spring.annotation.SpringBeanByName;
/**
* @author LvXinLiang
* @version 创建时间:2013-3-12 上午09:16:50
*/
public class UserDAOTest extends UnitilsJUnit4{
/**
* 构建Spring IOC 容器
*/
@SpringApplicationContext({"classpath:conf/springtest-servlet.xml","classpath:conf/applicationContext.xml"})
private ClassPathXmlApplicationContext applicationContext;
/**
* 注入属性
*/
@SpringBeanByName
private UserDAO userDAO;
@Before
public void check(){
assertNotNull(applicationContext);
assertNotNull(userDAO);
}
@Test
@Ignore
public void testInsertUser() {
User user = new User("豆豆", "dou", 21);
userDAO.insertUser(user);
}
}
这样简单的 Spring3.1.1 和Hibernate4.1.0就搭建好了