汤阳光Hibernate36完整版.docx

上传人:b****6 文档编号:7578079 上传时间:2023-01-25 格式:DOCX 页数:67 大小:2.94MB
下载 相关 举报
汤阳光Hibernate36完整版.docx_第1页
第1页 / 共67页
汤阳光Hibernate36完整版.docx_第2页
第2页 / 共67页
汤阳光Hibernate36完整版.docx_第3页
第3页 / 共67页
汤阳光Hibernate36完整版.docx_第4页
第4页 / 共67页
汤阳光Hibernate36完整版.docx_第5页
第5页 / 共67页
点击查看更多>>
下载资源
资源描述

汤阳光Hibernate36完整版.docx

《汤阳光Hibernate36完整版.docx》由会员分享,可在线阅读,更多相关《汤阳光Hibernate36完整版.docx(67页珍藏版)》请在冰豆网上搜索。

汤阳光Hibernate36完整版.docx

汤阳光Hibernate36完整版

1.Java对象持久化概述

1.1.应用程序的分层体系结构

1.1.1.基于B/S的典型三层架构

说明:

1,展现层:

提供与用户交互的界面。

2,业务逻辑层:

实现各种业务逻辑。

3,数据访问层:

负责存放和管理应用程序的持久化业务数据。

1.1.2.数据访问层与Hibernate在Java应用程序中的角色

数据访问层(持久化层)封装了数据访问的细节,为业务逻辑层提供了面向对象的API。

完善的持久化层应该达到的目标:

1,代码重用性高,可完成所有的数据访问操作。

2,如果需要的话,能够支持多种数据库平台。

3,具有相对独立性,当持久化层变化时,不会影响上层实现。

在数据访问层(持久化层)中可以使用Hibernate框架以实现要求,如下图所示:

1.2.软件模型

1.2.1.各种模型的说明

概念模型:

模拟问题域中的真实实体。

描述每个实体的概念和属性及实体间关系。

不描述实体行为。

实体间的关系有一对一、一对多和多对多。

关系数据模型:

在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。

有以下内容组成:

1,若干表

2,表的所有索引

3,视图

4,触发器

5,表与表之间的参照完整性

域模型:

在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。

组成部分:

1,具有状态和行为的域对象。

2,域对象之间的关联。

域对象(domainobject):

构成域模型的基本元素就是域对象。

对真实世界的实体的软件抽象,也叫做业务对象(BusinessObject,BO)。

域对象可代表业务领域中的人、地点、事物或概念。

域对象分为以下几种:

1,实体域对象:

通常是指业务领域中的名词。

(plainoldjavaobject,简单Java对象)。

2,过程域对象:

应用中的业务逻辑或流程。

依赖于实体域对象,业务领域中的动词。

如发出订单、登陆等。

3,事件域对象:

应用中的一些事件(警告、异常)。

1.2.2.域对象间的关系

关联:

类间的引用关系。

以属性定义的方式表现。

 

依赖:

类之间访问关系。

无需定义成属性。

在A中访问B中的方法或属性,或者A负责实例化B。

 

聚集(Aggregation):

整体与部分的关系。

例人与手的关系。

部分类的对象不能单独存在,他的生命周期依赖于整体类的对象的生命周期,整体消失时,部分也随之消失。

 

一般化(Generalization):

类之间继承关系。

1.2.3.域对象的持久化概念

实体域对象在内存中创建后,不能永久存在。

将实体域对象永久保存起来,就是持久化的过程。

通常只有实体域对象需要持久化,过程域对象和事件域对象一般不需要持久化。

广义持久化指增、删、改、查。

1.3.ORM与ORM框架

1.3.1.ORM(Object/RelationMapping)

对象关系映射(ObjectRelationalMapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。

ORM主要解决对象-关系的映射

面向对象概念

面向关系概念

对象

表的行(记录)

属性

表的列(字段)

ORM的实现思想:

将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。

因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。

ORM采用元数据来描述对象-关系映射细节

元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中。

ORM中间件的使用方法

采用元数据来描述对象-关系映射细节,元数据通常采用xml格式,并存放在专门的对象-关系映射文件中。

只要配置了持久化类与表的映射关系,orm中间件在运行时就能够参照映射文件的信息,把域对象持久化到数据库中。

例(Hibernate):

1.3.2.流行的ORM框架

Hibernate:

非常优秀、成熟的ORM框架。

提供强大的对象和关系数据库映射以及查询功能。

Hibernate是面向对象的程序设计语言和关系型数据库之间的桥梁,允许开发者采用面向对象的方式来操作关系数据库。

Hibernate的目标是释放开发者通常的与数据库持久化相关的编程任务的95%。

消除那些针对特定数据库厂商的SQL代码。

Ibatis:

相比Hibernate灵活高,运行速度快。

开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练使用sql语句优化功能。

TopLink

OJB

1.3.3.Hibernate与Jdbc代码对比

1.4.小结

2.Hibernate入门(HelloWorld)

2.1.Hibernate介绍

Hibernate是一个基于jdbc的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。

Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑。

Hibernate的主页为:

http:

//www.hibernate.org/

Hibernate的下载地址:

HibernateTools的下载地址:

2.2.Hibernate的体系结构与开发步骤

Hibernate的体系结构

Hibernate开发步骤

2.3.第一个Hibernate程序(HelloWorld)

2.3.1.创建Eclipse工程并引入相关的jar包

新建Java工程,并添加如下jar包:

1,{hibernate_home}/hibernate3.jar

2,{hibernate_home}/lib/required/*.jar

3,{hibernate_home}/lib/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jar

4,数据库对应的JDBC驱动(例如mysql-connector-java-5.1.5-bin.jar)

还可以加入日志相关的jar包(不加也可以):

1,log4j-1.2.15.jar

2,slf4j-log4j12-1.6.1.jar

2.3.2.创建持久化对象:

User

2.3.3.创建对象-关系映射文件:

User.hbm.xml

Customer类属性

Java类型

Hibernate类型

Cutomers字段名

Sql类型

Name

java.lang.String

string

NAME

Varchar(12)

age

int

int

age

INT

Sex

char

character

SEX

CHAR

(1)

Married

boolean

boolean

married

bit

Des

java.lang.String

text

des

CLOB

Pic

byte[]

binary

pic

BLOB

Birthday

java.sql.Date

date

BIRTHDAY

DATE

registeredTime

java.sql.TimeStamp

timestamp

REGISTERED_TIME

TIMESTAMP

2.3.4.创建Hibernate配置文件:

hibernate.cfg.xml

创建表、JavaBean、写映射文件

2.3.5.通过HibernateAPI编写访问数据库的代码

编程步骤

1,获取Configuration对象。

2,获取SessionFactory对象。

3,获取Session,打开事务。

4,用面向对象的方式操作数据库。

5,关闭事务,关闭Session。

增删改查功能的实现代码

3.HibernateAPI简介

3.1.Configuration

Configuration类负责管理Hibernate的配置信息

包括如下内容:

1,Hibernate运行的底层信息:

数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)。

2,持久化类与数据表的映射关系(*.hbm.xml文件)。

创建Configuration的两种方式

1,属性文件(hibernate.properties)

Configurationcfg=newConfiguration();

2,Xml文件(hibernate.cfg.xml)

a)加载默认名称的配置文件(hibernate.cfg.xml)

Configurationcfg=newConfiguration().configure();

b)或加载指定名称的配置文件:

Configurationcfg=newConfiguration()

.configure(“myhibernate.cfg.xml”);

3.2.SessionFactory

Configuration对象根据当前的配置信息生成SessionFactory对象。

SessionFactory对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。

同时,SessionFactory还负责维护Hibernate的二级缓存)。

相关代码如下:

Configurationcfg=newConfiguration().configure();

SessionFactorysessionFactory=cfg.buildSessionFactory();

2,SessionFactory是线程安全的。

3,SessionFactory是生成Session的工厂:

Sessionsession=sessionFactory.openSession();

4,构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象。

3.3.Session

Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。

此对象的生命周期很短。

Session中有一个缓存,显式执行flush()方法之前,所有的持久层操作的数据都缓存在session对象处。

(相当于JDBC中的Connection)

●持久化类与Session关联起来后就具有了持久化的能力。

●Session是线程不安全的

●Session类的一些方法:

取得持久化对象的方法:

get()load()

持久化对象都得保存,更新和删除:

save(),update(),saveOrUpdate(),delete()

开启事务:

beginTransaction().

管理Session的方法:

isOpen(),flush(),clear(),evict(),close()等

3.4.Transaction

代表一次原子操作,它具有数据库事务的概念。

所有持久层都应该在事务管理下进行,即使是只读操作。

●代表一次原子操作,它具有数据库事务的概念。

所有持久层都应该在事务管理下进行,即使是只读操作。

Transactiontx=session.beginTransaction();

●常用方法:

commit():

提交相关联的session实例

rollback():

撤销事务操作

wasCommitted():

检查事务是否提交

3.5.Query和Criteria接口

都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。

Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,他擅长执行动态查询。

3.6.Hibernate的运行过程

Hibernate的运行过程如下:

1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,

2、并用这些信息生成一个SessionFactory对象,

3、然后从SessionFactory对象生成一个Session对象,

4、并用Session对象生成Transaction对象;

A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;

B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。

4.对象/关系数据库映射

(一)基础

4.1.持久化对象与OID

4.1.1.对持久化对象的要求

1.提供一个无参的构造器。

使Hibernate可以使用Constructor.newInstance()来实例化持久化类。

2.提供一个标识属性(identifierproperty)。

通常映射为数据库表的主键字段。

如果没有该属性,一些功能将不起作用,如:

Session.saveOrUpdate()。

3.为类的持久化类的字段声明访问方法(get/set)。

Hibernate对JavaBeans风格的属性实行持久化。

4.使用非final类。

在运行时生成代理是Hibernate的一个重要的功能。

如果持久化类没有实现任何接口,Hibnernate使用CGLIB生成代理。

如果使用的是final类,则无法生成CGLIB代理。

(不能有子类就会影响后面懒加载的功能)

5.重写eqauls()和hashCode()方法。

如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法。

4.1.2.OID

为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。

在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Objectidentifier-OID)。

4.2.对象/关系数据库映射文件(hbm.xml)

Hibernate采用XML格式的文件来指定对象和关系数据之间的映射。

在运行时Hibernate将根据这个映射文件来生成各种SQL语句.(可以有多个Class,一般一个对象对应一个映射文件)

映射文件的扩展名为“.hbm.xml”。

 

映射文件示例:

4.3.持久化类的属性及属性映射(普通属性)

映射配置示例

4.3.1.持久化类的属性及访问方法

Hibernate中持久化类的访问者有两个:

1,Java应用程序

2,hibernate(何时调用get、set方法?

如下图所示)

4.3.2.使用基本数据类型和包装类型的区别

基本数据类型和包装类型对应的hibernate映射类型相同(映射是一样的),例:

4.3.3.Hibernate访问持久化类属性的策略

propertye(默认值):

表明hibernate通过getXXX和setXXX来访问类属性。

推荐使用。

提高域模型透明性。

field

hibernate通过java反射机制直接访问类属性。

对于没有get与set方法的属性可设置该访问策略。

noop

它映射Java持久化类中不存在的属性,即主要用于HQL(用query接口测试,使用hql语句)中,当数据库中有某列,而实体中不存在的情况。

示例:

在持久化类的方法中加入程序逻辑

在Customer.hbm.xml文件中无需映射firstname和lastname属性,而是映射name属性

4.3.4.设置派生属性(formula)

利用元素的formula属性,用来设置一个sql表达式,hibernate将根据它来计算出派生属性的值。

如果指定了formula属性,则就会insert=”false”update=”false”

4.3.5.控制insert、update语句

映射属性

作用

insert属性

若为false,在insert语句中不包含该字段,该字段永远不能被插入。

默认值true。

update属性

若为false,update语句不包含该字段,该字段永远不能被更新。

默认值为true。

mutable属性

若为false,等价于所有的元素的update属性为false,整个实例不能被更新。

默认为true。

dynamic-insert属性

若为true,等价于所有的元素的insert为true,保存一个对象时,动态生成insert语句,语句中仅包含取值不为null的字段。

默认false。

dynamic-update属性

若为true,等价于所有的元素的update为true,更新一个对象时,动态生成update语句,语句中仅包含取值不为null的字段。

默认false。

4.3.6.处理sql引用表示符

在SQL语法中,表示符是指用于为数据库表、视图、字段或索引等名字的字符串,常规表示符不包括空格,也不包含特殊字符,因此无需使用引用符号。

如果数据库表名或列名包含特殊字符,可以使用引用表示符(键盘~下面的字符)。

4.3.7.设置类的包名

如果在一个映射文件中包含多个类,并且这些类位于同一个包中,可以设置元素的package属性,以避免为每个类提供完整的类名。

指定类的全限定名

元素的指定package,就只需指定简单类名了

 

4.4.映射对象标识符(OID,对应数据库主键)

4.4.1.OID,唯一性的标志

关系数据库用主键区分是否是同一条记录。

Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系。

对象的OID和数据库的表的主键对应。

为保证OID的唯一性,应该让Hibernate来为OID赋值。

主键必备条件:

1,不能为null。

2,唯一,不能重复。

3,永远不会改变。

4.4.2.自然主键和代理主键

自然主键:

把具有业务含义的字段作为主键叫做自然主键。

代理主键:

不具备业务含义的字段,该字段一般取名为“id”。

(推荐)

4.4.3.数据库中的主键介绍

关系数据库按主键区分不同记录

把主键定义为自动增长类型

在mySQL中,把字段设为auto_increment类型,数据库会自动为主键赋值。

在msSQLserver中,把字段设为identity类型,数据库会自动为主键赋值。

oracle从序列(sequence)中获取自动增长的描述符

createsequenceseq_customerincrementby2startwith1

insertintocustomersvalues(seq_customer.curval,’..’)

4.4.4.java与Hibernate如何区分对象

Java语言按内存地址(==)或equals()方法区分不同的对象

Hibernate中用对象表示符(OID)来区分对象

OID是关系数据库中的主键在java对象模型中的等价物。

在运行时,hibernate根据OID来维持java对象和数据库记录的对应关系。

Hibernate使用OID来区分对象,不是equals()方法!

所以不重写持久化类的hashCode()与equals()方法Hibernate也可以正确运行(但要放到HashSet等集合中时要注意需要重写这两个方法)。

4.4.5.ID和generator元素配置说明

配置示例:

元素说明:

设定持久化类的OID和表的主键的映射,可以有以下属性:

♦name:

标识持久化类OID的属性名

♦column:

设置标识属性所映射的数据列的列名(主键字段的名字).

♦unsaved-value:

若设定了该属性,Hibernate会通过比较持久化类的OID值和该属性值来区分当前持久化类的对象是否为临时对象,在Hibernate3中几乎不再需要.

♦type:

指定Hibernate映射类型.Hibernate映射类型是Java类型与SQL类型的桥梁.如果没有为某个属性显式设定映射类型,Hibernate会运用反射机制先识别出持久化类的特定属性的Java类型,然后自动使用与之对应的默认的Hibernate映射类型

♦Java的基本数据类型和包装类型对应相同的Hibernate映射类型.基本数据类型无法表达null,所以对于持久化类的OID推荐使用包装类型

元素说明

设定持久化类设定标识符生成器,可以有一个class属性:

♦class:

指定使用的标识符生成器全限定类名或其缩写名。

元素的class属性可以指定的值说明(主键生成策略)

主键生成器

描述

increment

适用于代理主键。

由hibernate自动以递增的方式生成表识符,每次增量为1。

identity

适用于代理主键。

由底层数据库生成表识符。

条件是数据库支持自动增长数据类型。

sequence

适用于代理主键。

Hibernate根据底层数据库序列生成标识符。

条件是数据库支持序列。

hilo

适用于代理主键。

Hibernate根据hign/low算法生成标识符。

Hibernate把特定表的字段作为“hign”值。

默认情况下,采用hibernate_unique_key表的next_hi字段。

native

适用于代理主键。

根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo

uuid.hex

适用于代理主键。

Hibernate采用128位的UUID算法

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1