zoukankan      html  css  js  c++  java
  • 分享知识-快乐自己:初识 Hibernate 概念片(一)

    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(对象)先发起一条查询语句,在发起更新或者插入语句

     

  • 相关阅读:
    shapely and geos break在distance方法
    linux运维
    【未完待补充】linux 设置So动态库链接路径
    用python建立最简单的web服务器
    nginx + keepalived 双机热备
    nagios监控linux主机监控内存脚本
    linux普通用户权限设置为超级用户权限方法、sudo不用登陆密码
    zato server启动后自动关闭问题解决
    Linux下几种文件传输命令 sz rz sftp scp
    python风味之大杂烩
  • 原文地址:https://www.cnblogs.com/mlq2017/p/9664764.html
Copyright © 2011-2022 走看看