• SSH2整合(转载)


    本文转载自:http://www.blogjava.net/flustar/archive/2007/12/26/ssha.html 

    鸣谢:蝸ゼ牜ご赽跑

    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, Integer> {

    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;
    }

    }

    http://www.blogjava.net/Files/flustar/firstssh.rar

  • 相关阅读:
    了解NoSQL的必读资料
    SQLServer 事务、锁、阻塞
    蔡康永的说话之道
    SQL Server System Functions
    dotNet 框架程序设计 读书笔记
    SQLServer 2005 Inside Query
    学习心得LINQ to XML
    Web Service 实例
    用JAXRPC开发Web服务: Servlet作为Web服务端点
    JAVA学习推荐
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/2070666.html
Copyright © 2020-2023  润新知