上一篇给大家分享了《Sping入门》的一些知识,这篇文章分享spring如何整合hibernate和Struts。

Spring整合hibernate

整合hibernate的思想

  • dao
  • service:控制事务

    整合的步骤

  1. 加入Spring的支持

  2. 加入hibernate的支持,最好是将hibernate的配置信息放在applicationContext.xml中

  3. 如果使用的是myeclipse2014,生成的数据源中缺少driverClassName的配置,自己加上即可

  4. 在配置文件中,生成了四个bean,分别是:数据库连接池    Session工厂    定义事物管理器对象     使用事物驱动的Annotation注解

    注:在数据库连接池的数据库连接字符串后面记得加上字符转码

       <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"></property>
  5. 编写PO,HBM及DAO;如果使用生成的DAO,将@TRANSACTION去掉,不要在DAO中控制事务

  6. 编写Service接口,在接口中控制事务,可以在接口或接口的方法中增加@Transtraction

  7. 编写service实现类;在service实现类中注入dao;

    事务:transaction

  • 事务是用户自定义的一个操作序列,是一个最小的执行单元,不能再分

    自定义Dao(推荐使用的方法)

  • BaseDao:所有Dao中实现的方法,是个接口
  • BaseDaoImpl:具体实现
  • XXXDaoImp:具体实体类的dao;

    整合struts2

  1. 在web.xml中增加一个监听器,这个监听器再启动工程时加载applicationContext.xml配置文件;
  2. 并将此BeanFactory存储到Application作用于对象中;
  3. 增加一个struts-spring-plugin.jar的插件;
  4. 在struts.xml配置文件中配置action时,class属性的值应该是由spring创建的Action实例

    解决hibernate的懒加载

  • 将lazy改成false:每次代码执行时,自动将数据库所有数据加载到对象,不管需不需要使用,效率慢。
  • 可以采用迫切左外连语句
  • 延迟session的关闭时间(jsp显示完毕后才关闭)

    通过OpenSessionInView的过滤器来实现,在web.xml中配置,配置时,应该放在第一个Filter的位置上;

          <filter>
              <filter-name>openSession</filter-name>
         <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
          </filter>
          <filter-mapping>
              <filter-name>openSession</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>

分页实现

      1.sql语句;
            查询当前页的数据库的分页sql;在hibernate中可以使用setMaxResult,setFristResult两个方法来进行设置;
            查询总记录数;
        //分页
        @Override
        public void getAll(Class<T> clazz, PageInfo info) {
            //设置总记录数
            info.setRecordCount(this.getCount(clazz));
            //设置总页数
            info.setPageCount( info.getRecordCount()%info.getPageSize()==0 ? 
            info.getRecordCount()/info.getPageSize() : info.getRecordCount()/info.getPageSize()+1 );
            Criteria c =  this.getSession().createCriteria(clazz);
            //每页的记录数
            c.setMaxResults(info.getPageSize());
            c.setFirstResult((info.getCurrentPage()-1)*info.getPageSize());
            //查询,并将查询结果赋给info
            info.setList(c.list());
        }
        2.封装分页信息;
            PageInfo;
                action;总记录数,总页数;当前页号,当页的数据;等
        3.将页面封装起来;
            @include
            @自定义标记;
        eg:<%@ include file="subPage.jsp" %>
实例代码下载

往期精彩文章