作者:高元_G·Marshal于 2017年06月21日 发布在分类 / 开发技术 / Java 下,并于 2017年06月21日 编辑
    Hibernate基本概念

       311

       0


    1.Hibernate基本概念(了解)
         1)Hibernate框架作用
              hibernate是一个数据访问框架(持久层框架)
              在项目中利用Hibernate框架可以实现对数据库的增删改查操作,为业务层构建一个持久层
              原有使用JDBC+SQL方式对数据库操作,这种操作有些弊端
              a.表字段多的情况下,SQL繁琐
              b.不同数据库SQL语句存在一定差异,移植性较差
              c.由于数据表记录与Java对象之间存在差异,将Java对象和数据表记录转换时,非常繁琐
    利用Hibernate框架可以解决上述问题

         2)Hibernate框架原理--(ORM)
              ORM--Object Relation Mapping,对象关系映射
              主要思想:将Java对象与关系表进行自动映射,这样可以将对象直接更新到数据库;
                               查询时,可以自动将数据表记录封装成Java对象

              Hibernate框架基于ORM原理实现。Hibernate是目前主流的ORM工具,此外还有iBATIS,JPA
              利用Hibernate框架可以简化数据库操作,它将JDBC和SQL语句封装起来,不需要使用者编写
              开发者需要了解和使用Hibernate API;

              session.save(user);
              update(user)
              delete(user)
              User user = load(10);

              Hibernate主要的体系结构如下:
                   a、实体类(User.java)n个
                        与数据表对应,用于封装数据表的一行记录
                   b、XML映射文件(User.hbm.xml)n个
                        用于描述实体类与数据表之间的对应关系。
                        类属性与表字段之间的对应关系
                   c、主配置文件(Hibernate.cfg.xml)
                        用于指定连接数据库的参数,框架参数等。

    2.Hibernate基本使用
         1)使用步骤:
              a、引入Hibernate框架开发包
              b、添加Hibernate主配置文件
              c、根据数据表,编写实体类,映射文件
              d、利用Hibernate API操作实体对象
              
              Configuration:用于加载主配置文件和映射文件 
              SessionFactory:用于创建Session对象
              Session:原Connection对象的封装,代表Hibernate与数据库之间的一次连接,负责执行增删改查操作
              Transaction:用于进行事务管理,由于自动提交功能被Hibernate关闭,因此使用时,必须显式commit操作
              Query:负责执行各种查询

    -------------------------------------------------------------------------------------------------------------
    Hibernate第二课
    -------------------------------------------------------------------------------------------------------------
    1.Hibernate映射问题
         在hbm.xml中,定义属性和字段之间映射时,使用的tyoe属性,其作用是指定属性和字段之间采用哪种类型赋值.
         常用的映射类型如下:
         a。整数:integer,long,shirt,byte
         b、浮点数:float,double
         c、字符:character
         d、布尔:yes_no,true_false;
              完成布尔属性和字符字段之间映射   yes_no可以讲true映射成Y,false映射成N
                                                                  true_false可以讲true映射成T,false映射成F
         e、字符串:string
         f、日期时间:date、time、timestamp
         g、其他big_decimal,big_integer,clob,blob    
    2.Hibernate主键生成方式
         在添加操作时,Hibernate可以负责生成主键值.在hbm.xml中利用<generator class="方式">元素指定。
         常用的主键生成方式:
              a、identity
                    主键值采用数据库自动增长机制生成,例如:MySQL,SQLServer,并在建表时设置自动增长、
              b、sequence
                    主键值采用指定序列生成,Oracle特有的,仅Oracle采用
              c、native
                    主键值根据数据库类型,自动选择identity,sequence等
              d、increment
                    先执行select max(id)...语句获取当前主键最大值,再将主键值+1,写入数据表
              e、其他uuid、hilo
                    主键值采用uuid或hilo高低位算法生成一个值
              f、assigned
                    通知Hibernate不要负责主键值,这项工作交给程序员负责,需要程序员在代码指定一个主键值
                   如果需要按自定义规则生成主键值,可以自定义一个主键生成器。方法如下:
                        1)编写一个生成器类,实现IdentifierGenerator接口,实现约定的generator方法,该方法返回值就是主                    
                             键值。
                        2)在hbm.xml中通过<generator class="包名.类名">的方式使用


    3.Hibernate对象状态
         在使用Hibernate中,java对象有以下3钟状态
              1)临时状态
                        使用时,刚new出来的对象
              2)持久状态    
                        使用了session对象的save,update,load等方法后,该对象就处于持久状态。
                        a、持久对象存在于Session缓存中,由Session负责管理
                        b、在利用Session查询时,hibernate会去session缓存中查找,如果没有再去数据库查找。
                        c、当Session缓存区中对象属性状态发生变化时,Session在事务提交后会负责更新到数据库。
              3)托管或游离状态
                        当关闭session,或者使用session.evict()方法将对象移除后,该对象脱离了Session管理。

                   持久性概念:
                            持久对象才具有持久性。对象的数据状态,可以同步到数据中,垃圾回收器不能够回收该对象。 
    4.一级缓存
         1)什么是一级缓存
              一级缓存指的是Session级别的缓存。该Session管理的持久对象都在缓存中存储。
         每个Session对象都有自己独立一级缓存空间。
         2)一级缓存好处是:
              当使用同一个Session对象重复查询相同数据对象时,第一次查询数据库,后续几次从缓存中获取。
         3)一级缓存的管理
              当使用session.load,session.get方法会将查询出对象自动放入一级缓存.
              要移除一级缓存中的对象,可以使用
                   session.clear()//移除缓存中所有对象。
                   session.evict(obj)//移除指定的obj对象。
                   -------------------------------------------------
                   session.flush()//将缓存中对象的状态与数据库同步。
                   tx.commit()内部会首先调用flush,之后commit提交
         4)为了更好的使用一级缓存,在同一线程处理中不同组件应使用同一个Session对象。可以使用ThreadLocal技术
              将session对象与处理线程绑定。
              
              从Hibernate3.0版本开始,将ThreadLocal机制进行了集成,在获取Session对象时,可以使用SessionFactory的
              getCurrentSession()方法,该方法返回与当前处理线程相关的Session对象。
                   注意:currentSession对象必须在一个事务中使用,
                             在事务结束后会自动关闭session。
                   使用getCurrentSession()方法前需要在hibernate.cfg.xml中添加配置
                        <property name="current_session_context_class">
                             thread
                        </property >


    5.延迟加载
         1)什么是延迟加载
         当使用session的load()或 iterator()方法查询时,返回的对象并没有立刻去数据库查询数据。
         而是当使用对象的getter方法时,采用数据库获取数据。
         2)什么时候启用延迟加载
             a、使用session.load方法
             b、使用query.iterator方法
             c、使用关联映射,关联属性值采用延迟加载。
         3)避免出现使用延迟加载异常
              在使用延迟加载机制时,避免过早关闭session。在项目中,一般会将session关闭放在请求处理完毕后,
              响应前。有以下方案:
                   a、利用过滤器执行session关闭














    访问权限

    创建人 高元_G·Marshal
    文档编辑权限 创建者私有
    文档阅读权限 来自分类
    分类阅读权限 所有人
    分类编辑权限 所有人
    分类审核权限
    标签

    框架
    历史版本

    修改日期 修改人 备注
    2017-06-21 15:46:02[当前版本] 高元_G·Marshal CREAT
    同类知识
    相关知识

    睿恒知识库-V3.2.0