文档章节

Hibernate学习笔记

Lonely1221
 Lonely1221
发布于 2017/05/15 19:54
字数 2521
阅读 5
收藏 0

1.Hibernate的基本概念
   1).Hibernate框架的作用和优点
      *Hibernate框架是一个数据访问框架。
      通过Hibernate框架可以对数据库进行
      增删改查操作。(持久层框架)
      *Hibernate优点:
      --简单,可以简化数据库操作代码
      Session session =
      HibernateUtil.getSession();
      Cost cost =
      (Cost)session.load(Cost.class,id);
      --Hibernate可以自动生成SQL,可以
      将ResultSet记录和实体类自动映射
      --Hibernate具有通用性,可以方便
      数据库移植。
      原有的JDBC访问的缺点:
      --需要编写大量复杂的SQL
      --需要编写对象和记录之间的映射代码
      --数据库移植时,需要修改大量的SQL
      语句
   2).Hibernate设计思想
      Hibernate是基于ORM思想设计的。
      Hibernate是对JDBC技术的封装。
      ORM:Object Relation Mapping
      成为对象关系映射。负责Java对象
      和数据库表数据之间的映射。
      Hibernate是一款ORM工具,其他的
      ORM工具还有MyBatis,JPA。
      ORM工具在完成Java对象和数据库
      之间的映射后,在查询时,直接
      利用工具取出对象;在增删改操
      作时,直接利用工具将对象更新
      到数据库表中。中间的SQL+JDBC
      细节,都被封装在了工具底层,
      不需要程序员参与。

*2.Hibernate的基本使用
   1).Hibernate主要结构
      a.hibernate.cfg.xml(仅一个)
      Hibernate主要配置文件,主要
      定义数据连接参数和框架设置
      参数。
      b.Entity实体类(n个,一个表
      一个),主要用于封装数据库
      数据。
      c..hbm.xml映射文件(n个)主要
      是描述实体类和数据库表之间
      的映射信息。描述《--》类型,
      字段《--》属性的对应关系。
      d.Hibernate API
   2).Hibernate主要API
     a.Cofiguration
     用于加载hibernate.cfg.xml配置
     信息。用于创建SessionFactory
     b.SessionFactory
     存储了hbm.xml中描述的信息,内置
     了一些预编译的SQL,可以创建
     Session对象
     c.Session
     负责对数据表执行增删改查操作。
     表示Java程序与数据的一次连接
     会话。
     session.connection
     d.Query
     负责对数据表执行特殊查询操作
     e.Transaction
     负责Hibernate操作的事物管理。
     默认情况下,Hibernate事物关闭
     了自动提交功能,需要显式追加事
     务管理。
   3).Hibernate主要是用步骤
     a.建立数据库表
     b.建立Java工程,引入Hibernate
     开发包+数据库驱动包
     c.添加src/hibernate.cfg.xml追加
     配置参

     数
     d.编写Entity实体类
     e.编写hbm.xml映射描述信息
     f.利用Hibernate API实现DAO

3.Hibernate映射类型
     hbm.xml描述字段和属性映射时,
     采用type属性指定映射类型。
     映射类型作用:主要负责实现
     属性和字段值之间的转化。
     type映射类型值有两种写法:
     a.指定Java类型,例如
     Java.lang,java.lang.Integer
     b.指定Hibernate类型:
     --整数byte,short,integer,long。
     --浮点数float,double
     --字符串string
     String<-string->varchar2(20)
     --日期 时间
       date,time,timestamp
     java.util.Date <-date-> Date
     java.util.Date <-time-> Date
     TimeStamp <-timestamp-> Date
     --布尔类型
     yes_no,true_false
     boolean----char(1)
     true/false <--yes_no--> Y/N
     true/false <--true_false--> T/F
     --其他blob,clob,big_decimal,
     big_integer

4.Hibernate主键生成方式
   Hibernate负责管理主键值。
   Hibernate提供了多种主键生成方式。
   主要由以下几种:
     *a.sequence
     可以按指定序列生成主键值。只适
     用于Oracle数据库。
     <generator class="sequence">
        <param name="sequence">
        序列名字
        </param>
     </generator>
     *b.identity
     按数据库自动增长机制生成主键。
     一般适用于Mysql,SQLServer数据库。
     <generator class="identity">
     </generator>
     *c.native
     hibernate会根据方言类型不同,
     选择不同的主键生成方式。如果
     是OracleDialect会选择sequence ,
     如果是MySQLDialect会选择identity。
     <generator class="native">
     </generator>
     *d.assinged
     hibernate会放弃主键生成,采用
     此方法,需要在程序中指定主键值。
     <generator class="assigned">
     </generator>
     e.increment
     hibernate先执行select max(id)..
     语句获取主键最大值,执行加1操作,
     然后再调用insert语句插入。
     <generator class="increment">
     </generator>
     f.uuid/hilo
     uuid指的是按UUID算法生成一个主
     键值(字符串类型)。hilo指的是按高
     低位算法生成一个主键值(数值类型)。
     <generator class="hilo">
     </generator>

5.---------Hibernate基本特性-------
   1).对象持久性
     在Hibernate使用过程中,实体对象
     可以具有以下三种状态:
     a.临时状态
     采用new关键字创建对象,该对象未
     与Session发生关联
     *b.持久状态
     实体对象与Session发生关联。例如
     调用了session的get、load、save
     、update等方法。
     处于持久状态的对象具有以下特点:
     --对象生命持久,垃圾回收器不能
     回收。
     --对象的数据可以与数据库同步,
     由Session对象负责管理和同步。
     --对象在Session的一级缓存中
     存放。
     =============================
     当时就对象数据改变后,调用
     session.flush()方法,会与数据库
     同步更新。tx.commit()方法,内部
     也调用了flush(),因此使用commit()
     方法可以省略flush()调用。
     c.游离状态
     原来是持久状态,后来不受Session
     管理了。
   2).一级缓存机制(默认启用)
     一级缓存被称为Session级别的缓存。
     每个Session都有自己独立的缓存区,
     该缓存区随着Session创建而开辟,
     随着Session.close()而释放。
     该缓存区可以存储当前Session关联
     的对象(持久对象)。
     一级缓存的好处:Hibernate在查询
     时,先去缓存查找,如果缓存没有
     采用DB查询。如果利用Session对
     同一个对象查询多次,第一次去DB,
     后续会从缓存获取,从而减少了与
     DB的交互次数。
     管理一级缓存的方法如下:
     session.evict(obj);//将obj清除
     session.clear();//清除所有对象
     session.close();//清除所有对象
     并关闭与数据库的连接。
   3).延迟加载机制(动态代理技术)
     Hibernate在使用时,有些API操作
     是具有延迟加载机制的。
     延迟加载机制特点:当通过Hibernate
     的API获取一个对象结果后,该对象
     并没有数据库数据,当通过对象的
     getter方法获取属性值时才取数据库
     查询加载。
     a.具有延迟加载机制的操作如下:
     --session.load查询
     --query.interator查询
     --获取关联对象的属性信息
     *b.常犯的错误:
     LazyInitializationException:could
     not initialize proxy - no Session
     原因:代码中使用了延迟加载操作,但
     是session在加载数据前关闭了。
     c.延迟加载原理
     在使用延迟加载操作后,Hibernate返回
     的对象是Hibernate利用CGLIB技术新生成
     的一个类型。在新类型中,将属性的
     getter方法重写。
     public class Foo$$EnhancerByCGLIB
     extends Foo{
     public String getName(){
     //判断是否已加载过数据
     //如果加载过,返回name值
     //如果未加载,发送SQL查询加载数据,
     然后返回name值。
       }
     }
     *.Java-->*.class-->载入类加载器-->
     执行

     javassist.jar/cglib.jar(生成新类型
     )-->载入类加载器-->执行
     d.session的get和load方法的区别
     两者都是按主键作条件查询。不同的有
     以下几点:
     --get是立刻加载;load是延迟加载
     --get返回的对象类型是实体类型;
       load返回的类型是动态生成的一个
       代理类,该代理类是实体类的子类。
     --get未查到数据返回null;load未查
       到数据抛出
         ObjectNotFoundException异常
     e.延迟加载机制好处
       --提高了内存的使用效率。
       --可以降低数据访问并发量。
       Account a;-->多个Service
       public class Account{
       private int id;
       private String name;
       //基于关系映射加载数据
       private Set<Service> service;
       }
       session.get()//立刻加载
   4).综合练习
     案例:重构项目中的资费管理模块
     1).添加Hibernate开发框架
     --jar包
     --主配置hibernate.cfg.xml
     2).采用Hibernate操作COST表
     --实体类(利用现有的Entity)
     --追加Cost.hbm.xml
     (注意:实体类和hbm.xml必须
     保持一致)
     3).按CostDAO接口重构一个DAO
     实现组件
     4).修改DAOFactory,将CostDAO
     采用Hibernate实现的DAO实例化
     5).测试资费模块功能

===========JavaWeb中使用延迟加载=======
     在Java web程序中如何使用延迟
     加载操作:
     *.action-->Action-->DAO-->JSP
     (利用标签或EL获取数据,会触发
     延迟加载数据)
     -->生成响应HTML页面给浏览器
     基于上述原因,在DAO中不能关闭
     Session,需要将Session关闭放到
     JSP解析之后。这种模式被称为
     OpenSessionInView。该模式可以
     采用以下技术实现:
     --利用Struts2的拦截器
      public void intercept
     (ActionInvocation in){
     //action之前调用
     in.invoke();//执行action,result
     //result之后调用,关闭Session
     }
     *.action-拦截器1->Action-拦截器1->
     Action1-->拦截器1结束-->拦截器1结束
     redirectAction--chain
     --利用Filter过滤器
     public void doFilter
     (request,response,chain){
     //前期处理逻辑
     //调用后续action,result组件
     chain.doFilter(request,response);
     //后期处理逻辑。关闭Session
     }
     --利用Spring的AOP机制

===============关联映射================
   关联映射主要是在对象之间建立关系。
   开发者可以通过关系进行信息查询、添
   加、删除和更新操作。
   1.一对多关系
     1).关系建立方法
     --在1方Account中添加Set集合属性
     --在1方Account.hbm.xml中添加属性
     描述
         <set name="属性名">
             <key column="指定关联条件
         的外键字段">
             </key>
             <one-to-many calss="要关
         联加载的另一方Service"/>
         </set>
     --测试,可以采用
         account.getService()方法获取
         相关Service记录。
   2.多对一关系
     1).关系建立方法
     --在n方Service中添加Account属性
     --在n方Service.hbm.xml中描述属性
        <many-to-one name="属性名"
        class="要关联的另一方类型
        Account" column="关联条件的
        外键字段"/>
     --删除Service中原有的外键字段
     映射属性和映射描述

     --测试,通过Service.get.Account()
     获取相关的Account信息。
   3.关联操作
     1).查询操作
     建立关联映射后,默认情况下会在调用
     关联属性的getter方法时,会再发送一
     个SQL加载关系表数据。
     如果需要将关联数据与主对象一起加载,
     可以采用下面方法:
     a.在hbm.xml关联属性映射描述中,
     使用lazy="false" fetch="join"
     b.编写HQL,采用join fetch关联属性方
     式实现。(推荐使用)


  

© 著作权归作者所有

Lonely1221
粉丝 0
博文 3
码字总数 5674
作品 0
浦东
程序员
私信 提问
《JavaEE基础实用教程》笔记说明

“《JavaEE基础实用教程》笔记”分类中的文章是本人学习《JavaEE基础实用教程》时所做的笔记。 该书作者:郑阿奇 著。ISBN:9787121091360。 这里整理出第3、4、5章的笔记,主要内容是Strut...

JerryPan
2016/02/19
1K
1
Hibernater学习笔记(五)

上次学习一对多查询,今天学习多对多查询 场景:用户和角色的关系,一个用户可以是多个角色,一个角色可以有多个用户 pojo类 User.java Role.java 配置文件 User.hbm.xml Role.hbm.xml 创建成...

Mr_欢先生
2017/12/13
0
0
Hibernater学习笔记(四)

今天学习了hibernate的查询,创建的实体类如下 Customer.java(销售员信息) Salesperson.java(客户信息) 1.一对多映射配置 Customer.hbm.xml Salesperson.hbm.xml 配置完两个文件后,需要...

Mr_欢先生
2017/12/10
0
0
Hibernater学习笔记(六)

一、对象导航查询 之前的客户和联系人的关系是一 对多的关系:一对多 场景:根据客户id查询客户,在查出该客户的所有联系人 二、HQL查询 查询所有客户信息 创建Query对象,写出hql语句 调用q...

Mr_欢先生
2018/01/02
0
0
Hibernate 学习资料汇总

1.Hibernate系列——总结篇(http://blog.csdn.net/jiuqiyuliang/article/details/41318751) 2.Hibernate框架简述(http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html) 3.Hiber......

IT追寻者
2016/08/06
20
0

没有更多内容

加载失败,请刷新页面

加载更多

group by分组后获得每组中时间最大的那条记录

用途: GROUP BY 语句用于 对一个或多个列对结果集进行分组。 例子: 原表: 现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。 我们使用下列 SQL 语句: SELECT ID,US...

豆花饭烧土豆
28分钟前
0
0
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

本文将基于android6.0的源码,对Camera API2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之Camera API2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进...

天王盖地虎626
38分钟前
2
0
java 序列化和反序列化

1. 概述 序列恢复为Java对象的过程。 对象的序列化主要有两 首先我们介绍下序列化和反序列化的概念: 序列化:把Java对象转换为字节序列的过程。 反序列化:把字节序列恢复为Java对象的过程。...

edison_kwok
50分钟前
2
0
分布式数据一致性

狼王黄师傅
今天
2
0
经验

相信每位开发者在自己开发的过程中,都会反思一些问题,比如怎样提高编程能力、如何保持心态不砍产品经理、996 之后怎样恢复精力……最近开发者 Tomasz Łakomy 将他 7 年的开发生涯中学习到...

WinkJie
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部