Hibernate笔记 联系客服

发布时间 : 星期三 文章Hibernate笔记更新完毕开始阅读46977e127375a417866f8fe4

Hibernate

梁建全:liangjq@tarena.com.cn

day80(2013-11-26)

一、什么是Hibernate及其作用

Hibernate是一个数据库操作的框架,可以简化数据库操作代码,提升开发效率。(*)

Hibernate框架是对Jdbc技术的一个封装。(*) 原有的Jdbc技术在操作数据时,有以下几点不足: (1) 需要编写复杂的Sql语句。

(2) 需要编写大量的代码实现实体对象和表记录之间的转换。 (3) 数据库移植性较差。

Hibernate框架可以解决上述Jdbc不足,有以下优点:(*****) (1) 可以自动生成SQL

(2) 可以自动完成实体类和表记录之间的转换(映射) (3) 可以增强数据库的移植性

二、Hibernate设计原理

Hibernate框架是基于ORM思想对Jdbc进行封装设计的。(**)

ORM(Object Relation Mapping)被称为对象关系映射。主要思想是:能够完成程序中Java实体对象和关系数据库中表记录之间的转换。开发者可以将对象直接写入数据库,查询时可以直接从数据库中以对象的形式取出结果。中间对象和记录的转换细节由ORM框架负责,开发者对底层细节不用关心。(*) 目前流行的ORM工具有以下几个: (1) Hibernate (主流的) (2) MyBatis(IBatis) (3) JPA (4) Toplink

三、Hibernate框架结构

Hibernate框架使用时,需要以下几个重要文件: (1) 实体类(*.java,n个)

(2) hibernate.cfg.xml(仅1个)(src下) Hibernate框架的主配置文件,主要定义数据库和框架的一些连接参数。 (3) *.hbm.xml(n个)

Hibernate框架的映射描述文件,主要描述实体类和数据表,类属性和表字段之间的对应关系。

(4) Hibernate 编程API a. Configuration ----负责加载hibernate.cfg.xml配置文件 b. SessionFactory ----负责生成数据库的连接对象(Session)

c. Session ----代指程序与数据库的连接,用于执行增、删、改、

查基本操作

1

d. Query e. Transaction

----用于执行非主键查询的操作(HQL语句)

----用于事务控制,将两个或两个以上DML操作封装成一个整体操作。

四、Hibernate基本应用(*****) 1:使用步骤

step1,引入hibernate框架开发包、数据库驱动包 step2,引入hibernate.cfg.xml配置文件 step3,根据数据表编写一个实体类

step4,编写hbm.xml映射描述文件(描述实体类和表之间的对应关系) step5,使用Hibernate API编程

//按主键作条件查询 session.load(); session.get(); //添加记录-插入 session.save(obj);

--主键值生成方式在hbm.xml映射描述部分设置 --进行DML操作,必须显示追加事务commit //更新记录-更新1行(按主键做条件) session.update(obj);

--obj需要通过session.get/load查询,不推荐new方式,因为会将未设置属性值的字段清空

//删除记录-删除1行(按主键做条件) session.delete(obj);

--obj可以通过session.get/load查询,也可以new指定id值。

五、Hibernate映射类型

在hbm.xml中定义属性和字段映射时,通过type属性指定映射类型,可以采用下面两种方法指定: 1:指定Java类型 java.lang.String java.lang.Integer

2:Hibernate映射类型(推荐) 字符串:String

整数:byte,short,integer,long 浮点数:float,double

日期:date,time,timestamp boolean类型:

true_false : 完成实体类boolean属性和表字段char之间的转换。 true值转换成T; false值转换成F

yes_no : 完成实体类boolean属性和表字段char之间的转换。 true值转换成Y; false值转换成N

2

=================== create table t_foo( id number(9) primary key,

name varchar2(20), birth date,

login_time timestamp,

marry char(1));

create table t_foo( id int primary key auto_increment, name varchar(30), birth date, login_time timestamp, marry char(1) ) default charset=utf8;

day81(2013-11-27)

一、主键生成方法(Hibernate对主键的管理)

在hbm.xml映射描述中,可以指定主键值采用哪种方法生成和管理。(仅适用于添加操作)

//….

class属性用于指定主键生成方法,Hibernate提供了以下几个预定义的方法: 1) sequence

---采用一个序列生成主键值(只用于Oracle)

指定序列名称(默认名:hibernate_sequence) 2) identity

---Hibernate会利用数据库自动增长机制生成主键(mysql, sqlserver)

注意:建表时需要为主键字段设置自增长功能!

3) native

---根据hibernate.cfg.xml中的dialect属性指定主键生成方法。如果dialect是OracleDialecct会采用sequence方法;如果是MySQLDialect会采用identity方法。

4) increment(适用于各种数据库)

--首先发送一个select max(ID)语句查询当前表中ID最大值,然后将最大值+1给insert语句指定。

3

二、Hibernate基本特性

1:一级缓存(以内存空间换取时间的一种策略)(*****) 1)什么是一级缓存

session.get/load方法时,会先去一级缓存查找,没有对象信息才去数据库查找,查找后将返回的对象放入一级缓存。后续再查找该对象会返回缓存中的信息,从而减少了访问数据库的次数。

一级缓存是属于Session级别的缓存,由Session对象负责管理。不同的Session对象有不同的缓存空间,不能互相访问。

2)一级缓存的好处

利用同一个Session多次访问同一个实体对象时,对数据库只查访一次,后续几次从缓存获取。

3)一级缓存的管理 session.evict(obj);//将obj对象从一级缓存移出 session.clear(); //清空一级缓存的所有对象 session.close(); // 关闭连接,释放缓存资源 ========================

//循环次数很多,每次id不同时 for(){

Cost cost = (Cost) session.get(Cost.class, id); //使用cost对象--省略 session.evict(cost);//及时清理缓存的对象

}

========================

2:对象持久化

1)什么是持久化

Hibernate的持久化指的是将程序中Java对象的数据以数据库存储形式保存下来。

Hibernate是一个持久层框架。

持久层里面都是由持久对象构成,这些对象的持久化操作由Hibernate实

4

注意:该方式在并发时,有可能产生重复ID,因此并发几率高时,不要使用。 5) assigned

--Hibernate会放弃主键值的生成和管理。意味着程序员需要在程序中显式指定ID值。 6) hilo、uuid等算法

hilo:采用高低位算法生成一个主键值

uuid:采用UUID算法生成一个主键值(字符串类型的ID)

注意:id的字段值用varchar(40)