Hibernate之底层原理的7点整理和总结
开心一笑
【老婆想减肥,让老公帮她买减肥药,老公:吃药伤身,现在挺好,多有肉感啊。儿子:其实真有点胖,老公立刻瞪了儿子一眼:小孩子不知道别乱讲,你妈妈这身材我喜欢。然后,趁老婆不注意狠狠的教训了儿子:以后说话注意点,减肥药很贵的,你要告诉你妈,少吃点饭不就减下去了。都是套路啊……】
视频教程
大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……
视频地址:http://edu.csdn.net/lecturer/994
提出问题
关于Hibernate,个人的7点简单整理和总结???
解决问题
1.Hibernate简单介绍
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
2.Hibernate的优缺点
2.1 优点
- 程序更加面向对象;
- 提高了生产率;
- 方便移植(修改配置文件);
- 无侵入性。
2.2 缺点
- 效率比JDBC略差;
- 不适合批量操作。
- 只能配置一种关联关系
2.3 无入侵性
简单理解,所谓侵入性,是指它没有侵入hibernate任何的API。完全采用普通的Java对象(POJO),而不必继承Hibernate的某个基类,或实现Hibernate的某个接口。
例如 : A是侵入性的,B代码中使用A,那么如果以后不用A了(用另外一个工具代替),必须修改B的代码。反之,如果A是非侵入性的,B不用A,用C了,代码不需要改,改改配置文件什么的,就可以了。
3.Hibernate有四种查询方案
3.1 根据ID查询
根据get,load方法,根据id查找对象。
例如:
load(Class theClass, Serializable id)
load(Class theClass, Serializable id, LockMode lockMode)
load(Object object, Serializable id)
3.2 HQL语句进行查询
HQL(hibernate query language),查询对象:Query。Query由Session里的createQuery()来产生一个查询。
例如:
//不带参数的查询(这类比较简单)Query query=session.createQuery("select user from User as user");//第一种带参数的查询Query query=session.createQuery("select user from User as user where user.name=?");//假设name为传过来的参数query.setString(0,name)//第二种带参数的查询Query query=session.createQuery("select user from User as user where user.name=:name");query.setString("name",name)//假设name为传过来的参数(多个参数以此类推) 利用Session接口的find查询,均返回list
find(String query)
find(String query, Object[] values, Type[] types)
find(String query, Object value, Type type)
//例如下面
List list=session.find("select user from Users as user where user.name=?",name,Hibernate.STRING)
List list=session.find("select user from Users as user where user.name=? and user.pw=?",new Object[]{name,pw},new Type[]{Hibernate.STRING,Hibernate.STRING})
3.3 Criteria查询
Criteria(标准查询语言),查询对象:Criteria,查询条件:Criterion。
具体实例如下:省略 User 类
@Test
public void test() { // 获取Criteria实例对象 Criteria criteria = session.createCriteria(User.class); // 查询出王姓员工且收入在3000到5000之间的 // 类似于HQL中 WHERE employeeName LIKE '王%' AND salary BETWEEN 3000 AND 5000 List emps = criteria.add(Restrictions.like("employeeName", "王%")) .add(Restrictions.between("salary", 3000.0, 5000.0)).list(); // 查询出工资在4000以下或5000以上的王姓员工 // 可以通过Restrictions的or或and进行逻辑分组 emps = criteria.add(Restrictions.like("employeeName", "王%")) .add(Restrictions.or(Restrictions.gt("salary", 5000D), Restrictions.lt("salary", 3000D))).list(); // 查询出岗位是软件工程师或测试工程师,且学历是硕士、本科或大专的员工有哪些 emps = criteria.add(Restrictions.in("position", new String[] { "软件工程师", "测试工程师" })) .add(Restrictions.disjunction().add(Restrictions.eq("degree", "硕士")).add(Restrictions.eq("degree", "本科")) .add(Restrictions.eq("degree", "大专"))) .list();
}
更多的细节,请看下面网络上的大神文章,这里不继续扩展。
3.4 通过SQL来查
查询对象:SQLQuery
Session.createSQLQuery();
最基本的SQL查询就是获得一个标量(数值)的列表
Session.createSQLQuery("SELECT * FROM CATS").list();
Session.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
下面展示如何通过 addEntity() 让原生查询返回实体对象。
Session.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
Session.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);
更多的细节,请看下面网络上的大神文章,这里不继续扩展。
4.Hibernate的工作原理和初始化
4.1工作原理
- 配置好hibernate的配置文件和与类对应的配置文件后,启动服务器
- 服务器通过实例化Configuration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表或者和表建立好映射关系
- 通过实例化的Configuration对象就可以建立sessionFactory实例,进一步,通过sessionFactory实例可以创建 session对象
- 得到session之后,便可以对数据库进行增删改查操作了,除了比较复杂的全文搜索外,简单的操作都可以通过hibernate封装好的 session内置方法来实现
- 此外,还可以通过事物管理,表的关联来实现较为复杂的数据库设计
优点:hibernate相当于java类和数据库表之间沟通的桥梁,通过这座桥我们就可以做很多事情了
4.2 初始化
1.通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的读取并解析映射信息
3.通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory
4.Session session = sf.openSession();//打开Sesssion
5.Transaction tx = session.beginTransaction();//创建并启动事务Transation
6.persistent operate操作数据,持久化操作
7.tx.commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
5.Hibernate的3种对象状态
5.1 临时状态(或者叫瞬时状态Transient)
由new命令开辟内存空间的java对象,例如:
User user=new User();
临时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系。
5.2 持久状态(Persistent)
该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.通过session的 get()、load() 等方法获得的对象都是持久对象。持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。在同步之前,持久化对象是脏的。
5.3 游离状态(或者叫脱管状态Detached)
当与某持久对象关联的 session 被关闭后,该持久对象转变为游离对象.当游离对象被重新关联到session上 时,又再次转变成持久对象(在Detached其间的改动将被持久化到数据库中)。游离对象拥有数据库的识别值,但已不在持久化管理范围之内。
6.Hibernate对象状态转换
6.1 转换图片
6.2 对象状态转换说明
临时状态或者瞬时状态 (transient)
- 不处于Session 缓存中,存在内存中
- 数据库中没有对象记录
Java如何进入临时状态
- 通过new语句刚创建一个对象时
- 当调用Session 的delete()方法,从 Session 缓存中删除一个对象时。
持久化状态(persisted)
- 处于Session 缓存中。
- 持久化对象数据库中有对象记录。
- Session 在特定时刻会保持二者同步。
Java如何进入持久化状态
- Session 的save()把临时 —>>> 持久化状态。
- Session 的load(),get()方法返回的对象。
- Session 的find()返回的list集合中存放的对象。
- Session 的update(),saveOrupdate()使游离 —>>> 持久化。
游离状态或者托管状态(detached)
- 不再位于 Session 缓存中.
- 游离对象由持久化状态转变而来,数据库中可能还有对应记录。
Java如何进入持久化状态 —>>> 游离状态
- Session 的close()方法
- Session 的evict()方法,从缓存中删除一个对象,提高性能,少用。
7.Hibernate缓存
7.1为什么需要缓存
Hibernate是一个持久层框架,经常访问物理数据库。为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
7.2 Hibernate缓存分类
Hibernate一级缓存又称为 Session 的缓存:
- Session内置不能被卸载
- Session的缓存是事务范围的缓存
- Session对象的生命周期通常对应一个数据库事务或者一个应用事务
Hibernate二级缓存又称为“SessionFactory的缓存:
第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。
7.2 Hibernate缓存查询机制
- 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;
- 查不到,如果配置了二级缓存,那么从二级缓存中查;
- 如果都查不到,再查询数据库,把结果按照ID放入到缓存
- 删除、更新、增加数据的时候,同时更新缓存。
读书感悟
来自村上春树《海边的卡夫卡》
- 从沙尘暴中逃出的你已不再是跨入沙尘暴时的你。
- “希望你记住我”,佐伯说,“只要有你记住我,被其他所有人忘掉 都无所谓。”
- 不能用语言准确表达的东西,最好完全不说。
- 人不是因其缺点,而是因其优点被拖入更大的悲剧之中的。
- 大凡事物必有顺序,看的太超前了不行。看的太超前,势必忽视脚下,人往往跌倒。可另一方面,光看脚下也不行。不看好前面,会撞上什么。所以么,要在多少往前看的同时按部就班处理眼下事物。这点至为关键,无论做什么。
- 我们大家都在持续失去种种宝贵的东西,宝贵的机会和可能性,无法挽回的感情,这是生存的一个意义。
- 如果拥有令人吃惊的了不起的想法的是你一个人,那么在深重的黑暗中往来彷徨的也必定是你一个人。
- 问乃一时之耻,不问乃一生之耻。
经典故事
【一家酒店经营得很好,人气旺盛、财源广进。酒店的老总准备开展另外一项业务,由于没有太多的精力管理这家酒店,打算在现有的三个部门经理中物色一位总经理。
老总问第一位部门经理:“是先有鸡还是先有蛋?”
第一位部门经理不加思索地答道:“先有鸡。”
老总接着问第二位部门经理:“是先有鸡还是先有蛋?”
第二位部门经理胸有成竹地答道:“先有蛋。”
这时,老总向最后一位部门经理说道:“你来说说,是先有鸡还是先有蛋?”
第三位部门经理认真地答道:“客人先点鸡,就先有鸡;客人先点蛋,就先有蛋。”
老总笑了。他决定将第三位部门经理升任为这家酒店的总经理。
【心语】就事论事,往往容易局限在一个小圈子里,这就是常说的:惯性思维“。跳不出来时,就找不到得理事情的正确方法;相反,当我们换个角度跳出原来的惯性思维的框框时,我们就走上了一条新路,即:柳暗花明又一春。】
大神文章
【1】Hibernate 百度百科
【2】Hibernate面试知识点总结
【3】Hibernate查询解决方案
【4】Hibernate之Criteria查询
【5】Hibernate原生SQL查询
【6】Hibernate SQLQuery 原生SQL 查询及返回结果集处理-1
【7】hibernate工作原理及作用
【8】Hibernate的层次划分,Hibernate4.3的初始化的新写法
【9】(转) Hibernate对象的三种状态
【10】Hibernate中对象的三种状态及相互转化
【11】Hibernate 缓存机制
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!
Hibernate之底层原理的7点整理和总结相关推荐
- Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo
俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及的知识点总结如下: 开源框架的学习思路(个人总结) Hibernate的运行原理总结 Hibernate实现原理中的两个主要技术 ...
- JAVA程序员的堕落:只知框架不懂底层原理
我曾在多个场合撰文说过,现在培训出来的企业Java开发兵团只知道使用某种框架,但完全不知道这些框架的底层原理.今天早上,在依次对三个职位的应聘者面试中,我又再次见到了这种情形. 我们的顾问公司收到了一 ...
- 深度学习Spring5底层原理(黑马学习随笔)
学习随笔简介 跟随着黑马满老师的<黑马程序员Spring视频教程,全面深度讲解spring5底层原理>学习,视频教程地址:黑马程序员Spring视频教程,全面深度讲解spring5底层原理 ...
- 程序员练级攻略(2018):前端基础和底层原理
这个是我订阅 陈皓老师在极客上的专栏<左耳听风>,我整理出来是为了自己方便学习,同时也分享给你们一起学习,当然如果有兴趣,可以去订阅,为了避免广告嫌疑,我这就不多说了!以下第一人称是指陈皓 ...
- JVM重要知识点整理和学习
JVM重要知识点整理和学习 2015-07-25 分类:JAVA开发.编程开发.首页精华4人评论 来源:马志宇的专栏 分享到: 更多 27 JVM是虚拟机,也是一种规范,他遵循着冯 ...
- 【Hadoop】HDFS操作、数据上传与下载原理解析、高级特性及底层原理
HDFS操作.数据上传与下载原理解析.高级特性及底层原理 1 HDFS操作 1.1 Web Console网页工具 1.2 命令行 1.2.1 普通的操作命令 1.2.2 管理员命令 1.3 Java ...
- Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理
基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB级.万亿条数据记录的检索工作,这里向大家分享下Lucene底层原理研究和一些优化经验. 从两个方面介绍: 1. Lucene简介和索 ...
- SpringBoot3【① 基本框架原理+常用注解及其底层+AOP底层原理+yaml和日志框架】
SpringBoot3-特性介绍和快速入门 1.简介 1. 前置知识 Java17 Spring.SpringMVC.MyBatis Maven.IDEA 2. 环境要求 环境&工具 版本(o ...
- Spring Boot底层原理详解及整合
Spring Boot框架 通过Spring Boot 可以构建一个基于Spring框架的Java Application,简化配置,自动装配,开箱即用 JavaConfiguration用Java类 ...
- 很多小伙伴不太了解ORM框架的底层原理,这不,冰河带你10分钟手撸一个极简版ORM框架(赶快收藏吧)
大家好,我是冰河~~ 最近很多小伙伴对ORM框架的实现很感兴趣,不少读者在冰河的微信上问:冰河,你知道ORM框架是如何实现的吗?比如像MyBatis和Hibernate这种ORM框架,它们是如何实现的 ...
最新文章
- 怎么区分IP和MAC?子网掩码有何作用?—Vecloud微云
- hutool 取前12个月_Excel – 创建 12 个月的工资表模板,我只要 20 秒
- 【华为云技术分享】圣诞特别版 | 数据库频频出现OOM问题该如何化解?
- PyTorch 1.0 中文官方教程:用例子学习 PyTorch
- PyTorch 1.6 发布:原生支持自动混合精度训练并进入稳定阶段
- 图论--tarjan求lca
- boost 安装_Win10 + VS2019 编译安装 Boost
- Makefile详解(六)
- Mac下CUDA开启及Tensorflow-gpu 1.4 安装
- QListView的使用
- 剑斩楼兰的将军之路:多属性决策模型。
- 成长笔记4:教育是什么
- FreeFileSync命令用法
- 创维E900V21E/E900V22E_S905L3B/S905L2B通刷_支持5621DS无线_完美语音线刷固件
- 谷歌地球如何下载使用高程数据
- 基于python的步态分析_基于Python的步态周期及三维肢体活动角度算法的制作方法...
- Centos7下用命令下载jdk7及jboss-eap-6
- KubeVirt with YRCloudFile 擦出创新的火花
- intra_op_parallelism_threads参数设置
- HPE StoreOnce 3540 System unboxing
热门文章
- Linux网络编程-UDP实现QQ聊天功能
- 【Transformers】第 8 章 :使Transformers高效生产
- 贴片晶振为智能手环带来了哪些功能?
- C#多线程之解决多线程编程中大并发数等待唤醒的问题
- linux录音硬件电路,电话扩音录音装置电路及制作
- 解读《大话西游之大圣娶亲》
- 蒟蒻打CF#729div 2
- vue3里面app.config.globalProperties的使用
- burst什么意思_burst是什么意思_burst在线翻译_英语_读音_用法_例句_海词词典
- Excel不同列多条件计数