在项目开发中,使用了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 plaincopyprint?
  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. if (totalCount < 1) {
  18. return new Page();
  19. }
  20. // 实际查询返回分页对象
  21. Query query = session
  22. .createSQLQuery(resultSql)
  23. .addScalar("carLsh", Hibernate.INTEGER)
  24. .addScalar("carPic", Hibernate.STRING)
  25. .addScalar("carInfo", Hibernate.STRING)
  26. .addScalar("carColor", Hibernate.STRING)
  27. .addScalar("carType", Hibernate.STRING)
  28. .setResultTransformer(
  29. Transformers.aliasToBean(CarInfo.class));
  30. if (pageSize > 0) {
  31. if (startIndex < 0) {
  32. query.setFirstResult(0);
  33. } else if (startIndex >= totalCount) {
  34. return new Page();
  35. } else {
  36. query.setFirstResult(startIndex);
  37. }
  38. if (startIndex + pageSize > totalCount) {
  39. query.setMaxResults((int) totalCount
  40. - startIndex);
  41. } else {
  42. query.setMaxResults(pageSize);
  43. }
  44. }
  45. return new Page(startIndex, totalCount, pageSize, query
  46. .list());
  47. }
  48. });
  49. return result;
  50. }

Spring管理session的一些认识和用法心得相关推荐

  1. spring对session和事务的管理以及OpenSessionInViewFilter是如何工作

    2019独角兽企业重金招聘Python工程师标准>>> 为了弄清楚spring对session和事务的管理以及OpenSessionInViewFilter是如何工作的,可监控以下类 ...

  2. hibernate 管理 Session(单独使用session,非spring)

    hibernate 管理 Session(单独使用session,非spring) Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 S ...

  3. hibernate java内存一次能取多少条_Hibernate管理Session和批量操作分析

    本文详细分析了Hibernate管理Session和批量操作的用法.分享给大家供大家参考.具体分析如下: Hibernate管理Session Hibernate自身提供了三种管理Session对象的 ...

  4. Spring管理的交易说明-第2部分(JPA)

    在本系列的第一部分中 ,我展示了事务如何在普通JDBC中工作 . 然后,我展示了Spring如何管理基于JDBC的事务. 在本系列的第二部分中,我将首先展示事务如何在普通的JPA中工作. 然后展示Sp ...

  5. (转)配置Spring管理的bean的作用域

    http://blog.csdn.net/yerenyuan_pku/article/details/52833477 Spring管理的bean的作用域有: singleton  在每个Spring ...

  6. Spring管理Hibernate

    为什么要用Hibernate框架? 既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢? 首先我们来看一下Hibernate进行操作的步骤.比如添 ...

  7. Spring-Session基于Redis管理Session

    2019独角兽企业重金招聘Python工程师标准>>> 系列文章 Nginx+Tomcat关于Session的管理 Tomcat Session管理分析 Spring-Session ...

  8. spring学习之将类交给spring管理,bean的注入,scope,集合注入,自动装配,生命周期,迟加载

    一.将类交给spring管理(IOC) 1.将类交给spring容器管理 如何将一个类交给spring容器进行管理呢? 方法很简单,只需要在applicationContext.xml中加入对应的xm ...

  9. 把对象交给spring管理的3种方法及经典应用

    背景 先说一说什么叫把对象交给spring管理.它区别于把类交给spring管理.在spring里采用注解方式@Service.@Component这些,实际上管理的是类,把这些类交给spring来负 ...

最新文章

  1. angular-fullstack test
  2. Android学习笔记进阶十三获得本地全部照片
  3. struts2 页面取值_struts2.1如何在页面上取值?
  4. Vmware Vsphere虚拟化技术:6.7新特性介绍
  5. Citrix无法访问本地磁盘
  6. HTML5 API详解(3):为何网页上要增加Battery电池状态API
  7. 系统性能指标、压测、性能优化思路
  8. html中的空格表示
  9. 芯片5nm和7nm有什么差别?CPU已经很小了,可以做大点吗?
  10. Vsphere日记01.ESXi5.5.install
  11. android 切换主题介绍一
  12. java url解码_如何从REST WebService 调用中解码路径参数
  13. cfupload java_java的web项目上传文件和下载
  14. 计算机显示10的负次方,我输入10的9次方在EXCEL里,为什么总变成日期了?怎么办/excel10的负次方怎么打...
  15. 腾讯力作!iOS 9 人机界面指南(5):图标与图形设计
  16. Python利用requests库爬取百度文库文章
  17. 数据库update和alter之间的区别
  18. NOIP总结与反思及对今后的期望
  19. ecshop后台首页mysql_ECSHOP后台自带数据库管理
  20. uibot和按键精灵区别_uibot和按键精灵有什么区别?

热门文章

  1. Spring IoC 源码系列(一)BeanDefinition 初始化与注册
  2. VTK:图像平移范围用法实战
  3. boost::spirit::multi_pass相关的测试程序
  4. boost::safe_numerics模块实现相等的constexpr的测试程序
  5. boost::qvm::deduce_scalar相关的测试程序
  6. boost::python::back_reference相关的测试程序
  7. boost::proto模块实现在外部指定转换的示例的测试程序
  8. boost::mp11::mp_partition_q相关用法的测试程序
  9. allocator_difference_type的实例
  10. Boost:在向量中打印值