Spring MVC + Spring + Hibernate整合 Spring 3.1.1 AND Hibernate 4.1.0

时间:2022-07-29 23:16:27

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就搭建好了