1):什么是 Hibernate?

  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,

使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

  Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

化的重任。

  总之,可以简单的理解为Hibernate是基于JDBC技术基础上衍生而来,并在此基础上使得由原来直接操纵数据库变成直接操作映射数据表后生成的Java类,从而实现对象编程思维来操纵数据库。

2):Hibernate理论基础概要:

  Hibernate是一个JDO(Java Data Object,Java对象持久化)工具。它的工作原理是通过文件把值对象和数据库表之间建立起一个映射关系,这样我们就只需要操作这些值对象和Hibernate提供的一些基本类,

就可以达到使用数据库的目的。

例如,使用Hibernate的查询,可以直接返回包含某个值对象的列表(List),而不必像传统的JDBC访问方式一样把结果集的数据逐个装载到一个值对象中,为我们的 编码工作节省了大量的劳动。

Hibernate提供的HQL是一个类SQL语言,它和EJBQL(HQL的一个子集)一样都提供对象化的数据库查询方式,但HQL在功能和使用方式上都非常接近于标准的SQL。

Hibernate的作用是介于Java与JDBC之间的一个持久层,它通过建立与数据库表之间的映射来操纵数据库。

Hibernate是基于JDBC基础之上的,在深入了解Hibernate理论技术的基础上,要先了解以下三点基础:数据库操作的三个阶段、ORM对象关系映射、持久层概念。

3):Hibernate理论基础之数据库操作:

  在Hibernate出现之前,对数据库操作是基于JDBC,这中间经历了操作JDBC、封装JDBC、ORM三个阶段。

1)操作JDBC阶段

  本阶段即在调用JDBC连接数据库的包时,需要自己进行编写的进行数据库用户登录验证的那段代码。在这段代码中可以执行SQL语句进行数据查询、插入、删除等。

2) 封装JDBC阶段

  由于仅仅只是操作JDBC,使得在实现不同逻辑功能时,都要重新编写进行数据库用户登陆验证的那段代码,使得代码重复很严重。

  为此,引入了JavaBean的技术,书写一个DBAccess.java类进行数据库用户登陆验证和数据库操作,并把其中进行数据库操作部分封装成不同的函数,那么实现后续的逻辑功能时只需调用这些函数即可实现。

3)ORM阶段

  在对JDBC进行封装之后,能够方便的实现数据库的操作。但是,在面向对象的编程开发中,数据库的操作与普通的面向对象的Java代码,显然是两种不同的开发思路。

  于是就产生了ORM阶段——使原来直接操作数据库变成了直接操作普通的Java类来实现相应的数据库操作。

4):Hibernate理论基础之ORM对象关系映射:

  ORM是Object Relational Mapping的简称,即对象关系映射。

  它是一种为了解决面向对象与关系数据库存在的互不匹配技术。简单地说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象持久化到关系数据库中。

  下面请看一个用户实体(建立数据表时,要描述的现实世界中的实现)、数据表(实体建立完后,抽象分析完成数据表建立)、Java类(此处就是ORM要完成的任务而抽象生成的Java类):

图一:ORM示意图(PS:此处ER图和数据表user表画的不规范,仅仅作为示意作用哦)

有上图可知,ORM实现了数据表到Java对象的映射,这正是ORM的作用。

5):Hibernate理论基础之持久层概念:

  ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。

  由此便引入了以下两个新概念:

  (1)持久化:

    就是对数据和程序状态的保持。大多数情况下特别是企业级应用,数据持久化往往也就意味将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。

  (2)持久层:

    把数据库实现当做一个独立逻辑拿出来,即数据库程序是在内存中的,为了使程序运行结束后状态得以保存,就要保存到数据库。持久层是在系统逻辑层面上,专致于实现数据持久化的一个相对独立的领域。

    持久层的目的是通过持久层的框架将数据库存储服务从服务层中分离出来,而Hibernate是目前最流行的持久层框架。

6):Hibernate优缺点:

  1):优点:

    Hibernate 功能强大,是java应用关系数据库之间的桥梁,较之 JDBC 方式操作数据库,代码量大大减少,提高了持久化代码的开发效率,降低了维护成本。

    Hibernate 支持许多面向对象的特性,如 组合、继承、多态等,使得开发人员不必再面向业务领域的对象模型和数据库的关系数据模型来回切换,方便开发人员进行领域驱动的面向对象的设计与开发。

    Hibernate 可移植性好,系统不会绑定在某个特定的关系型数据库上,对于系统更换数据库,通常只需要修改 Hibernate 配置文件即可正常运行。

    Hibernate 框架开源免费,可以在需要时研究源代码,改写源代码,进行功能的定制,具有可扩展性。

  2):缺点:

    不适合一数据为中心大量使用存储过程的应用

    大规模的批量插入,修改和删除不适用 Hibernate

7):Hibernate与Mybatis对比:

1):简介:

  Hibernate:

    Hibernate是当前最流行的ORM框架之一,对JDBC提供了较为完整的封装。Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL的自动生成和执行。

  Mybatis:

    Mybatis同样也是非常流行的ORM框架,主要着力点在于 POJO 与 SQL 之间的映射关系。

    然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO 。

    相对Hibernate“O/R”而言,Mybatis 是一种“Sql Mapping”的ORM实现。

2):开发速度:

  难易度:

    Hibernate的真正掌握要比Mybatis困难,Hibernate比mybatis更加重量级一些。

    Mybatis框架相对简单很容易上手,但也相对简陋些。

3):开发工作量:

  Mybatis需要我们手动编写SQL语句,回归最原始的方式,所以可以按需求指定查询的字段,提高程序的查询效率。

  Hibernate也可以自己写SQL语句来指定需要查询的字段,但这样破坏了Hibernate封装以及简洁性。

4):数据库移植性:

  Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。

  Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。

5)缓存机制对比:

  相同点:

    Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

  不同点:

    Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

    MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。

    并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

6):两者比较:

  因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

  而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

8):两者对比总结:

两者相同点:

  Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。

  其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。

  如下图所示:

Hibernate和MyBatis都支持JDBC和JTA事务处理。

Hibernate优势:

  Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。

  Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。

  Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。

  Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

Mybatis优势:

  MyBatis可以进行更为细致的SQL优化,可以减少查询字段。

  MyBatis容易掌握,而Hibernate门槛较高。

白话总结:

  Mybatis:小巧、方便、高效、简单、直接、半自动化

  Hibernate:强大、方便、高效、复杂、间接、全自动化

9):Hibernate 中 java对象的三种状态:

hibernate对象的三种状态:

1): 瞬时(临时)状态: 对象被创建时的状态,数据库里面没有与之对应的记录!

2): 持久状态: 处于session的管理中,并且数据库里面存在与之对应的记录!

3): 游离状态: 对象不处于session的管理中,但是数据库里面存在与之对应的记录!

对象与session产生关系的时机:

  1、save()或者saveorupdate();

  2、get()或者load();

清空缓存:

  1、clear();//清空所有加载的实例

  2、evict(实例);//从缓存里面移除这个实例——效果同上,需要指定实例,对象

hibernate涉及的脏检查:

  当事务提交时(commit),hibernate会检查session中处在持久状态的对象, 判断与数据库是否一致,不一致则会将缓存里面的数据更新掉数据库里面的数据!

那么session什么时候刷新缓存:

  1、执行commit方法时 //执行脏检查

  2、session.flush(); //不会提交事务执行脏检查

更新数据的方法:

update(对象):

saveOrUpdate(对象):

 1、通过id查询主键,存在就更新,不存在就新增!

 2、当mapping配置文件的generator节点的class属性不为assigned时,造成只有update没select时,更改class为assigned可以解决!

 3、不会发起查询,直接更新 merge(对象):合并,先查询,与缓存里面的数据比较一样时不做任何操作,不一样时,再更新或者插入!效率更高!

saveOrUpdate(对象)与merge(对象)方法:

1、主键生成策略:

  assigned    操作一样!

2、SQL语句不同:

  sequence,动态更新(dynamic-update="true")策略

  saveOrUpdate(对象)只更新

  merge(对象)先发起一条查询语句,在发起更新或者插入语句

分享知识-快乐自己:初识 Hibernate 概念片(一)的更多相关文章

  1. 分享知识-快乐自己:Hibernate各种查询操作

    Hibernate各种查询操作(一) 测试数据库如下: t_sort表:                                   t_good表: 一.对象导航方式查询 查询所有食品类下面 ...

  2. 分享知识-快乐自己:Hibernate 关联映射

    关联关系映射--概念: 关联关系是使用最多的一种关系,非常重要.在内存中反映为实体关系,映射到DB中为主外键关系. 实体间的关联,即对外键的维护.关联关系的发生,即对外键数据的改变. 外键:外面的主键 ...

  3. 分享知识-快乐自己:Hibernate 中的 HQL 语句的实际应用

    概要: Hibernate 支持三种查询方式: HQL查询.Criteria查询及原声 SQL (Native SQL)查询. HQL(Hibernate Query Language,Hiberna ...

  4. 分享知识-快乐自己:Hibernate 中Criteria Query查询详解

    1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...

  5. 分享知识-快乐自己:Hibernate对象的三种状态

    图解: 1):瞬时状态(Transient) 对象与session没有关联,数据库中没有对应的数据. 一般new出来的对象便是瞬时对象. 对瞬时对象使用save()方法便使之成为持久对象. 由于数据库 ...

  6. 分享知识-快乐自己:Hibernate框架常用API详解

    1):Configuration配置对象 Configuration用于加载配置文件. 1): 调用configure()方法,加载src下的hibernate.cfg.xml文件 Configura ...

  7. 分享知识-快乐自己:Hibernate 中 get() 和 load()、sava、update、savaOrUpdate、merge,不同之处及执行原理?

    1):Hibernate 中 get()  和 load() 有什么不同之处? 1)Hibernate的 get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在缓存中查 ...

  8. 分享知识-快乐自己:Hibernate中的 quert.list() 与 quert.iterate() 方法区别

    区别如下: quert.list() : 1):每次都是通过一条语句直接操作数据库取出所有的数据返回(并且将对象存入hibernate缓存中): 2):不会从一二级缓存中查询数据: 3):之执行一条S ...

  9. Hibernate框架 初识 ORM概念 搭建Hibernate环境 Hibernate Api

    ORM概念 在学习 Hibernate 之前,我们先来了解ORM   对象关系映射 O, Object  对象 R,Realtion 关系  (关系型数据库: MySQL, Oracle…) M,Ma ...

随机推荐

  1. vue2.X props 数据传递 实现组件内数据与组件外的数据的双向绑定

    vue2.0 禁止 子组件修改父组件数据 在Vue2中组件的props的数据流动改为了只能单向流动,即只能由组件外(调用组件方)通过组件的DOM属性attribute传递props给组件内,组件内只能 ...

  2. H5和CSS3新增内容总结

    CSS3选择器有哪些?答:属性选择器.伪类选择器.伪元素选择器.CSS3新特性有哪些?答:1.颜色:新增RGBA,HSLA模式 文字阴影(text-shadow.) 边框: 圆角(border-rad ...

  3. 2014acm亚洲区域赛陕西赛总结

    这次是第一次出来到外面比赛,一切都是非常新鲜的,带着新鲜来到了古城西安.首先感觉就是志愿者一点都不热情.一副爱理不理的,这不是有违我大西北人的热情好客么. 直接说比赛吧. 第一天热身赛,出了两道非常水 ...

  4. Django之tag的使用

    settings.py: #安装 pip install django-taggit INSTALLED_APPS = [ 'myblog', 'taggit', 'django.contrib.ad ...

  5. Iconfot阿里妈妈-css高级应用

    矢量图标替换教程 首先进入:http://www.iconfont.cn/ 搜索你分类的关键字---然后加入购物车 加入购物车之后,下载到本地用浏览器打开demo.html 把a class=“原来样 ...

  6. 宜信开源|微服务任务调度平台SIA-TASK入手实践

    引言 最近宜信开源微服务任务调度平台SIA-TASK,SIA-TASK属于分布式的任务调度平台,使用起来简单方便,非常容易入手,部署搭建好SIA-TASK任务调度平台之后,编写TASK后配置JOB进行 ...

  7. mysql日期格式转化

    select DATE_FORMAT( '20170701', '%Y-%m-%d'); 先挖坑

  8. 华为p20:拍美景,听讲解,旅行更智能

    华为P20轰轰烈烈地上市了,本来对手机并不感冒的我,看到身边的好友换了P20,不禁感慨:这个月的活又要白干了,全部都要上交给华为,因为这款手机完全戳中了旅游爱好者的痛点. 痛点一:丢弃笨重的单反,手机 ...

  9. Volley框架载入网络图片

    Android开发中,载入网络server的图片是非经常常使用的.当然我们能够自己写server接口去实现,只是要做到server性能 优越的话,开发起来比較麻烦点.所以本博客要介绍Volley框架进 ...

  10. ASP.NET RemoteAttribute远程验证更新问题

    create时使用remote特性没有任何问题, update时,问题就大了,验证唯一性时需要排除自身,如果使用这个特性将无法正确的验证. 改进思路:将自动生成的标签属性改为手写,,并在url上面加上 ...