Struts2+spring2+hibernate3整合方案

Struts2+spring2+hibernate3整合方案
最近闲来无事可做,于是开始学习struts2。Struts2和struts1、webwork2有什么区别我也不说了,网上有很多这方面的资料。以前 在项目中从未使用过struts,一直使用spring+hibernate,现在既然学习了Struts,也不能浪费,于是乎开始琢磨着怎么整合这3个 框架。整合原理以spring为容器,管理hibernate的DAO和Struts2的Action。
一、 准备工作
Struts2.06+spring2.5+hibernate3.2+jdk6.0+myeclipse6.0+tomcat5.5+mysql5.0
以上是整合的原料。下面以一个注册登陆的例子来开始我们的整合过程。
这个例子很简单,下面是它的sql脚本内容:
CREATE TABLE `user` (
  `userid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(16) NOT NULL,
  `email` varchar(30) NOT NULL,
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
二、 开始行动
包结构可以参考下图
 
图一

 图二

图三
1) Struts部分:建立struts.xml和struts.properties
Struts.xml内容如下:

 

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"  >
< struts >
    
< package  name ="user_curd"  extends ="struts-default"   >
        
< global-results >
            
<!--  下面定义的结果对所有的Action都有效  -->
            
< result  name ="exception" > /error.jsp </ result >
        
</ global-results >

        
< global-exception-mappings >
            
<!--  指Action抛出Exception异常时,转入名为exception的结果。  -->
            
< exception-mapping  exception ="java.lang.Exception"  result ="exception" />
        
</ global-exception-mappings >

        
< action  name ="Login"  class ="LoginAction" >
            
< result  name ="success" > /success.jsp </ result >     
            
< result  name ="input" > /login.jsp </ result >
        
</ action >
        
< action  name ="Regist"  class ="RegistAction" >
            
< result  name ="success" > /success.jsp </ result >     
            
< result  name ="input" > /regist.jsp </ result >
        
</ action >
    
</ package >  
            
</ struts >


Struts.properties内容如下:

 

struts.devMode = false
struts.enable.DynamicMethodInvocation
= true
struts.i18n.reload
= true
struts.ui.theme
=xhtml

struts.locale
= zh_CN
struts.i18n.encoding
= UTF- 8
struts.objectFactory
= spring
struts.objectFactory.spring.autoWire
= name

struts.serve.static.browserCache
= false
struts.url.includeParams
= none


2) 建立User.java和User.hbm.xml、jdbc.properties:
User.java内容如下:

 

/**  
 * 
 * 
@author  <a href="mailto:flustar2008@163.com">flustar</a>
 * 
@version  1.0 
 * Creation date: Dec 23, 2007 1:55:28 PM
 
*/

package  com.firstssh.model;

import  java.io.Serializable;

public   class  User  implements  Serializable  {
    
private   int  id;
    
private  String username;
    
private  String password;
    
private  String email;

    
public   int  getId()  {
        
return  id;
    }


    
public   void  setId( int  id)  {
        
this .id  =  id;
    }


    
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 getEmail()  {
        
return  email;
    }


    
public   void  setEmail(String email)  {
        
this .email  =  email;
    }

}


User.hbm.xml内容:

 

<? xml version="1.0" ?>
<! DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
< hibernate-mapping 
    
package ="com.firstssh.model" >

    
< class  name ="User"  table ="User" >
        
< id  name ="id"  column ="userid" >
            
< generator  class ="identity"   />
        
</ id >     
        
< property  name ="username"
                  column
="username"
                  not-null
="true"
                  length
="20"
        
/>
        
< property  name ="password"
                  column
="password"
                  not-null
="true"
                  length
="16"   />
        
< property  name ="email"
                  column
="email"
                  not-null
="true"
                  length
="30" />
    
</ class >
    
</ hibernate-mapping >


jdbc.properties内容如下:

 

datasource.type = mysql
datasource.driverClassName
= com.mysql.jdbc.Driver
datasource.url
= jdbc:mysql://localhost: 3306 /test?useUnicode = true&characterEncoding = UTF- 8

datasource.username
= root
datasource.password
= 123456

datasource.maxActive
= 10
datasource.maxIdle
= 2
datasource.maxWait
= 120000
datasource.whenExhaustedAction
= 1
datasource.validationQuery
= select  1  from dual
datasource.testOnBorrow
= true
datasource.testOnReturn
= false

c3p0.acquireIncrement
= 3
c3p0.initialPoolSize
= 3
c3p0.idleConnectionTestPeriod
= 900
c3p0.minPoolSize
= 2
c3p0.maxPoolSize
= 50
c3p0.maxStatements
= 100
c3p0.numHelperThreads
= 10
c3p0.maxIdleTime
= 600

hibernate.dialect
= org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect
= org.hibernate.dialect.MySQLMyISAMDialect

hibernate.jdbc.batch_size
= 25
hibernate.jdbc.fetch_size
= 50
hibernate.show_sql
= true
hibernate.connection.release_mode
= after_transaction


3) Spirng部分:为了清晰把Spring的配置文件拆分成以下几部分applicationContext-dao.xml、 appliationContext-service.xml、applicationContext-hibernate.xml、action- servlet.xml。
applicationContext-hibernate.xml内容:

 

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >
< beans >
< bean  id ="propertyConfigurer"
    class
="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
    
< property  name ="locations" >
        
< list >
            
<!--   <value>WEB-INF/mail.properties</value> -->
            
< value > WEB-INF/jdbc.properties </ value >
            
<!--   <value>WEB-INF/oscache.properties</value> -->
        
</ list >
    
</ property >
</ bean >
<!--  MailSender used by EmailAdvice  -->
<!--
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="${mail.host}"/>
    </bean>
-->
< bean  id ="dataSource"  class ="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method
="close"  dependency-check ="none" >
    
< property  name ="driverClass" >
        
< value > ${datasource.driverClassName} </ value >
    
</ property >
    
< property  name ="jdbcUrl" >
        
< value > ${datasource.url} </ value >
    
</ property >
    
< property  name ="user" >
        
< value > ${datasource.username} </ value >
    
</ property >
    
< property  name ="password" >
        
< value > ${datasource.password} </ value >
    
</ property >
    
< property  name ="acquireIncrement" >
        
< value > ${c3p0.acquireIncrement} </ value >
    
</ property >
    
< property  name ="initialPoolSize" >
        
< value > ${c3p0.initialPoolSize} </ value >
    
</ property >
    
< property  name ="minPoolSize" >
        
< value > ${c3p0.minPoolSize} </ value >
    
</ property >
    
< property  name ="maxPoolSize" >
        
< value > ${c3p0.maxPoolSize} </ value >
    
</ property >
    
< property  name ="maxIdleTime" >
        
< value > ${c3p0.maxIdleTime} </ value >
    
</ property >
    
< property  name ="idleConnectionTestPeriod" >
        
< value > ${c3p0.idleConnectionTestPeriod} </ value >
    
</ property >
    
< property  name ="maxStatements" >
        
< value > ${c3p0.maxStatements} </ value >
    
</ property >
    
< property  name ="numHelperThreads" >
        
< value > ${c3p0.numHelperThreads} </ value >
    
</ property >
</ bean >
< bean  id ="sessionFactory"
    class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
    
< property  name ="dataSource" >
        
< ref  local ="dataSource"   />
    
</ property >
    
< property  name ="mappingResources" >
        
< list >
            
< value > com/firstssh/model/User.hbm.xml </ value >
        
</ list >
    
</ property >
    
< property  name ="hibernateProperties" >
        
< props >
            
< prop  key ="hibernate.dialect" > ${hibernate.dialect} </ prop >
            
< prop  key ="hibernate.show_sql" > ${hibernate.show_sql} </ prop >
            
< prop  key ="hibernate.jdbc.fetch_size" >
                ${hibernate.jdbc.fetch_size}
            
</ prop >
            
< prop  key ="hibernate.jdbc.batch_size" >
                ${hibernate.jdbc.batch_size}
            
</ prop >
        
</ props >
    
</ property >
</ bean >
<!--  配置事务管理器bean,使用HibernateTransactionManager事务管理器  -->
< bean  id ="transactionManager"
    class
="org.springframework.orm.hibernate3.HibernateTransactionManager" >
        
<!--  为事务管理器注入sessionFactory"  -->
        
< property  name ="sessionFactory"  ref ="sessionFactory" />
</ bean >
<!--  配置事务拦截器Bean  -->
< bean  id ="transactionInterceptor"
    class
="org.springframework.transaction.interceptor.TransactionInterceptor" >
    
<!--  为事务拦截器bean注入一个事物管理器  -->
    
< property  name ="transactionManager"  ref ="transactionManager" ></ property >
    
< property  name ="transactionAttributes" >
    
<!--  定义事务传播属性  -->
        
< props >
                
< prop  key ="insert*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="update*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="save*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="add*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="remove*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="delete*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="get*" > PROPAGATION_REQUIRED,readOnly </ prop >
                
< prop  key ="find*" > PROPAGATION_REQUIRED,readOnly </ prop >
                
< prop  key ="load*" > PROPAGATION_REQUIRED,readOnly </ prop >
                
< prop  key ="change*" > PROPAGATION_REQUIRED </ prop >
                
< prop  key ="*" > PROPAGATION_REQUIRED,readOnly </ prop >
        
</ props >
    
</ property >
</ bean >
<!--  定义BeanNameAutoProxyCreator  -->
< bean  class ="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" >
    
<!--  指定满足哪些bean自动生成业务代理  -->
    
< property  name ="beanNames" >
    
<!--  需要自动创建事务代理的bean  -->
        
< list >
            
< value > userService </ value >
        
</ list >
        
<!--  其它需要自动创建事务代理的bean  -->
    
</ property >
    
< property  name ="interceptorNames" >
        
< list >
            
< value > transactionInterceptor </ value >
            
<!--  可增加其它的interceptor  -->
        
</ list >
    
</ property >
</ bean >
</ beans >


applicationContext-dao.xml内容:

 

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >
< beans >
<!--  根DAO  -->
< bean  id ="genericDao"  class ="com.firstssh.common.dao.GenericDao" >
    
< property  name ="sessionFactory" >
        
< ref  bean ="sessionFactory"   />
    
</ property >
</ bean >
< bean  id ="userDao"  class ="com.firstssh.dao.impl.UserDao"  parent ="genericDao"   />
</ beans >


applicationContext-service.xml内容:

 

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >
< beans >
< bean  id ="userService"  class ="com.firstssh.service.impl.UserService" >
    
< property  name ="userDao" >
        
< ref  bean ="userDao" />
    
</ property >
</ bean >
< bean  id ="validateName"  class ="com.firstssh.common.Bean.ValidateName" >
    
< property  name ="userService" >
        
< ref  local ="userService" />
    
</ property >
</ bean >
</ beans >


action-servlet.xml内容:

 

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >
< beans >

    
< bean  id ="LoginAction"  class ="com.firstssh.action.LoginAction"
        scope
="prototype" >
        
< property  name ="userService"  ref ="userService"   />
    
</ bean >
    
< bean  id ="RegistAction"  class ="com.firstssh.action.RegistAction"
        scope
="prototype" >
        
< property  name ="userService"  ref ="userService"   />
    
</ bean >
</ beans >


以上几个xml文件的内容暂且不要理会,继续往下看,你就自动明白的,不用我解释。
4)日志部分:log4j.properties 、commons-logging.properties
log4j.properties内容:

 

# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!
# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
log4j.rootLogger
= INFO ,  stdout ,  logfile

log4j.appender.stdout
= org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
= org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
= %d %p  [ %c ]  - %m%n

log4j.appender.logfile
= org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File
= ${firstssh.root}/WEB-INF/logs/firstssh.log
log4j.appender.logfile.MaxFileSize
= 512KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex
= 3
# Pattern to output: date priority 
[ category ]  - message
log4j.appender.logfile.layout
= org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern
= %d %p  [ %c ]  - %m%n
# OpenSymphony Stuff
log4j.logger.com.opensymphony
= INFO
log4j.logger.org.apache.struts2
= INFO
# Spring Stuff
log4j.logger.org.springframework
= INFO
# Hibernate Stuff
log4j.logger.org.hiberante
= INFO

commons-logging.properties
内容:

org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger


5)web.xml

 

<? xml version="1.0" encoding="UTF-8" ?>
< web-app  xmlns ="http://java.sun.com/xml/ns/j2ee"  
 xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"  
 xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"  
 version
="2.4" >
 
< display-name > firstssh </ display-name >
 
< description > this is a simple example </ description >
 
< context-param >
  
< param-name > webAppRootKey </ param-name >
  
< param-value > firstssh.root </ param-value >
 
</ context-param >
 
 
< context-param >
  
< param-name > contextConfigLocation </ param-name >
  
< param-value > /WEB-INF/applicationContext-*.xml,/WEB-INF/action-servlet.xml </ param-value >
 
</ context-param >
 
< context-param >
  
< param-name > log4jConfigLocation </ param-name >
  
< param-value > /WEB-INF/log4j.properties </ param-value >
 
</ context-param >
 
< listener >
  
< listener-class > org.springframework.web.util.Log4jConfigListener </ listener-class >
 
</ listener >
 
<!--  用于初始化Spring容器的Listener  -->
    
< listener >
        
< listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >
    
</ listener >
 
 
 
<!--  定义整合SiteMesh必须的ActionContextCleanUp Filter 
 <filter>
  <filter-name>struts-cleanup</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
 </filter>
-->
 
<!--  定义Struts2的FilterDispathcer的Filter  -->
    
< filter >
        
< filter-name > struts2 </ filter-name >
        
< filter-class > org.apache.struts2.dispatcher.FilterDispatcher </ filter-class >
    
</ filter >

   
<!--    <filter-mapping>
        <filter-name>struts-cleanup</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
-->
 
<!--  FilterDispatcher用来初始化struts2并且处理所有的WEB请求。  -->
    
< filter-mapping >
        
< filter-name > struts2 </ filter-name >
        
< url-pattern > /* </ url-pattern >
    
</ filter-mapping >
    
   
<!--  这是一个产生验证码的servlet  -->
    
< servlet >
        
< servlet-name > img </ servlet-name >
        
< servlet-class > com.firstssh.servlet.AuthImg </ servlet-class >
    
</ servlet >
  
    
< servlet-mapping >
        
< servlet-name > img </ servlet-name >
     
< url-pattern > /authImg </ url-pattern >
    
</ servlet-mapping >
    
< 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 > *.action </ url-pattern >    
    
</ filter-mapping >    
    
< filter-mapping >    
        
< filter-name > encodingFilter </ filter-name >    
        
< url-pattern > *.jsp </ url-pattern >    
    
</ filter-mapping >
    
< filter >    
        
< filter-name > hibernateFilter </ filter-name >    
        
< filter-class > org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </ filter-class >    
    
</ filter >  
    
< filter-mapping >    
        
< filter-name > hibernateFilter </ filter-name >    
        
< url-pattern > *.action </ url-pattern >    
    
</ filter-mapping >  
    
    
<!--  DWR Servlet -->
  
< servlet >
    
< servlet-name > dwr-invoker </ servlet-name >
    
< servlet-class > org.directwebremoting.servlet.DwrServlet </ servlet-class >
    
< init-param >
      
< param-name > debug </ param-name >
      
< param-value > true </ param-value >
    
</ init-param >
  
</ servlet >

  
< servlet-mapping >
    
< servlet-name > dwr-invoker </ servlet-name >
    
< url-pattern > /dwr/* </ url-pattern >
  
</ servlet-mapping >
  
    
< session-config >    
        
< session-timeout > 10 </ session-timeout >    
    
</ session-config >  
    
  
< welcome-file-list >
    
< welcome-file > index.jsp </ welcome-file >
  
</ welcome-file-list >
  
< error-page >
    
< error-code > 401 </ error-code >
    
< location > /401.htm </ location >
  
</ error-page >
  
< error-page >
    
< error-code > 403 </ error-code >
    
< location > /403.htm </ location >
  
</ error-page >
  
< error-page >
    
< error-code > 404 </ error-code >
    
< location > /404.htm </ location >
  
</ error-page >
  
< error-page >
    
< error-code > 500 </ error-code >
    
< location > /500.htm </ location >
  
</ error-page >
</ web-app >

 

6)dwr.xml

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd" >

< dwr >
    
<!--  检查用户名是否存在 ValidateName的映射文件 -->
    
< allow >
      
< create   creator ="spring"  javascript ="ValidateName"   >
          
< param  name ="beanName"  value ="validateName" />
          
< include  method ="valid" />
      
</ create >
     
</ allow >
</ dwr >



三、 开始编码:
以下是DAO部分的核心代码:
IGenericDao.java内容如下:

 

/**  
 *
 * 
@author  <a href="mailto:flustar2008@163.com">flustar</a>
 * 
@version  1.0 
 * Creation date: Dec 23, 2007 6:19:21 PM
 
*/

package  com.firstssh.common.dao;

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

import  org.hibernate.LockMode;
import  org.hibernate.criterion.DetachedCriteria;
import  org.springframework.dao.DataAccessException;
import  com.firstssh.common.util.PaginationSupport;

public   interface  IGenericDao < T, ID  extends  Serializable >   {
    
public  T load(ID id)  throws  DataAccessException;

    
public  T get(ID id) throws  DataAccessException;

    
public   boolean  contains(T t)  throws  DataAccessException;

    
public   void  refresh(T t, LockMode lockMode)  throws  DataAccessException;

    
public   void  refresh(T t)  throws  DataAccessException;

    
public  Serializable save(T t)  throws  DataAccessException;

    
public   void  saveOrUpdate(T t)  throws  DataAccessException;

    
public   void  saveOrUpdateAll(Collection < T >  entities)
            
throws  DataAccessException;

    
public   void  update(T t, LockMode lockMode)  throws  DataAccessException;

    
public   void  update(T t)  throws  DataAccessException;

    
public   void  delete(T t, LockMode lockMode)  throws  DataAccessException;

    
public   void  delete(T t)  throws  DataAccessException;

    
public   void  deleteAll(Collection < T >  entities)  throws  DataAccessException;

    
public  List < T >  find(String queryString, Object value)
            
throws  DataAccessException;

    
public  List < T >  find(String queryString, Object[] values)
            
throws  DataAccessException;

    
public  List < T >  find(String queryString)  throws  DataAccessException;

    
public  List < T >  list() throws  DataAccessException;
    
    
public  List < T >  findByNamedQuery(String queryName) throws  DataAccessException ;
    
        
public  List < T >  findByNamedQuery(String queryName, Object value) throws  DataAccessException ;
    
        
public  List < T >  findByNamedQuery(String queryName, Object[] values) throws  DataAccessException ;
    

    
public  PaginationSupport findPageByCriteria(
            
final  DetachedCriteria detachedCriteria,  final   int  pageSize,
            
final   int  startIndex);

    
public  PaginationSupport findPageByQuery( final  String hql,
            
final  String countHql,  final   int  pageSize,  final   int  startIndex);

}


GenericDao.java内容如下:

/**  
 *
 * 
@author  <a href="mailto:flustar2008@163.com">flustar</a>
 * 
@version  1.0 
 * Creation date: Dec 23, 2007 11:23:56 PM
 
*/

package  com.firstssh.common.dao;

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

import  org.apache.commons.logging.Log;
import  org.apache.commons.logging.LogFactory;
import  org.hibernate.Criteria;
import  org.hibernate.HibernateException;
import  org.hibernate.LockMode;
import  org.hibernate.Query;
import  org.hibernate.Session;
import  org.hibernate.criterion.DetachedCriteria;
import  org.hibernate.criterion.Projections;
import  org.springframework.dao.DataAccessException;
import  org.springframework.orm.hibernate3.HibernateCallback;
import  org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import  com.firstssh.common.util.PaginationSupport;

@SuppressWarnings(
" unchecked " )
public   class  GenericDao < T, ID  extends  Serializable >   extends  HibernateDaoSupport
        
implements  IGenericDao < T, ID >   {
    
private  Log logger  =  LogFactory.getLog(getClass());

    
protected  Class < T >  entityClass;

    
public  GenericDao()  {

    }


    
protected  Class getEntityClass()  {
        
if  (entityClass  ==   null {
            entityClass 
=  (Class < T > ) ((ParameterizedType) getClass()
                    .getGenericSuperclass()).getActualTypeArguments()[
0 ];
            logger.debug(
" T class =  "   +  entityClass.getName());
        }

        
return  entityClass;
    }


    
public   void  saveOrUpdate(T t)  throws  DataAccessException  {
        
this .getHibernateTemplate().saveOrUpdate(t);
    }


    
public  T load(ID id)  throws  DataAccessException  {
        T load 
=  (T) getHibernateTemplate().load(getEntityClass(), id);
        
return  load;
    }


    
public  T get(ID id)  throws  DataAccessException  {
        T load 
=  (T) getHibernateTemplate().get(getEntityClass(), id);
        
return  load;
    }


    
public   boolean  contains(T t)  throws  DataAccessException  {
        
return  getHibernateTemplate().contains(t);
    }


    
public   void  delete(T t, LockMode lockMode)  throws  DataAccessException  {
        getHibernateTemplate().delete(t, lockMode);
    }


    
public   void  delete(T t)  throws  DataAccessException  {
        getHibernateTemplate().delete(t);
    }


    
public   void  deleteAll(Collection < T >  entities)  throws  DataAccessException  {
        getHibernateTemplate().deleteAll(entities);
    }


    
public  List < T >  find(String queryString, Object value)
            
throws  DataAccessException  {
        List
< T >  find  =  (List < T > ) getHibernateTemplate()
                .find(queryString, value);
        
return  find;
    }


    
public  List < T >  find(String queryString, Object[] values)
            
throws  DataAccessException  {
        List
< T >  find  =  (List < T > ) getHibernateTemplate().find(queryString,
                values);
        
return  find;
    }


    
public  List < T >  find(String queryString)  throws  DataAccessException  {
        
return  (List < T > ) getHibernateTemplate().find(queryString);
    }


    
public   void  refresh(T t, LockMode lockMode)  throws  DataAccessException  {
        getHibernateTemplate().refresh(t, lockMode);
    }


    
public   void  refresh(T t)  throws  DataAccessException  {
        getHibernateTemplate().refresh(t);
    }


    
public  Serializable save(T t)  throws  DataAccessException  {
        
return  getHibernateTemplate().save(t);
    }


    
public   void  saveOrUpdateAll(Collection < T >  entities)
            
throws  DataAccessException  {
        getHibernateTemplate().saveOrUpdateAll(entities);
    }


    
public   void  update(T t, LockMode lockMode)  throws  DataAccessException  {
        getHibernateTemplate().update(t, lockMode);
    }


    
public   void  update(T t)  throws  DataAccessException  {
        getHibernateTemplate().update(t);
    }



    
public  List < T >  list()  throws  DataAccessException  {
        
return  getHibernateTemplate().loadAll(getEntityClass());

    }


    
public  List < T >  findByNamedQuery(String queryName)
            
throws  DataAccessException  {
        
return  getHibernateTemplate().findByNamedQuery(queryName);
    }


    
public  List < T >  findByNamedQuery(String queryName, Object value)
            
throws  DataAccessException  {
        
return  getHibernateTemplate().findByNamedQuery(queryName, value);
    }


    
public  List < T >  findByNamedQuery(String queryName, Object[] values)
            
throws  DataAccessException  {
        
return  getHibernateTemplate().findByNamedQuery(queryName, values);
    }


    
public  PaginationSupport findPageByCriteria(
            
final  DetachedCriteria detachedCriteria,  final   int  pageSize,
            
final   int  startIndex)  {
        
return  (PaginationSupport) getHibernateTemplate().execute(
                
new  HibernateCallback()  {
                    
public  Object doInHibernate(Session session)
                            
throws  HibernateException  {
                        Criteria criteria 
=  detachedCriteria
                                .getExecutableCriteria(session);
                        
int  totalCount  =  ((Integer) criteria.setProjection(
                                Projections.rowCount()).uniqueResult())
                                .intValue();
                        criteria.setProjection(
null );
                        List items 
=  criteria.setFirstResult(startIndex)
                                .setMaxResults(pageSize).list();
                        PaginationSupport ps 
=   new  PaginationSupport(items,
                                totalCount, pageSize, startIndex);
                        
return  ps;
                    }

                }
true );
    }


    
public   PaginationSupport findPageByQuery(  final   String hql,  final  String countHql, final   int  pageSize, final   int  startIndex)
         
return  (PaginationSupport)getHibernateTemplate().execute( 
         
new   HibernateCallback() 
           
public   Object doInHibernate(Session session)   throws   HibernateException, SQLException 
               
int  totalCount = ((Integer) session.createQuery(countHql).iterate().next()).intValue(); 
               Query query  
=   session.createQuery(hql);
                 query.setFirstResult(startIndex); 
                 query.setMaxResults(pageSize); 
                 List items  
=  query.list();
              PaginationSupport ps 
=   new  PaginationSupport(items,
           totalCount, pageSize, startIndex);
              
return  ps;
                 
                 }
 
           }
, true ); 
      }


}


呵呵,使用了泛型,以后每建立一个Dao都要建立相应的dao接口和实现类,如本例中的IUserDao和UserDao。

 

/**  
 *
 * 
@author  <a href="mailto:flustar2008@163.com">flustar</a>
 * 
@version  1.0 
 * Creation date: Dec 24, 2007 12:47:57 AM
 
*/

package  com.firstssh.dao;

import  java.util.List;

import  com.firstssh.common.dao.IGenericDao;
import  com.firstssh.model.User;

public   interface  IUserDao  extends  IGenericDao < User, In teger>   {
    
    
public  User getUserByName(String username);

    
public  List < User >  findAllUser();

    
public  User findUserByNameAndPass(String username, String password);
}
 

 

 

/**  
 *
 * 
@author  <a href="mailto:flustar2008@163.com">flustar</a>
 * 
@version  1.0 
 * Creation date: Dec 24, 2007 12:38:48 AM
 
*/

package  com.firstssh.dao.impl;

import  java.util.List;

import  com.firstssh.common.dao.GenericDao;
import  com.firstssh.dao.IUserDao;
import  com.firstssh.model.User;

public   class  UserDao  extends  GenericDao < User,Integer >   implements  IUserDao {

    
public  List < User >  findAllUser()  {
        
        
return  (List < User > )find( " from User " );
    }


    
public  User findUserByNameAndPass(String username, String password)  {
        Object[] params
= new  Object[] {username,password} ;
        List
< User >  userList = find( " from User as user where user.username=? and user.password=?  " ,params);
        
if (userList != null && userList.size() >= 1 ) {
            
return  userList.get( 0 );
        }

        
return   null ;
    }



    
public  User getUserByName(String username)  {
        List
< User >  userList = find( " from User as user where user.username=? " ,username);
        
if (userList != null && userList.size() >= 1 ) {
            
return  userList.get( 0 );
        }

        
return   null ;
    }


}


还有好多文件的代码没有贴出来,我实在不忍心再复制、粘贴下去了(浪费大家那么多时间),有兴趣的可以下载这个例子的源代码 (由 于这个例子牵涉的jar包比较大我就不把它们放进去了),我想以上这些文件的内容我就不用解释了,因为大家都学过SSH。本人初次整合它们,并没有使用这 个整合方案做过项目,一定还有某些方面考虑的还不是太成熟,哪位大侠看了,还请多多批评指正,也希望谁有更好的整合方案,也共享一下,大家共同进步,共同 提高!~^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值