Spring管理session的一些认识和用法心得

简介: 在项目开发中,使用了SSH框架集成时,多处都会用到Session。在对Session的使用维护上,有如下几种看法: 1.getCurrentSession(); 获得当前会话中的session,该session有容器自行维护管理,Spring可以代理事务。 2.this.getSession(); 从当前的执行中获得或创建一个hibernate的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。

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

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

目录
相关文章
|
3月前
|
人工智能 监控 安全
spring cloud智慧工地信息平台管理系统源码
智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最终实现项目对人、机、料、法、环的全方位实时监控。智慧工地平台支持项目级、公司级、集团级多级权限划分,可根据企业的组织架构进行项目权限、功能权限、数据权限设定。
27 1
|
4月前
|
XML Java 数据格式
④【Spring】IOC - 基于注解方式 管理bean
④【Spring】IOC - 基于注解方式 管理bean
48 0
|
4月前
|
Java 数据库 Spring
【Spring】资源操作管理:Resource、ResourceLoader、ResourceLoaderAware;
【Spring】资源操作管理:Resource、ResourceLoader、ResourceLoaderAware;
45 1
|
3月前
|
前端开发 Java 数据库
洋酒销售系统|基于Spring实现洋酒销售管理平台【论文文档+开题+PPT+讲解视频】
洋酒销售系统|基于Spring实现洋酒销售管理平台【论文文档+开题+PPT+讲解视频】
|
1月前
|
存储 负载均衡 Java
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
|
1月前
|
缓存 前端开发 Java
【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法
【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法
|
2月前
|
监控 Java 测试技术
Spring Boot和XXL-Job:高效定时任务管理
Spring Boot和XXL-Job:高效定时任务管理
57 0
|
2月前
|
XML 缓存 Java
解锁Spring Boot AOP的魔力:优雅地管理交叉关注点
解锁Spring Boot AOP的魔力:优雅地管理交叉关注点
129 0
|
3月前
|
存储 NoSQL Redis
spring-session-core排除某些接口不设置session
spring-session-core排除某些接口不设置session
34 0
|
3月前
|
Dubbo Java 应用服务中间件
如何在 Spring Boot 中制作和管理 Banner:完全指南
在 Spring Boot 应用的初启页面展示独特的ASCII艺术品能够为您的应用增添特色,并为用户或开发者提供温馨的问候。这种ASCII图案常常蕴含着项目的名称、版本信息、以及作者等重要数据。除此之外,这样的欢迎页面还起到加强品牌形象的作用。