zoukankan      html  css  js  c++  java
  • Spring session

    在项目开发中,使用了SSH框架集成时,多处都会用到Session。在对Session的使用维护上,有如下几种看法:
    1.getCurrentSession(); 
    获得当前会话中的session,该session有容器自行维护管理,Spring可以代理事务。
    2.this.getSession();
    从当前的执行中获得或创建一个hibernate的session对象,需要自己手动关闭,以释放连接资源。
    3.openSession();
    调用函数自行创建一个数据库的连接,并将其打开,在使用Spring操作非查询语句的请况下,Spring的事务对该session对象不起到事务管理的作用,所以该session对象应当由程序员自己关闭,释放连接资源。

    以上三种操作session的方式,我们都离不开这样的操作主线:

    打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个Session。

    如果我们自己只专注于业务,不想去作这些重复而繁琐的操作,那这样的一套操作对我们来讲太繁琐了!

    相信任何一个程序员,都不想重复敲着那一遍又一遍雷同的代码!


    在Spring的框架中,HibernateTemplate包装了Hibernate的代码,提供了相当多有用的辅助功能。Spring的HibernateTemplate可以帮我们完成这样的工作,使用声明式的配置来实现这样的功能。既然使用了SSH集成,那就要充分利用好Spring的这个功能吧,当然如果你还担心spring到底有没有关闭session的话,不妨看看这个文章:【那个看起来有点2但不2的程序员做的一件事:验证HibernateTemplate有没有关闭session:http://songzj.iteye.com/blog/766148】


    但是如果我们非得使用session来完成业务而又不想去管事务上的事,那就意味着我们放弃了上面所说的一切好处!

    Spring,她依然可以帮我们完成这种有点BT的需求。


    HibernateTemplate提供HibernateCallback,就是为了满足这种使用了HibernateTemplate的情况下,仍然需要直接访问Session的需求而来的。它提供了在HibernateTemplate里面直接访问Session的能力,程序员不必人为的管理session对象(这个就是使用HibernateCallback的原因http://blog.163.com/yeyhan/blog/static/44179333201022942856795/)。

    首先,应该确保我们的DAO已经继承了HibernateDaoSupport。

    于是,如果我们可以参考如下形式书写:

    [java] view plaincopy
    1. @SuppressWarnings("unchecked")  
    2.     public Page queryData(final String countSql, final String resultSql,  
    3.             final int startIndex, final int pageSize, final long total) {  
    4.         Page result = (Page) getHibernateTemplate().execute(  
    5.                 new HibernateCallback() {  
    6.                     public Object doInHibernate(Session session)  
    7.                             throws HibernateException, SQLException {  
    8.                         long totalCount = 0;  
    9.                         if (total < 0) {  
    10.                             List countlist = session.createSQLQuery(countSql)  
    11.                                     .list();  
    12.                             totalCount += Long.parseLong(countlist.get(0)  
    13.                                     .toString());  
    14.                         } else {  
    15.                             totalCount = total;  
    16.                         }  
    17.   
    18.                         if (totalCount < 1) {  
    19.                             return new Page();  
    20.                         }  
    21.   
    22.                         // 实际查询返回分页对象  
    23.                         Query query = session  
    24.                                 .createSQLQuery(resultSql)  
    25.                                 .addScalar("carLsh", Hibernate.INTEGER)  
    26.                                 .addScalar("carPic", Hibernate.STRING)  
    27.                                 .addScalar("carInfo", Hibernate.STRING)  
    28.                                 .addScalar("carColor", Hibernate.STRING)  
    29.                                 .addScalar("carType", Hibernate.STRING)  
    30.                                 .setResultTransformer(  
    31.                                         Transformers.aliasToBean(CarInfo.class));  
    32.   
    33.                         if (pageSize > 0) {  
    34.                             if (startIndex < 0) {  
    35.                                 query.setFirstResult(0);  
    36.                             } else if (startIndex >= totalCount) {  
    37.                                 return new Page();  
    38.                             } else {  
    39.                                 query.setFirstResult(startIndex);  
    40.                             }  
    41.   
    42.                             if (startIndex + pageSize > totalCount) {  
    43.                                 query.setMaxResults((int) totalCount  
    44.                                         - startIndex);  
    45.                             } else {  
    46.                                 query.setMaxResults(pageSize);  
    47.                             }  
    48.   
    49.                         }  
    50.                         return new Page(startIndex, totalCount, pageSize, query  
    51.                                 .list());  
    52.                     }  
    53.                 });  
    54.         return result;  
    55.     }  
  • 相关阅读:
    PHP输出中文乱码的问题(转)
    phpmyadmin导出数据库为什么是php文件
    phpmyadmin登陆提示#2002 无法登录 MySQL 服务器和设置自增
    phpMyAdmin配置及 错误 缺少 mysqli 扩展。请检查 PHP 配置
    利用eclipse开发php<转>
    apache 2.4 You don't have permission to access / on this server
    (转)如果“打开方式”里面没有想要的打开方式,怎样创建一种文件打开方式?
    (转)安装 Apache 出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试
    关于ISAPI和CGI限制,这个要设为允许
    Sqlserver数据库日志太大如何快速删除
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314258.html
Copyright © 2011-2022 走看看