发布时间 : 星期三 文章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会利用数据库自动增长机制生成主键(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)