1. 使用Hibernate完成对象持久化
1.1 目标
理解Hibernate的基本原理
使用Hibernate完成对一张表的CRUD
1.2 单词
1.3 基本概念
对象/关系映射:O/R Mapping
POJO:Plain Old Java Object,普通古老的Java对象。
1.4 Hibernate的基本原理
对象/关系映射:O/R Mapping
1.5 使用Hibernate
一、 概念
1、 背景
Gavin King,
2、 Hibernate是什么(What)?
是一个轻量级的持久层O/R Mapping框架。
轻量级:占用资源少、开发较简单。
O/R Mapping:Object/Relationship Mapping,对象/关系映射,指的是Java类和关系数据库的表之间的映射(框架会把程序对实体对象的操作,指的创建、修改、删除、查询等操作,转换为对应的表的操作)。
POJO:Plain Old Java Object,普通古老的Java对象,就是JavaBean或者实体类。
重量级框架:EJB中的EntityBean(实体Bean)
3、 为什么要学习Hibernate(Why,作用)?
JDBC
优点:执行速度快。
缺点:对开发人员要求比较高;开发时效率低;不便于维护;
优点:O/R Mapping符合面向对象的思想;方便迁移;提高开发效率;。
缺点:速度比JDBC慢。
4、 备选的持久层框架
Hibernate:O/R Mapping
iBatis:直接执行SQL语句。
EJB3:分布式组件。
JPA:下一代Java持久层框架。
5、 Hibernate由什么组成(What)?
Jar文件:hibernate.jar
配置文件:hibernate.cfg.xml
6、 Hibernate的程序由什么组成(What)?
主配置文件:hibernate.cfg.xml
映射配置文件:*.hbm.xml
实体类:
二、 如何使用Hibernate来开发项目(How)?
1、 创建数据和表
要求表必须有主键。
2、 配置数据库连接
3、 添加Hibernate框架到工程(生成hibernate.cfg.xml)
把所有Hibernate的jar文件复制到/WEB-INF/LIB/目录下;
把所有Hibernate的xml文件复制到/WEB-INF目录下;
直接:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bookdb;
4、 根据自动生成实体类、映射文件、和DAO(Data Access Object)类;
主键生成策略:
Assigned:由程序给数据库的主键赋值。
Identity:由SQL Server的自增长列。
Sequence:oracle数据库中标识列
Increment:由hibernate生成新的自动增长的主键。
Native:根据数据库的不同,选择identity、sequence等中的一个。
5、 Hibernate中重要的类
Org.hibernate.cfg.Configuation:配置类,加载hibernate配置文件。
SessionFactory:session工厂类,专门负责创建session对象。重量级类,线程安全。
Org.hibernate.Session:轻量级类,非线程安全的,负责完成O/R mapping的工作(自动生成SQL语句并执行)。
Get(Class cls,Serializable key):根据主键取得指定的对象。
Save(object):保存(新增)。
Update(object):更新。
Delete(object):删除。
三、 Hibernate中常用的类
Session:
Org.hibernate.Query:查询接口,执行HQL语句
SQLQuery子类,执行SQL查询语句。
l Criteria:标准,执行标准查询。
l Restrictions,条件(相当于sql语句中where条件),用来组装各种条件。
l Expression:表达式,同Restrictions用来组装条件,用在Hibernate3.0以前的版本,在3.1后过时了。
l Projections:投影(相当于sql语句中group by、avg、max等条件),用来组装分组、统计等条件。
l ProjectionList:投影集合,ProjectionList pList= Projections. projectionList();
pList.add(Projections.avg(…));
…
Crit.setProjection(pList);
l Order:排序(相当于sql语句中的order by)。
四、 HQL
1、 基本语法:
[Select/update/delete ……] [from……] [where……][group by ……[having……]][order by……]
HQL的关键字不区分大小写,但是类和属性区分大小写。
类名可以采用全路径类名。
From TUser:返回所有TUser对象及TUser的子对象。
From java.lang.Object:返回数据库中所有表的所有数据。
Where条件:=,<>,<,>,>=,<=,between,not between,in,not in,like,is等和and ,or,not。
Where子句中:可以使用表达式。
2、 属性查询
What:Select:后可以指定属性名称,例如:select a.Name from Users a。
When:当我们不需要整个对象,而只需要这个对象中一个或者多个属性时,我们采用属性查询。
3、 实体更新与删除
4、 分组与排序
5、 参数绑定
l 顺序占位符:
l 引用占位符:
6、
五、 对象/关系映射(O/R Mapping)基础
1、 主键生成策略
Assigned:赋值,由程序给主键赋值。
Increment:自动增长,由hibernate自动增长。Max(id)+1
Identity:标示列,由数据库自己实现主键自动增长。支持的数据库有DB2、MySQL、MS SQL server、Sybase等。
Sequence:序列,由数据库的序列列实现主键自动增长。支持的数据库有DB2、Oracle、SAP DB等。
Native:本地的,根据数据库的类型,选择identity、sequence、hilo之中的一种。
六、 对象/关系映射(O/R Mapping)高级—关系映射
1. 为什么要学习关系映射?
优点:它是Hibernate O/R Mapping的一部分;它是面向对象编程,带来一些方便。
缺点:性能下降;复杂的映射比较麻烦。
2. 类与类之间的关系类型:
a) 关联:A类作为B类的一个属性。例如:人与汽车。
一对一、一对多、多对一、多对多。
b) 泛化:A类继承B类。
c) 依赖:A类作为B类方法的参数。
d) 聚合:A类作为B类的一个属性,但是,从含义上,A类是B类一个组成部分。例如:电脑与鼠标
e) 组合:是一种强聚合关系.A类作为B类的一个属性,在B类的构造方法中,会创建A类的对象。但是,从含义上,A类是B类一个组成部分。部分离开整体后,就没有存在的含义。例如:人和头。
f) 实现:接口和实现类。
类与类之间除了关系的类型外,还有数量关系:
一对一、一对多、多对一、多对多。
3. 常用的关系类型:
关联关系
4. 关联关系映射
1) 一对一:
a) 主键关联:
b) 唯一外键关联:
2) 一对多/多对一
3) 多对多:
七、 序列化(java.io.Serializable)
序列化:将Java对象的状态(属性的值),写入特定的存储介质,而进行的编码成二进制流的过程。
反序列化:将存储在特定存储介质上的Java对象的状态,读取出来,并解码成Java对象(unicode编码)的过程。
什么时候实体需要实现序列化接口:这个实体类的对象需要写入硬盘或者在网络传输的时候。
八、 Hibernate中实体对象的状态
临时状态(Transient):刚用new语句创建,没有持久化,并且不在Session的缓存中。(内存中有,数据库中没有)
持久化状态(persistent):这个对象已经被持久化,且被加入到Session的缓存当中。(内存中有,数据库也有,关联起来被管理)
游离/脱管状态(detached):该对象已经被持久化,但是不处于Session的缓存中。()
九、