首先,讲一个悲伤的故事。。。

有一天,一个以为自己javaEE很叼的程序员,在经历了好久不写java代码的情况下,去参加阿里巴巴的java面试,然后,在被问到一个很简单的问题的时候,结果没有回答好。那么接下来先说说这个问题吧。。。

问:hibernate的sessionfactory是干嘛的?session又是干嘛的呢?

那么,你会吗?可以讲清楚么?如果答案是会,可以,那么你就不用往下看了。。。。如果会还是想往下看,那么,

你就看呗。

在回答这个问题之前,先来看看一些概念。

一、hibernate是什么?

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。----百度百科

其实我自己的理解是,使用hibernate,最常用的场景是,使用它的ORM机制,然后把传统的关系型数据库操作,转换为面向对象的方式来操作。为什么这么做呢?在没有使用到ORM之前。一个简单的例子,你在表单上,填了好多个数据,姓名,性别,年龄。。。。。爱好等等等,然后你使用JDBC去连接数据库,接下来一条一条的把数据从request或者某个地方读进来,如果有100个,表示需要定义100个变量来暂存这些表单数据,然后在保存到数据库中,在保存的时候,也要一下下的写sql语句,再次传100个值。。。如果是1000个。。想想就好累,我现在某个公司,学习使用PHP,存储数据的时候,就是这样一下下来,心好累。

那么如果有了ORM,是什么情况,你只要把对应的数据库的表,映射为一个对象(比如student)。然后在表单对应的input的name上,填写对应对象的对应属性(比如student.name),然后在保存的时候,在提交到的Action中,定义一个student的对象实例,那么这些数据就会自动保存在这个对象中了(我用了Struts2,不扯这个,只是说明效率)。接下来,你只需要保存一下这个对象就ok了。是不是感觉方便了好多。

二、什么是sessionfactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。----百度百科

我的理解是,其实顾名思义,sessionfactory,就是用来创建session会话(具体接下来讲)的工厂。想想有一个特别大的工厂,专门用来在你需要使用session的时候,让它帮你创建一个就好了。(突然记起来一个冷笑话,如果你没有对象怎么办?办法是,new一个出来呗。。额你没有笑,我知道)。但是需要注意一下就是,一般来讲,一个web工程(系统),如果涉及到的是一个数据库(你在学校做项目,一般就一个吧。。。哈哈哈),那么本工程就只需要一个sessionfactory就够了。这个工程所涉及到的所有的session,都交由这个sessionfactory来管理。

接下来,创建一个sessionfactory,一般有两种创建方式,1.从XML文件读取配置信息构建SessionFactory,2.从Java属性文件读取配置信息构建SessionFactory(这个不熟悉,没怎用,不好意思)。

第一种:

1》实例化Configuration对象,默认读取src目录下的hibernate.cfg.xml,配置文件

<span style="font-size:18px;">Configuration config = new Configuration().configure();</span>
或者在configure();中指明文件名称和路径
<span style="font-size:24px;">Configuration config = new Configuration().configure("hibernate.cfg.xml");</span>

2》现在这个config对象,已经包括所有Hibernate运行期的参数,通过Configuration实例的buildSessionFactory()方法可以构建一个惟一的SessionFactory:

<span style="font-size:24px;">SessionFactory sessionFactory = config.buildSessionFactory();</span>

3》得到这个sessionfactory对象之后,就可以开始另外的话题了

三、什么是Session

提起来Session的话,首先想到的是http这个东东的session,想到了http这个无状态的协议,没办法保存任何访问对象的信息,所以就出现了session这个东东,用来记录访问者的一些信息。但是,好好转折一下下,转折,转折,转折说三遍。

在hibernate中的session并不是http中所说的session,一般把HttpSession对象称为用户会话。。。

而hibernate中的Session呢?是用来表示,应用程序和数据库的一次交互(会话)。在这个Session中,包含了一般的持久化方法(CRUD),不要说不知道CRUD是什么。而且,Session是一个轻量级对象(线程不安全),通常将每个Session实例和一个数据库事务绑定,也就是每执行一个数据库事务,都应该先创建一个新的Session实例,在使用Session后,还需要关闭Session。(记得关闭哈)

接下来,创建一个Session对象,依据第二步得到的sessionfactory对象。

<span style="font-size:24px;">Session session=sessionFactory.openSession();</span>

然后得到这个session之后,就可以使用它来进行数据库的具体操作了,给一个简单的代码。多说一句,一般来说在使用session的时候,都会用到事务,尤其是需要对数据做修改的时候。上代码:

<span style="font-size:24px;">public void save(Student student) {
    Transaction transaction= getSession().beginTransaction();  //开启事务
    getSession().save(student);//只要传一个Student的对象实例        
    transaction.commit();  //事务提交 
    getSession().close();//关闭session
}</span>

简单的总结一下。那么开始继续那个故事,应为那个程序员在面试的时候,没有记起来一些事情,尤其是hibernate的session和http的session的区别,导致很郁闷。所以做次简单的总结,希望给有需要的人一些帮助。因为自己理解的也不是很深刻,难免有些地方扯的不对,还望大家见谅,并提出来。

offer还未到手,同志还需努力。加油哦!!!
--------------------- 
作者:将心666666 
来源:CSDN 
原文:https://blog.csdn.net/jiangxindu1/article/details/48037731 
版权声明:本文为博主原创文章,转载请附上博文链接!

SessionFactory和Session简单讲解相关推荐

  1. [Hibernate系列—] 2. 创建SessionFactory 与 Session

    Configuration 对象创建 要创建SessionFactory , 首先要创建Configuration 对象. 这个对象就是去读取hibernate 的一些配置信息. 默认状况下, hib ...

  2. Configuration、SessionFactory、Session

    org.hibernate.cfg Class Configuration An instance of Configuration allows(允许)  the application to sp ...

  3. thinkphp内置标签简单讲解

    thinkphp内置标签简单讲解 1.volist循环 name 需要遍历的数据 id 类似于foreach中 value offset 截取数据起始位置 length 截取数据的个数 mod 奇偶数 ...

  4. 21_RS485简单讲解

    资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for ...

  5. yolo系列算法思想流程简单讲解概述————(究极简单的讲述和理解)

           在我想学习算法的时候,我看某些大佬特别喜欢上来就讲论文,给我搞的贼难受,毕竟本人太辣鸡了,上来这么搞看不懂,经过诸多算法的这样折磨.我打算根据自己的亲身经历和学习过程中遇到的问题出一期, ...

  6. RCNN算法思想简单讲解概述————(究极简单的讲述和理解)

           学习的过程中发现一个问题,如果不能大概的了解一下一个算法的思想直接去看他的论文,或者去看他算法的讲解就很痛苦,看不懂,学的效率也非常低,类似我之前发的RCNN论文精度的博客.RCNN目标 ...

  7. Java基础之泛型简单讲解(通俗易懂)

    Java基础之泛型简单讲解(通俗易懂) 1. 前言 2. 简单例子对比理解 2.1 未使用泛型例子--ArrayList 2.2 使用泛型的例子 2.2.1 ArrayList 举例 2.2.2 Ha ...

  8. 打印 上一主题 下一主题 简单讲解UEFI及MBR,及UEFI系统安装引导修复

    http://bbs.sysceo.com/forum.php?mod=viewthread&tid=14225&extra= 简单讲解UEFI及MBR MBR用于win平台 GPT主 ...

  9. NCBI中对所有原核生物ANI计算的统计结果简单讲解

    NCBI中对所有原核生物ANI计算的统计结果简单讲解 来龙去脉还没搞清楚,就先从结果切入.放上一个计算结果的链接https://ftp.ncbi.nlm.nih.gov/genomes/ASSEMBL ...

最新文章

  1. sam服务器是什么_使用SAM CLI将机器学习模型部署到无服务器后端
  2. .NET APlayer播放器 demo
  3. 老板眼中理想的“数据中台”,是不是真的存在?
  4. 在回调中获取Url参数
  5. python报表自动化系列 - 译码:与Excel单元格索引对应的十进制数坐标
  6. 直线检测原理matlab,Hough变换 直线检测原理及其Matlab实现
  7. Quick-cocos2d-x3.3 ios实现头像选取
  8. 如何让html箭头绝对居中,html - 将垂直居中对齐的导航箭头定位到图像的左侧和右侧 - SO中文参考 - www.soinside.com...
  9. 计算机硬件基础与计算机组装知识总结
  10. 为Linux的ibus添加五笔98输入法
  11. 初识EFR32BG22 ---- 能源管理篇
  12. AI技术内参021-SIGIR2018论文精读:如何对搜索页面上的点击行为进行序列建模?
  13. 日常英语口语收集汇总
  14. Chatbot-1-笔记
  15. 《我是一只IT小小鸟》 读书笔记
  16. DrawingManager.js___百度地图API
  17. 您的推特营销选对群控了吗
  18. vue 文件上传组件封装
  19. 微信小程序 利用组件实现星级
  20. 计算机操作系统--操作系统类型

热门文章

  1. 【Linux】什么是文件系统及inode?如何创建软硬链接?软硬链接有什么作用?
  2. 《你的灯还亮着吗》读书笔记
  3. 优化WinXP启动 加速开机时间(转)
  4. 人工智能的历史、现在与未来
  5. Matlab2017b启动慢,一直处于初始化状态的解决办法
  6. php抓包腾讯大王卡token,【搬砖教程】腾讯大王卡动态免流抓包教程 有链接
  7. Qt 窗口属性简介之Qt::WA_DeleteOnClose
  8. vue组件间通信三种基本方式
  9. Linux正则与文本处理工具
  10. 湖南职称英语与计算机考试,湖南省中级工程师职称要不要考职称英语?