spring + struts + hibernate demo

简介: 源码下载:http://download.csdn.net/download/knight_black_bob/9332831           web.xml sshdemo contextConfigLocation classpath:applicationContext.

源码下载:http://download.csdn.net/download/knight_black_bob/9332831

 

 

 



 

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	
	<display-name>sshdemo</display-name>

  	<!-- spring -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>  
	<context-param>
		<param-name>eccache</param-name>
		<param-value>ehcache.xml</param-value>
	</context-param>
	<filter>
		<filter-name>encodingFilter</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>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>*.html</url-pattern>
	</filter-mapping>  
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>  
	<!-- 防止spring内存溢出监听器 -->
	<listener>
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
	</listener>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- spring监听器,使用scrope=request 时必须加上 -->
	<listener>
		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>

	<!-- struts2 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.html</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>

	<session-config>
		<session-timeout>120</session-timeout>
	</session-config>
	<error-page>
		<error-code>401</error-code>
		<location>/error/401.jsp</location>
	</error-page>
	<error-page>
		<error-code>403</error-code>
		<location>/error/403.jsp</location>
	</error-page>
	<error-page>
		<error-code>404</error-code>
		<location>/error/404.jsp</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/error/error.jsp</location>
	</error-page>
 <welcome-file-list>
 <welcome-file>/welcome.jsp</welcome-file>
 </welcome-file-list>
	 
</web-app>

 

 

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:aop="http://www.springframework.org/schema/aop" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	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/aop  
	http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
	http://www.springframework.org/schema/tx   
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
	default-lazy-init="false">

	<!-- 导入properties -->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
			</list>
		</property>
	</bean>

	<!--数据源配置 -->
	<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">		
		<property name="driver" value="${db.driver}"/>
		<property name="driverUrl" value="${db.url}"/>
		<property name="user" value="${db.user}"/>
		<property name="password" value="${db.password}"/>
    	<!-- <property name="alias" value="${db.alias}"/> -->
    	<property name="houseKeepingTestSql" value="select 1" />
		<property name="houseKeepingSleepTime" value="90000" />
    	<property name="minimumConnectionCount" value="${db.minimumConnectionCount}"/>
    	<property name="maximumConnectionCount" value="${db.maximumConnectionCount}"/>
		<property name="maximumActiveTime" value="${db.maximumActiveTime}" />  
       	<property name="maximumConnectionLifetime" value="${db.maximumConnectionLifetime}" />
       	<property name="testBeforeUse" value="true" />    	
    	<property name="delegateProperties" value="characterEncoding=${db.characterEncoding}"/>
	</bean>

	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.MySQL5Dialect
				</prop>
				<!-- 显示运行时的sql语句 -->
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">none</prop>
				<!-- 
					设置一次最多提交的sql语句上限,Fetch Size设的越大,读数据库的次数
					越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。 
				-->
				<prop key="hibernate.jdbc.batch_size">50</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
                <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
				<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop> 
				<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> 
			</props>
	    </property>
		<property name="packagesToScan">
        	<list>
             	<value>com.baoy.cn</value>
         	</list>
        </property>
	</bean>

	<!-- 事务配置 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref local="sessionFactory"/>
		</property>
	</bean>

	<!-- 使用annotation定义事务 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>

	<context:component-scan base-package="com.baoy.cn"></context:component-scan>
 
</beans>




 

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.i18n.encoding" value="UTF-8" />
	<constant name="struts.ui.theme" value="simple" />
	<constant name="struts.multipart.maxSize" value="512102400" />  
    <constant name="struts.action.extension" value="html" />
    

	<package name="exceptionPackage" namespace="/" extends="struts-default"> 
		<interceptors> 
		    <interceptor name="authInterceptor" class="com.baoy.cn.core.AuthInterceptor"></interceptor>
			<interceptor name="trimInterceptor" class="trimInterceptor" /> 
			<interceptor name="exceptionInterceptor" class="exceptionInterceptor" />
			<interceptor-stack name="nosessionStack"> 
				<interceptor-ref name="defaultStack" /> 
			</interceptor-stack> 
		</interceptors>
        
		<default-interceptor-ref name="nosessionStack"></default-interceptor-ref> 
        <global-results> 
            <result name="login" type="redirect">/user/login.jsp</result>
            <result name="error" type="redirect">/user/error.jsp</result>
            <result name="error-500" type="redirect">/user/error.jsp</result>
        </global-results>
        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error-500"/>
        </global-exception-mappings>
	</package>
    
	 <include file="struts-*.xml"/>
    
</struts>

 

struts-action-user.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

	<package name="actionpackage" extends="exceptionPackage"
		namespace="/">
		<action name="userAction_*" class="userAction" method="{1}">
			<result name="findall" >/user/list.jsp</result>
			<result name="toadd">/user/add.jsp</result>
			<result name="adduser-error" type="redirect">/userAction_addUser.html</result>
			<result name="adduser-success" type="redirect">/userAction_findAllUser.html</result>
			<result name="deleteuser" type="redirect">/userAction_findAllUser.html</result>
			<result name="toedit">/user/edit.jsp</result>
			<result name="updateuser-error" type="redirect">/userAction_toEdit.html?id=${id}</result>
			<result name="updateuser-success" type="redirect">/userAction_findAllUser.html</result>
		</action>

	</package>

</struts>

 

jdbc.properties

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8
db.user=root
db.password=root
db.minimumConnectionCount=5
db.maximumConnectionCount=50
db.maximumActiveTime=36000000
db.maximumConnectionLifetime=36000000
db.characterEncoding=utf-8

 

UserAction

package com.baoy.cn.action;

import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller; 

import com.baoy.cn.bean.User;
import com.baoy.cn.core.BaseAction;
import com.baoy.cn.service.UserService; 

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年12月5日 下午10:34:06 
 * des:
 */
@Scope("prototype")
@Controller("userAction")
public class UserAction extends BaseAction{
	private static final long serialVersionUID = 1L;
	private static final Logger log = Logger.getLogger(UserAction.class);
	
	@Autowired
	UserService userService; 
	
	private User user;
	private int  id;
	
	
	
	//url: http://localhost:8080/sshdemo/userAction_findAllUser.html/
	public String findAllUser(){
		System.out.println("---------------");
		List<User> list= userService.findAllUsers();
		System.out.println("---------------"+list);
		log.info(list);
		getRequest().setAttribute("userList", list);
		return "findall";
	}
	
	public String toAddUser(){
		return "toadd";
	}
 
	public String addUser(){
		User auser= userService.addUser(user);
		log.info(" after add :" + auser);
		if (null == user) 
			return "adduser-error";
		return "adduser-success";
	}
	
	public String deleteUser(){
		userService.deleteUser(new User(id));
		return "deleteuser";
	}
	
	public  String toEdit(){
		User auser = userService.getUserById(new User(id));
		log.info(" to edit :" + auser);
		getRequest().setAttribute("user", auser);
		return "toedit";
	}
	
	public String editUser(){
		int i = userService.updateUser(user);
		log.info(" after edit :" + (i>=1?true: false));
		if (i>=1) {
			getRequest().setAttribute("id", user.getUserId());
			return "updateuser-error";
		}
		return "updateuser-success";
	}
	
	
	// get set
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	} 
}

 

User

package com.baoy.cn.bean;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @author baoyou E-mail:curiousby@163.com
 * @version 创建时间:2015年12月5日 下午9:54:16 des:
 */
@Entity
@Table(name = "t_user")
public class User implements Serializable {

	
	public User() {
	}
	
	public User(int userId) {
		this.userId =userId;
	}
	
	@Override
	public String toString() {
		return "User [userId=" + userId + ", userName=" + userName
				+ ", password=" + password + ", tel=" + tel + ", sex=" + sex
				+ ", description=" + description + "]";
	}

	
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "userId", unique = true, nullable = false)
	private int userId;
	
	@Column(name = "userName")
	private String userName;
	@Column(name = "password")
	private String password;
	@Column(name = "tel")
	private String tel;
	@Column(name = "sex")
	private String sex;
	@Column(name = "description")
	private String description;

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}
}

 UserService

package com.baoy.cn.service;

import java.util.List;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import com.baoy.cn.bean.User;
import com.baoy.cn.core.BaseService;

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年12月5日 下午10:21:09 
 * des:
 */
@Scope("singleton")
@Service("userService")
public interface UserService extends BaseService<User>{

	public List<User> findAllUsers();

	public User getUserById(User user);

	public User getUserByName(User user);

	public User addUser(User user);

	public int deleteUser(User user);

	public int updateUser(User user);
}

 

UserServiceImpl

package com.baoy.cn.serviceimpl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import com.baoy.cn.bean.User;
import com.baoy.cn.core.BaseServiceImpl;
import com.baoy.cn.dao.UserDao;
import com.baoy.cn.service.UserService;

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年12月5日 下午10:21:49 
 * des:
 */
@Scope("singleton")
@Service("userServiceImpl")
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {

	@Autowired
	public void setDao(UserDao dao) {
		super.setDao(dao);
	}

	public UserDao getDao() {
		return (UserDao) super.getDao();
	}
	
	
	@Override
	public List<User> findAllUsers() {
		//自己实现
		//return this.getDao().findAllUsers();  
		//框架实现
		return this.getDao().findAll();     
	}

	@Override
	public User getUserById(User user) {
		//自己实现
		//return this.getDao().getUserById(user);
		//框架实现
		return this.getDao().findUniqueByProperty("userId", user.getUserId());
	}

	@Override
	public User getUserByName(User user) {
		//自己实现
		//return this.getDao().getUserByName(user);
		//框架实现
		return this.getDao().findUniqueByProperty("userName", user.getUserName());
	}

	@Override
	public User addUser(User user) {
		//自己实现
		//return this.getDao().addUser(user);
		//框架实现
		return this.getDao().save(user);
	}

	@Override
	public int deleteUser(User user) {
		//自己实现
		//return this.getDao().deleteUser(user);
		//框架实现
		User auser =this.getDao().deleteById( (user.getUserId()));
		return 1;
	}

	@Override
	public int updateUser(User user) {
		//自己实现
		//return this.getDao().updateUser(user);
		//框架实现
		User auser= (User) this.getDao().update(user);
		return 1;
	}

	 
}

 

UserDao

package com.baoy.cn.dao;

import java.util.List;

import com.baoy.cn.bean.User;
import com.baoy.cn.core.BaseDao;

/**
 * @author baoyou E-mail:curiousby@163.com
 * @version 创建时间:2015年12月5日 下午10:05:19 des:
 */
public interface UserDao extends BaseDao<User> {

	public List<User> findAllUsers();

	public User getUserById(User user);

	public User getUserByName(User user);

	public User addUser(User user);

	public int deleteUser(User user);

	public int updateUser(User user);

}

 UserDaoImpl

package com.baoy.cn.daoimpl;

import java.util.List;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;

import com.baoy.cn.bean.User;
import com.baoy.cn.core.BaseDaoImpl;
import com.baoy.cn.dao.UserDao;

/**
 * @author baoyou  E-mail:curiousby@163.com
 * @version 创建时间:2015年12月5日 下午10:09:01 
 * des:
 */
@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{

	@SuppressWarnings("unchecked")
	@Override
	public List<User> findAllUsers() {
		Query query = this.getSession().createQuery("from User");
		return query.list();
	}

	@Override
	public User getUserById(User user) {
		Query query = this.getSession().createSQLQuery("select * from t_user where userId=:userId").addEntity(User.class);
		query.setParameter("userId", user.getUserId());
		return (User)query.uniqueResult();
	}

	@Override
	public User getUserByName(User user) {
		Query query = this.getSession().createSQLQuery("select * from t_user where userName=:userName").addEntity(User.class);
		query.setParameter("userName", user.getUserName());
		return (User)query.uniqueResult();
	}

	@Override
	public User addUser(User user) {
		return  this.save(user);
	}

	@Override
	public int deleteUser(User user) {
		String sql = "delete from t_user where userId ="+user.getUserId();
		Query query = this.getSession().createSQLQuery(sql);
		int rs = query.executeUpdate();
		return rs;
	}

	@Override
	public int updateUser(User user) {
		String sql = "update t_user set userName='"+user.getUserName()+"',password='"+user.getPassword()+"',tel='"+user.getTel()+"',sex='"+user.getSex()+"',description='"+user.getDescription()+"' where userId ="+user.getUserId();
		Query query = this.getSession().createSQLQuery(sql);
		int rs = query.executeUpdate();
		return rs;
	}

	 
}

 AuthInterceptor

package com.baoy.cn.core;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 
public class AuthInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 8514282210475728866L;
	 
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		  
		return invocation.invoke();
	}
}

 BaseAction

package com.baoy.cn.core;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 * base action
 * @author baoy
 *
 */
public class BaseAction extends ActionSupport{

	private static final long serialVersionUID = 5963166559711175502L;

	public HttpServletRequest getRequest() {
		return ServletActionContext.getRequest();
	}

	public HttpServletResponse getResponse() {
		return ServletActionContext.getResponse();
	}

	public ServletContext getContext() {
		return ServletActionContext.getServletContext();
	}

	public HttpSession getSession() {
		return getRequest().getSession();
	}
}

 BaseDao

package com.baoy.cn.core;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
/**
 * 功能说明 :提供底层数据库操作功能的DAO基类 
 * creation date: 04-09-2013
 */
public interface BaseDao<T extends Serializable> {
	/**
	 * 通过ID查找对象
	 * @param id 记录的ID
	 * @param lock 是否锁定对象
	 * @return 实体对象
	 */
	public T load(Serializable id, boolean lock);
	/**
	 * 通过ID查找对象
	 * @param id 记录的ID
	 * @return 实体对象
	 */
	public T get(Serializable id);
	/**
	 * 通过ID查找对象
	 * @param id 记录的ID
	 * @return 实体对象
	 */
	public T load(Serializable id);

	/**
	 * 查找所有对象
	 * @return 对象列表
	 */
	public List<T> findAll();
	/**
	 * 查找所有对象
	 * @param orders  查询的排序对象集
	 * @return 对象列表
	 */
	public List<T> findAll(OrderBy... orders);
	/**
	 * 按属性查找对象列表.
	 * @param property  属性名
	 * @param value  	属性值
	 */
	public List<T> findByProperty(String property, Object value);
	/**
	 * 按属性查找唯一对象.
	 * @param property  属性名
	 * @param value  	属性值
	 */
	public T findUniqueByProperty(String property, Object value);

	/**
	 * 按属性查找对象的数量
	  * @param property  属性名
	 * @param  value  	属性值
	 * @return int     对象的数量
	 */
	public int countByProperty(String property, Object value);

	/**
	 * 保存对象
	 * @param entity 实体对象
	 * @return T 实体对象
	 */
	public T save(T entity);

	/**
	 * 更新对象
	 * @param entity  实体对象
	 * @return Object 实体对象
	 */
	public Object update(Object entity);
	/**
	 * 保存集合中所有对象
	 * @param colle  实体集合
	 * @return void  
	 */
	public void saveAll(Collection<?> colle);
	/**
	 * 修改集合中所有对象
	 * @param colle  实体集合
	 * @return void  
	 */
	public void updateAll(Collection<?> colle);
	/**
	 * 保存或更新对象
	 * @param entity 实体对象
	 * @return 实体对象
	 */
	public Object saveOrUpdate(Object entity);
	/**
	 * 保存或更新集合中的所有对象
	 * @param colle 实体对象集合
	 * @return void
	 */
	public void saveOrUpdateAll(Collection<?> colle);
	/**
	 * 保存或更新对象拷贝
	 * @param entity  待合并的实例
	 * @return Object 已更新的持久化对象
	 */
	public Object merge(Object entity);
	/**
	 * 删除对象
	 * @param entity 实体对象
	 * @return void
	 */
	public void delete(Object entity);
	
	/**
	 * 删除集合中所有对象
	 * @param colle 实体对象列表
	 * @return void
	 */
	public void deleteAll(Collection<?> colle);

	/**
	 * 根据ID删除记录
	 * @param id 记录ID
	 * @return T 删除的对象
	 */
	public T deleteById(Serializable id);

	/**
	 * 刷新对象
	 * @param entity 实例对象
	 */
	public void refresh(Object entity);

	/**
	 * 获得实体Class
	 * @return Class
	 */
	public Class<T> getPersistentClass();

	/**
	 * 创建实体类的对象
	 * @return  T 泛型实例
	 */
	public T createNewEntiey();
	
}

 BaseDaoImpl

package com.baoy.cn.core;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.LockOptions;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.util.Assert;

/**
 * 功能说明 :提供底层数据库操作功能的DAO基类 
 * creation date: 04-09-2013
 */
@Repository
public abstract class BaseDaoImpl<T extends Serializable> implements BaseDao<T> {
	protected Logger log = Logger.getLogger(getClass());
	public Connection jdbcConn = null;
	public ConnectionProvider cp = null;
	protected SessionFactory sessionFactory;

	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	protected Session getSession() {
		return sessionFactory.getCurrentSession();
	}

	@SuppressWarnings("deprecation")
	public Connection getJdbcConnection() throws Exception{
		try {
			cp = ((SessionFactoryImplementor)this.sessionFactory).getConnectionProvider();
			jdbcConn = cp.getConnection();
		} catch (Exception e) {
			throw e;
		}
		return jdbcConn;
	}
	
	@SuppressWarnings("deprecation")
	public void closeJdbcConnection(Connection conn) throws Exception{
		try {
			if(null!=conn){
				if(null!=cp)
					cp = ((SessionFactoryImplementor)this.sessionFactory).getConnectionProvider();
				cp.closeConnection(conn);
			}
		} catch (Exception e) {
			throw e;
		}
	}
	
	/**
	 * 保存对象
	 * @param entity 实体对象
	 * @return T 实体对象
	 */
	public T save(T entity) {
		Assert.notNull(entity);
		getSession().save(entity);
		return entity;
	}
	
	/**
	 * 更新对象
	 * @param entity  实体对象
	 * @return Object 实体对象
	 */
	public Object update(Object entity) {
		Assert.notNull(entity);
		getSession().update(entity);
		return entity;
	}
	
	/**
	 * 修改集合中所有对象
	 * @param colle  实体集合
	 * @return void  
	 */
	public void updateAll(Collection<?> colle) {
		if (colle != null) {
			Iterator<?> it = colle.iterator();
			while (it.hasNext()) {
				update(it.next());
			}
		}
	}
	
	/**
	 * 保存或更新对象
	 * @param entity 实体对象
	 * @return 实体对象
	 */
	public Object saveOrUpdate(Object entity) {
		Assert.notNull(entity);
		getSession().saveOrUpdate(entity);
		return entity;
	}
	
	/**
	 * 保存或更新集合中的所有对象
	 * @param colle 实体对象集合
	 * @return void
	 */
	public void saveOrUpdateAll(Collection<?> colle) {
		if (colle != null) {
			Iterator<?> it = colle.iterator();
			while (it.hasNext()) {
				saveOrUpdate(it.next());
			}
		}
	}
	
	/**
	 * 保存集合中所有对象
	 * @param colle  实体集合
	 * @return void  
	 */
	public void saveAll(Collection<?> colle) {
		if (colle != null) {
			Iterator<?> it = colle.iterator();
			while (it.hasNext()) {
				getSession().save(it.next());
			}
		}
	}
	
	/**
	 * 保存或更新对象拷贝
	 * @param entity  待合并的实例
	 * @return Object 已更新的持久化对象
	 */
	public Object merge(Object entity) {
		Assert.notNull(entity);
		return getSession().merge(entity);
	}
	
	/**
	 * 删除对象
	 * @param entity 实体对象
	 * @return void
	 */
	public void delete(Object entity) {
		Assert.notNull(entity);
		getSession().delete(entity);
	}
	
	/**
	 * 删除集合中所有对象
	 * @param colle 实体对象列表
	 * @return void
	 */
	public void deleteAll(Collection<?> colle) {
		if (colle != null) {
			Iterator<?> it = colle.iterator();
			while (it.hasNext()) {
				delete(it.next());
			}
		}
	}
	
	/**
	 * 根据ID删除记录
	 * @param id 记录ID
	 * @return T 删除的对象
	 */
	public T deleteById(Serializable id) {
		Assert.notNull(id);
		T entity = load(id);
		getSession().delete(entity);
		return entity;
	}
	
	/**
	 * 通过ID查找对象
	 * @param id 记录的ID
	 * @return 实体对象
	 */
	public T load(Serializable id) {
		Assert.notNull(id);
		return load(id, false);
	}
	
	/**
	 * 通过ID查找对象
	 * @param id 记录的ID
	 * @return 实体对象
	 */
	@SuppressWarnings("unchecked")
	public T get(Serializable id) {
		Assert.notNull(id);
		return (T) getSession().get(getPersistentClass(), id);
	}
	
	/**
	 * 通过ID查找对象
	 * @param id 记录的ID
	 * @param lock 是否锁定对象
	 * @return 实体对象
	 */
	@SuppressWarnings("unchecked")
	public T load(Serializable id, boolean lock) {
		Assert.notNull(id);
		T entity = null;
		if (lock) {
			entity = (T) getSession().load(getPersistentClass(), id, LockOptions.UPGRADE);
		} else {
			entity = (T) getSession().load(getPersistentClass(), id);
		}
		return entity;
	}
	
	/**
	 * 查找所有对象
	 * @return 对象列表
	 */
	public List<T> findAll() {
		return findByCriteria();
	}
	
	/**
	 * 查找所有对象
	 * @param orders  查询的排序对象集
	 * @return 对象列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> findAll(OrderBy... orders) {
		Criteria crit = createCriteria();
		if (orders != null) {
			for (OrderBy order : orders) {
				crit.addOrder(order.getOrder());
			}
		}
		return crit.list();
	}
	
	/**
	 * 按HQL查询对象列表.
	 * @param hql hql语句
	 * @param values 数量可变的参数
	 */
	protected List<?> find(String hql, Object... values) {
		return createQuery(hql, values).list();
	}

	/**
	 * 按HQL查询唯一对象.
	 * @param hql 	   HQL查询语句
	 * @param value    参数对应的值列表
	 * @return Object  泛型实例
	 */
	protected Object findUnique(String hql, Object... values) {
		return createQuery(hql, values).uniqueResult();
	}

	/**
	 * 按属性查找对象列表.
	 * @param property 对象属性
	 * @param value    对象属性值
	 * @return List<T> 泛型实例列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByProperty(String property, Object value) {
		Assert.hasText(property);
		return createCriteria(Restrictions.eq(property, value)).list();
	}

	/**
	 * 按属性模糊查找对象列表
	 * @param property 对象属性
	 * @param value    对象属性值
	 * @return List<T> 泛型实例列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByNotNllProperty(String property,Object value) {
		Assert.hasText(property);
		return createCriteria(Restrictions.like(property, value)).list();
	}
	
	/**
	 * 按属性查找对象列表,属性必须为NOT NULL
	 * @param property 对象属性
	 * @param value    对象属性值
	 * @return List<T> 泛型实例列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByNotNllProperty(String property) {
		Assert.hasText(property);
		return createCriteria(Restrictions.isNotNull(property)).list();
	}
	
	/**
	 * 按属性查找对象列表,属性必须为NULL
	 * @param property 对象属性
	 * @param value    对象属性值
	 * @return List<T> 泛型实例列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByNllProperty(String property) {
		Assert.hasText(property);
		return createCriteria(Restrictions.isNull(property)).list();
	}
	
	/**
	 * 按属性查找对象列表,属性必须为空字符串
	 * @param property 对象属性
	 * @param value    对象属性值
	 * @return List<T> 泛型实例列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByEmptyProperty(String property) {
		Assert.hasText(property);
		return createCriteria(Restrictions.isEmpty(property)).list();
	}
	
	/**
	 * 按属性查找对象列表,属性必须为非空字符串
	 * @param property 对象属性
	 * @param value    对象属性值
	 * @return List<T> 泛型实例列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByNotEmptyProperty(String property) {
		Assert.hasText(property);
		return createCriteria(Restrictions.isNotEmpty(property)).list();
	}
	
	/**
	 * 按属性查找唯一对象
	 * @param property 对象属性
	 * @param value    对象属性值
	 */
	@SuppressWarnings("unchecked")
	public T findUniqueByProperty(String property, Object value) {
		Assert.hasText(property);
		Assert.notNull(value);
		return (T) createCriteria(Restrictions.eq(property, value)).uniqueResult();
	}
	
	/**
	 * 按属性统计对象数量
	 * @param property 对象属性
	 * @param value    对象属性值
	 */
	public int countByProperty(String property, Object value) {
		Assert.hasText(property);
		Assert.notNull(value);
		return ((Number) (createCriteria(Restrictions.eq(property, value)).setProjection(Projections.rowCount())
				.uniqueResult())).intValue();
	}

	/**
	 * 根据查询函数与参数列表创建Query对象,后续可进行更多处理,辅助函数.
	 */
	protected Query createQuery(String queryString, Object... values) {
		Assert.hasText(queryString);
		Query queryObject = getSession().createQuery(queryString);
		if (values != null) {
			for (int i = 0; i < values.length; i++) {
				queryObject.setParameter(i, values[i]);
			}
		}
		return queryObject;
	}

	/**
	 * 按Criterion查询对象列表.
	 * @param criterion 数量可变的Criterion.
	 */
	@SuppressWarnings("unchecked")
	protected List<T> findByCriteria(Criterion... criterion) {
		return createCriteria(criterion).list();
	}
	/**
	 * 刷新对象
	 * @param entity 实例对象
	 */
	public void refresh(Object entity) {
		getSession().refresh(entity);
	}

	/**
	 * 根据criterions条件创建Criteria,后续可进行更多处理,辅助函数.
	 */
	protected Criteria createCriteria(Criterion... criterions) {
		Criteria criteria = getSession().createCriteria(getPersistentClass());
		for (Criterion c : criterions) {
			criteria.add(c);
		}
		return criteria;
	}

	private Class<T> persistentClass;

	@SuppressWarnings("unchecked")
	public BaseDaoImpl() {
		this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
				.getActualTypeArguments()[0];
	}
	
	/**
	 * 获得实体Class
	 * @return Class
	 */
	public Class<T> getPersistentClass() {
		return persistentClass;
	}
	
	/**
	 * 创建实体类的对象
	 * @return  T 泛型实例
	 */
	public T createNewEntiey() {
		try {
			return getPersistentClass().newInstance();
		} catch (Exception e) {
			throw new RuntimeException("不能创建实体对象:" + getPersistentClass().getName());
		}
	}
}

 BaseService

package com.baoy.cn.core;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 功能说明 :提供底层数据库操作功能
 * 
 * @author  
 * creation date: 04-09-2013
 */
public interface BaseService<T extends Serializable> {
	public boolean isServiceReady();

	/**
	 * 通过ID查找对象
	 * 
	 * @param id
	 *            记录的ID
	 * @return 实体对象
	 */
	public T findById(Serializable id);

	/**
	 * 通过ID查找对象
	 * 
	 * @param id
	 *            记录的ID
	 * @param lock
	 *            是否锁定对象
	 * @return 实体对象
	 */
	public T load(Serializable id);

	/**
	 * 查找所有对象
	 * 
	 * @return 对象列表
	 */
	public List<T> findAll();

	/**
	 * 保存集合中所有对象
	 * 
	 * @param colle
	 *            实体集合
	 * @return void
	 */
	public T save(T entity);

	/**
	 * 更新对象
	 * 
	 * @param entity
	 *            实体对象
	 * @return Object 实体对象
	 */
	public Object update(Object o);

	/**
	 * 保存或更新对象
	 * 
	 * @param entity
	 *            实体对象
	 * @return 实体对象
	 */
	public Object saveOrUpdate(Object o);

	/**
	 * 删除对象
	 * 
	 * @param entity
	 *            实体对象
	 * @return void
	 */
	public void delete(Object o);

	/**
	 * 删除集合中所有对象
	 * 
	 * @param colle
	 *            实体对象列表
	 * @return void
	 */
	public void deleteAll(Collection<?> colle);

	/**
	 * 根据ID删除记录
	 * 
	 * @param id
	 *            记录ID
	 * @return T 删除的对象
	 */
	public T deleteById(Serializable id);

	/**
	 * 根据ID数组删除记录
	 * 
	 * @param ids
	 *            记录ID数组
	 * @return T 删除的对象列表
	 */
	public List<T> deleteById(Serializable[] ids);

	/**
	 * 刷新对象
	 * 
	 * @param entity
	 *            实例对象
	 */
	public T saveAndRefresh(T entity);
}

BaseServiceImpl

package com.baoy.cn.core;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Transactional;

/**
 * 功能说明 :提供底层数据库操作功能
 * 
 * @author 
 * creation date: 04-09-2013
 */
@Transactional
public class BaseServiceImpl<T extends Serializable> implements BaseService<T> {
	protected Logger log = Logger.getLogger(getClass());
	private BaseDao<T> dao;

	public void setDao(BaseDao<T> dao) {
		this.dao = dao;
	}

	protected BaseDao<T> getDao() {
		return this.dao;
	}

	public boolean isServiceReady() {
		return getDao() != null;
	}

	/**
	 * 通过ID查找对象
	 * 
	 * @param id
	 *            记录的ID
	 * @return 实体对象
	 */
	@Transactional(readOnly = true)
	public T findById(Serializable id) {
		try {
			return dao.get(id);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 通过ID查找对象
	 * 
	 * @param id
	 *            记录的ID
	 * @param lock
	 *            是否锁定对象
	 * @return 实体对象
	 */
	@Transactional(readOnly = true)
	public T load(Serializable id) {
		try {
			return dao.load(id);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 查找所有对象
	 * 
	 * @return 对象列表
	 */
	@Transactional(readOnly = true)
	public List<T> findAll() {
		return dao.findAll();
	}

	/**
	 * 保存对象
	 * 
	 * @param entity
	 *            实体对象
	 * @return T 实体对象
	 */
	public T save(T entity) {
		return dao.save(entity);
	}

	/**
	 * 刷新对象
	 * 
	 * @param entity
	 *            实例对象
	 */
	public T saveAndRefresh(T entity) {
		this.save(entity);
		getDao().refresh(entity);
		return entity;
	}

	/**
	 * 保存或更新对象
	 * 
	 * @param entity
	 *            实体对象
	 * @return 实体对象
	 */
	public Object saveOrUpdate(Object o) {
		return getDao().saveOrUpdate(o);
	}

	/**
	 * 删除对象
	 * 
	 * @param entity
	 *            实体对象
	 * @return void
	 */
	public void delete(Object o) {
		getDao().delete(o);
	}

	/**
	 * 删除集合中所有对象
	 * 
	 * @param colle
	 *            实体对象列表
	 * @return void
	 */
	public void deleteAll(Collection<?> colle) {
		getDao().deleteAll(colle);
	}

	/**
	 * 更新对象
	 * 
	 * @param entity
	 *            实体对象
	 * @return Object 实体对象
	 */
	public Object update(Object o) {
		return getDao().update(o);
	}

	/**
	 * 保存或更新对象拷贝
	 * 
	 * @param entity
	 *            待合并的实例
	 * @return Object 已更新的持久化对象
	 */
	public Object merge(Object o) {
		return getDao().merge(o);
	}

	/**
	 * 根据ID删除记录
	 * 
	 * @param id
	 *            记录ID
	 * @return T 删除的对象
	 */
	public T deleteById(Serializable id) {
		if (id == null) {
			return null;
		}
		return dao.deleteById(id);
	}

	/**
	 * 根据ID数组删除记录
	 * 
	 * @param ids
	 *            记录ID数组
	 * @return T 删除的对象列表
	 */
	public List<T> deleteById(Serializable[] ids) {
		List<T> dts = new ArrayList<T>();
		T del = null;
		if (ids != null && ids.length > 0) {
			for (Serializable id : ids) {
				del = deleteById(id);
				if (del != null) {
					dts.add(del);
				}
			}
		}
		return dts;
	}
}

 

OrderBy

package com.baoy.cn.core;

import java.io.Serializable;

import org.hibernate.criterion.Order;

public class OrderBy implements Serializable {
	private static final long serialVersionUID = -2898312981178692072L;
	private OrderType orderType;
	protected String field;

	protected OrderBy(String field, OrderType orderType) {
		this.field = field;
		this.orderType = orderType;
	}

	public static OrderBy asc(String field) {
		return new OrderBy(field, OrderType.ASC);
	}

	public static OrderBy desc(String field) {
		return new OrderBy(field, OrderType.DESC);
	}

	public String getField() {
		return field;
	}

	public Order getOrder() {
		Order order = null;
		if (OrderType.ASC == orderType) {
			order = Order.asc(getField());
		} else if (OrderType.DESC == orderType) {
			order = Order.desc(getField());
		}
		return order;
	}

	public static Order[] asOrders(OrderBy[] orderBys) {
		if (orderBys != null) {
			Order[] orders = new Order[orderBys.length];
			for (int i = 0; i < orderBys.length; i++) {
				orders[i] = orderBys[i].getOrder();
			}
			return orders;
		} else {
			return null;
		}

	}

	public static enum OrderType {
		ASC, DESC
	}

}

 

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="ehcache.xsd" 
         updateCheck="false" monitoring="autodetect" 
         dynamicConfig="true" name="example">    
         
    <diskStore path="java.io.tmpdir" />

    <defaultCache
        maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="60"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        /> 
</ehcache> 
 

 

ehcache.xsd

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.7">

    <xs:element name="ehcache">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="1" minOccurs="0" ref="diskStore"/>
                <xs:element maxOccurs="1" minOccurs="0" ref="sizeOfPolicy"/>
                <xs:element maxOccurs="1" minOccurs="0" ref="transactionManagerLookup"/>
                <xs:element maxOccurs="1" minOccurs="0" ref="cacheManagerEventListenerFactory"/>
                <xs:element maxOccurs="1" minOccurs="0" ref="managementRESTService"/>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="cacheManagerPeerProviderFactory"/>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="cacheManagerPeerListenerFactory"/>
                <xs:element maxOccurs="1" minOccurs="0" ref="terracottaConfig"/>
                <xs:element maxOccurs= "1" minOccurs="0" ref="defaultCache"/>
                <xs:element maxOccurs="unbounded" minOccurs="0" ref="cache"/>
            </xs:sequence>
            <xs:attribute name="name" use="optional"/>
            <xs:attribute default="true" name="updateCheck" type="xs:boolean" use="optional"/>
            <xs:attribute default="autodetect" name="monitoring" type="monitoringType" use="optional"/>
            <xs:attribute default="true" name="dynamicConfig" type="xs:boolean" use="optional"/>
            <xs:attribute default="15" name="defaultTransactionTimeoutInSeconds" type="xs:integer" use="optional"/>
            <xs:attribute default="0" name="maxBytesLocalHeap" type="memoryUnitOrPercentage" use="optional"/>
            <xs:attribute default="0" name="maxBytesLocalOffHeap" type="memoryUnit" use="optional"/>
            <xs:attribute default="0" name="maxBytesLocalDisk" type="memoryUnit" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="managementRESTService">
        <xs:complexType>
            <xs:attribute name="enabled" type="xs:boolean" use="optional"/>
            <xs:attribute name="bind" use="optional"/>
            <xs:attribute name="securityServiceLocation" use="optional"/>
            <xs:attribute name="securityServiceTimeout" use="optional" type="xs:integer"/>
            <xs:attribute name="sslEnabled" use="optional" type="xs:boolean"/>
            <xs:attribute name="needClientAuth" use="optional" type="xs:boolean"/>
            <xs:attribute name="sampleHistorySize" use="optional" type="xs:integer"/>
            <xs:attribute name="sampleIntervalSeconds" use="optional" type="xs:integer"/>
            <xs:attribute name="sampleSearchIntervalSeconds" use="optional" type="xs:integer"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="diskStore">
        <xs:complexType>
            <xs:attribute name="path" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="transactionManagerLookup">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cacheManagerEventListenerFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cacheManagerPeerProviderFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cacheManagerPeerListenerFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="terracottaConfig">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="1" minOccurs="0" name="tc-config">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute default="localhost:9510" name="url" use="optional"/>
            <xs:attribute name="rejoin" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="wanEnabledTSA" type="xs:boolean" use="optional" default="false"/>
        </xs:complexType>
    </xs:element>
    <!-- add clone support for addition of cacheExceptionHandler. Important! -->
    <xs:element name="defaultCache">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheEventListenerFactory"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheExtensionFactory"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheLoaderFactory"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheDecoratorFactory"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="pinning"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="terracotta"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriter"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="copyStrategy"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="elementValueComparator"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="sizeOfPolicy"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="persistence"/>
            </xs:sequence>
            <xs:attribute name="diskExpiryThreadIntervalSeconds" type="xs:integer" use="optional"/>
            <xs:attribute name="diskSpoolBufferSizeMB" type="xs:integer" use="optional"/>
            <xs:attribute name="diskPersistent" type="xs:boolean" use="optional"/>
            <xs:attribute name="diskAccessStripes" type="xs:integer" use="optional" default="1"/>
            <xs:attribute name="eternal" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="maxElementsInMemory" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="maxEntriesLocalHeap" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="clearOnFlush" type="xs:boolean" use="optional"/>
            <xs:attribute name="memoryStoreEvictionPolicy" type="xs:string" use="optional"/>
            <xs:attribute name="overflowToDisk" type="xs:boolean" use="optional"/>
            <xs:attribute name="timeToIdleSeconds" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="timeToLiveSeconds" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="maxElementsOnDisk" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="maxEntriesLocalDisk" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="transactionalMode" type="transactionalMode" use="optional" default="off"/>
            <xs:attribute name="statistics" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="copyOnRead" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="copyOnWrite" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="cacheLoaderTimeoutMillis" type="xs:integer" use="optional" default="0"/>
            <xs:attribute name="overflowToOffHeap" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="maxMemoryOffHeap" type="xs:string" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cache">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheEventListenerFactory"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheExtensionFactory"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheLoaderFactory"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheDecoratorFactory"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="pinning"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="terracotta"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriter"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="copyStrategy"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="searchable"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="elementValueComparator"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="sizeOfPolicy"/>
                <xs:element minOccurs="0" maxOccurs="1" ref="persistence"/>
            </xs:sequence>
            <xs:attribute name="diskExpiryThreadIntervalSeconds" type="xs:integer" use="optional"/>
            <xs:attribute name="diskSpoolBufferSizeMB" type="xs:integer" use="optional"/>
            <xs:attribute name="diskPersistent" type="xs:boolean" use="optional"/>
            <xs:attribute name="diskAccessStripes" type="xs:integer" use="optional" default="1"/>
            <xs:attribute name="eternal" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="maxElementsInMemory" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="maxEntriesLocalHeap" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="memoryStoreEvictionPolicy" type="xs:string" use="optional"/>
            <xs:attribute name="clearOnFlush" type="xs:boolean" use="optional"/>
            <xs:attribute name="name" type="xs:string" use="required"/>
            <xs:attribute name="overflowToDisk" type="xs:boolean" use="optional"/>
            <xs:attribute name="timeToIdleSeconds" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="timeToLiveSeconds" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="maxElementsOnDisk" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="maxEntriesLocalDisk" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="maxEntriesInCache" type="xs:nonNegativeInteger" use="optional"/>
            <xs:attribute name="transactionalMode" type="transactionalMode" use="optional" default="off" />
            <xs:attribute name="statistics" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="copyOnRead" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="copyOnWrite" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="logging" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="cacheLoaderTimeoutMillis" type="xs:integer" use="optional" default="0"/>
            <xs:attribute name="overflowToOffHeap" type="xs:boolean" use="optional" default="false"/>
            <xs:attribute name="maxMemoryOffHeap" type="xs:string" use="optional"/>
            <xs:attribute default="0" name="maxBytesLocalHeap" type="memoryUnitOrPercentage" use="optional"/>
            <xs:attribute default="0" name="maxBytesLocalOffHeap" type="memoryUnitOrPercentage" use="optional"/>
            <xs:attribute default="0" name="maxBytesLocalDisk" type="memoryUnitOrPercentage" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cacheEventListenerFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
            <xs:attribute name="listenFor" use="optional" type="notificationScope" default="all"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="bootstrapCacheLoaderFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cacheExtensionFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cacheExceptionHandlerFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cacheLoaderFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="cacheDecoratorFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="searchAttribute">
        <xs:complexType>
        	<xs:attribute name="name" use="required" type="xs:string" />
        	<xs:attribute name="expression" type="xs:string" />
        	<xs:attribute name="class" type="xs:string" />
        	<xs:attribute name="type" type="xs:string" use="optional"/>
        	<xs:attribute name="properties" use="optional" />
        	<xs:attribute name="propertySeparator" use="optional" />
        </xs:complexType>
    </xs:element>

    <xs:element name="searchable">
      <xs:complexType>
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="unbounded" ref="searchAttribute"/>
        </xs:sequence>
        <xs:attribute name="keys" use="optional" type="xs:boolean" default="true"/>
        <xs:attribute name="values" use="optional" type="xs:boolean" default="true"/>
      </xs:complexType>
    </xs:element>

    <xs:element name="pinning">
        <xs:complexType>
            <xs:attribute name="store" use="required" type="pinningStoreType"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="terracotta">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="1" ref="nonstop"/>
            </xs:sequence>
            <xs:attribute name="clustered" use="optional" type="xs:boolean" default="true"/>
            <xs:attribute name="coherentReads" use="optional" type="xs:boolean" default="true"/>
            <xs:attribute name="localKeyCache" use="optional" type="xs:boolean" default="false"/>
            <xs:attribute name="localKeyCacheSize" use="optional" type="xs:positiveInteger" default="300000"/>
            <xs:attribute name="orphanEviction" use="optional" type="xs:boolean" default="true"/>
            <xs:attribute name="orphanEvictionPeriod" use="optional" type="xs:positiveInteger" default="4"/>
            <xs:attribute name="copyOnRead" use="optional" type="xs:boolean" default="false"/>
            <xs:attribute name="coherent" use="optional" type="xs:boolean" default="false"/>
            <xs:attribute name="consistency" use="optional" type="consistencyType" default="eventual"/>
            <xs:attribute name="synchronousWrites" use="optional" type="xs:boolean" default="false"/>
            <xs:attribute name="concurrency" use="optional" type="xs:nonNegativeInteger" default="0"/>
            <xs:attribute name="localCacheEnabled" use="optional" type="xs:boolean" default="true"/>
            <xs:attribute name="compressionEnabled" use="optional" type="xs:boolean" default="false"/>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="consistencyType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="strong" />
            <xs:enumeration value="eventual" />
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="nonstop">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="1" ref="timeoutBehavior"/>
            </xs:sequence>
            <xs:attribute name="enabled" use="optional" type="xs:boolean" default="true"/>
            <xs:attribute name="immediateTimeout" use="optional" type="xs:boolean" default="false"/>
            <xs:attribute name="timeoutMillis" use="optional" type="xs:positiveInteger" default="30000"/>
            <xs:attribute name="searchTimeoutMillis" use="optional" type="xs:positiveInteger" default="30000"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="timeoutBehavior">
        <xs:complexType>
            <xs:attribute name="type" use="optional" type="timeoutBehaviorType" default="exception"/>
            <xs:attribute name="properties" use="optional" default=""/>
            <xs:attribute name="propertySeparator" use="optional" default=","/>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="timeoutBehaviorType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="noop" />
            <xs:enumeration value="exception" />
            <xs:enumeration value="localReads" />
            <xs:enumeration value="localReadsAndExceptionOnWrite" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="monitoringType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="autodetect"/>
            <xs:enumeration value="on"/>
            <xs:enumeration value="off"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="pinningStoreType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="localMemory" />
            <xs:enumeration value="inCache" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="terracottaCacheValueType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="serialization" />
            <xs:enumeration value="identity" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="transactionalMode">
        <xs:restriction base="xs:string">
            <xs:enumeration value="off"/>
            <xs:enumeration value="xa_strict"/>
            <xs:enumeration value="xa"/>
            <xs:enumeration value="local"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="cacheWriter">
        <xs:complexType>
            <xs:sequence >
                <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriterFactory"/>
            </xs:sequence>
            <xs:attribute name="writeMode" use="optional" type="writeModeType" default="write-through"/>
            <xs:attribute name="notifyListenersOnException" use="optional" type="xs:boolean" default="false"/>
            <xs:attribute name="minWriteDelay" use="optional" type="xs:nonNegativeInteger" default="1"/>
            <xs:attribute name="maxWriteDelay" use="optional" type="xs:nonNegativeInteger" default="1"/>
            <xs:attribute name="rateLimitPerSecond" use="optional" type="xs:nonNegativeInteger" default="0"/>
            <xs:attribute name="writeCoalescing" use="optional" type="xs:boolean" default="false"/>
            <xs:attribute name="writeBatching" use="optional" type="xs:boolean" default="false"/>
            <xs:attribute name="writeBatchSize" use="optional" type="xs:positiveInteger" default="1"/>
            <xs:attribute name="retryAttempts" use="optional" type="xs:nonNegativeInteger" default="0"/>
            <xs:attribute name="retryAttemptDelaySeconds" use="optional" type="xs:nonNegativeInteger" default="1"/>
            <xs:attribute name="writeBehindConcurrency" use="optional" type="xs:nonNegativeInteger" default="1"/>
            <xs:attribute name="writeBehindMaxQueueSize" use="optional" type="xs:nonNegativeInteger" default="0"/>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="writeModeType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="write-through" />
            <xs:enumeration value="write-behind" />
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="cacheWriterFactory">
        <xs:complexType>
            <xs:attribute name="class" use="required"/>
            <xs:attribute name="properties" use="optional"/>
            <xs:attribute name="propertySeparator" use="optional"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="copyStrategy">
        <xs:complexType>
            <xs:attribute name="class" use="required" type="xs:string" />
        </xs:complexType>
    </xs:element>

    <xs:element name="elementValueComparator">
        <xs:complexType>
            <xs:attribute name="class" use="required" type="xs:string" />
        </xs:complexType>
    </xs:element>

    <xs:element name="sizeOfPolicy">
        <xs:complexType>
            <xs:attribute name="maxDepth" use="required" type="xs:integer" />
            <xs:attribute name="maxDepthExceededBehavior" use="optional" default="continue" type="maxDepthExceededBehavior" />
        </xs:complexType>
    </xs:element>

	<xs:element name="persistence">
	    <xs:complexType>
            <xs:attribute name="strategy" use="required" type="persistenceStrategy"/>
            <xs:attribute name="synchronousWrites" use="optional" default="false" type="xs:boolean"/>
	    </xs:complexType>
	</xs:element>
	
	<xs:simpleType name="persistenceStrategy">
	    <xs:restriction base="xs:string">
	        <xs:enumeration value="localTempSwap"/>
	        <xs:enumeration value="localRestartable"/>
	        <xs:enumeration value="none"/>
	        <xs:enumeration value="distributed"/>
	    </xs:restriction>
	</xs:simpleType>
	
    <xs:simpleType name="maxDepthExceededBehavior">
        <xs:restriction base="xs:string">
            <xs:enumeration value="continue"/>
            <xs:enumeration value="abort"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="notificationScope">
        <xs:restriction base="xs:string">
            <xs:enumeration value="local"/>
            <xs:enumeration value="remote"/>
            <xs:enumeration value="all"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="memoryUnit">
        <xs:restriction base="xs:token">
            <xs:pattern value="[0-9]+[bBkKmMgG]?"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="memoryUnitOrPercentage">
        <xs:restriction base="xs:token">
            <xs:pattern value="([0-9]+[bBkKmMgG]?|100%|[0-9]{1,2}%)"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

 

 

log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

    <appender name="console" class="org.apache.log4j.ConsoleAppender" >
        <layout class="org.apache.log4j.PatternLayout" >
            <!-- Pattern to output the caller's file name and line number -->
            <param name="ConversionPattern" value="%d %p %t %c - %m%n" />
        </layout>
    </appender>

    <appender name="rollingFileSys" class="org.apache.log4j.RollingFileAppender" >
        <param name="file" value="/ylddata/log/vehiclecontrol/VehicleControl_system.log" />
        <param name="MaxFileSize" value="10MB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout" >
            <param name="ConversionPattern" value="%d %p %t %c - %m%n" />
        </layout>
    </appender>

    <appender name="rollingFile" class="org.apache.log4j.RollingFileAppender" >
        <param name="file" value="/ylddata/log/vehiclecontrol/VehicleControl.log" />
        <param name="MaxFileSize" value="10MB" />
        <param name="MaxBackupIndex" value="100" />
        <layout class="org.apache.log4j.PatternLayout" >
            <param name="ConversionPattern" value="%d %p %t %c - %m%n" />
        </layout>
    </appender>

    <logger name="com.baoy.cn" additivity="false">
         <level value="debug"/>
         <appender-ref ref="console" />
         <appender-ref ref="rollingFile" />
    </logger>
    
    <logger name="java.sql" additivity="false">
         <level value="warn"/>
         <appender-ref ref="rollingFileSys" />
    </logger>

    <logger name="com.opensymphony.xwork2" additivity="false">
         <level value="warn"/>
         <appender-ref ref="rollingFileSys" />
    </logger>

    <logger name="org.apache.struts2" additivity="false">
         <level value="warn"/>
         <appender-ref ref="rollingFileSys" />
    </logger>

    <logger name="org.apache" additivity="false">
         <level value="warn"/>
         <appender-ref ref="rollingFileSys" />
    </logger>

    <root>
        <priority value="warn" />
        <appender-ref ref="rollingFileSys" />
    </root>

</log4j:configuration>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

目录
相关文章
|
29天前
|
网络安全
ssh(Spring+Spring mvc+hibernate)——DeptDaoImpl.java
ssh(Spring+Spring mvc+hibernate)——DeptDaoImpl.java
11 0
|
29天前
|
网络安全
ssh(Spring+Spring mvc+hibernate)——BaseDaoImpl.java
ssh(Spring+Spring mvc+hibernate)——BaseDaoImpl.java
11 0
|
29天前
|
Shell
sh(Spring+Spring mvc+hibernate)——IEmpDao.java
sh(Spring+Spring mvc+hibernate)——IEmpDao.java
11 0
|
29天前
|
Shell
sh(Spring+Spring mvc+hibernate)——IDeptDao.java
sh(Spring+Spring mvc+hibernate)——IDeptDao.java
12 0
|
29天前
|
JavaScript 前端开发 Java
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Jsp页面
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Jsp页面
9 0
|
29天前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——OpSessionview实现
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——OpSessionview实现
12 0
|
29天前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码
16 0
|
29天前
|
Java
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
10 0
|
29天前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
10 0
|
29天前
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——DeptDao层代码
struts+hibernate+oracle+easyui实现lazyout组件的简单案例——DeptDao层代码
9 0