Hibernate之底层原理的7点整理和总结

开心一笑

【老婆想减肥,让老公帮她买减肥药,老公:吃药伤身,现在挺好,多有肉感啊。儿子:其实真有点胖,老公立刻瞪了儿子一眼:小孩子不知道别乱讲,你妈妈这身材我喜欢。然后,趁老婆不注意狠狠的教训了儿子:以后说话注意点,减肥药很贵的,你要告诉你妈,少吃点饭不就减下去了。都是套路啊......】

提出问题

关于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中的<mapping resource="com/xx/User.hbm.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 缓存机制

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容