Hibernate3课程文档一Word文档下载推荐.docx

上传人:b****5 文档编号:21507127 上传时间:2023-01-30 格式:DOCX 页数:66 大小:2.92MB
下载 相关 举报
Hibernate3课程文档一Word文档下载推荐.docx_第1页
第1页 / 共66页
Hibernate3课程文档一Word文档下载推荐.docx_第2页
第2页 / 共66页
Hibernate3课程文档一Word文档下载推荐.docx_第3页
第3页 / 共66页
Hibernate3课程文档一Word文档下载推荐.docx_第4页
第4页 / 共66页
Hibernate3课程文档一Word文档下载推荐.docx_第5页
第5页 / 共66页
点击查看更多>>
下载资源
资源描述

Hibernate3课程文档一Word文档下载推荐.docx

《Hibernate3课程文档一Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Hibernate3课程文档一Word文档下载推荐.docx(66页珍藏版)》请在冰豆网上搜索。

Hibernate3课程文档一Word文档下载推荐.docx

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

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

域对象分为以下几种:

1,实体域对象:

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

(plainoldjavaobject,简单Java对象)。

2,过程域对象:

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

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

如发出订单、登陆等。

3,事件域对象:

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

1.2.2.域对象间的关系

关联:

类间的引用关系。

以属性定义的方式表现。

 

依赖:

类之间访问关系。

无需定义成属性。

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

聚集(Aggregation):

整体与部分的关系。

例人与手的关系。

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

一般化(Generalization):

类之间继承关系。

1.2.3.域对象(Domain)的持久化概念

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

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

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

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

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的下载地址:

我们所学的版本是3.6.0

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

Sex

char

character

SEX

CHAR

(1)

Married

boolean

married

bit

Des

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();

1,SessionFactory是线程安全的。

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

3,SessionFactory是生成Session的工厂:

Sessionsession=sessionFactory.openSession();

3.3.Session

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

此对象的生命周期很短。

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

(相当于JDBC中的Connection)。

一般一个业务操作使用一个Session。

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

●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语句

映射文件的后缀为“.hbm.xml”。

映射文件示例:

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

映射配置示例

<

propertyname=”username”type=”string”length=”64”/>

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)

利用<

property>

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

111111*********11111111111111111111111111111111111111111111111111

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

4.3.5.控制insert、update语句

映射属性

作用

insert属性

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

默认值true。

update属性

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

默认值为true。

class>

mutable属性

若为false,等价于所有的<

元素的update属性为false,整个实例不能被更新。

默认为true。

dynamic-insert属性

若为true,等价于所有的<

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

默认false。

dynamic-update属性

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

4.3.6.处理sql引用表示符

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

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

4.3.7.设置类的包名

如果在一个映射文件中包含多个类,并且这些类位于同一个包中,可以设置<

hibernate-mapping>

元素的package属性,以避免为每个类提供完整的类名。

指定类的全限定名

在<

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

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

4.4.1.OID,唯一性的标志

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

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

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

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

主键必备条件:

1,不能为null。

2,唯一,不能重复。

3,永远不会改变。

4.4.2.自然主键和代理主键

业务主键(自然主键):

在数据库表中把具有业务逻辑含义的字段作为主键,称为“自然主键(NaturalKey)”。

逻辑主键(代理主键):

在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键,称为“代理主键”。

复合主键(联合主键):

通过两个或者多个字段的组合作为主键。

自然主键:

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

代理主键:

不具备业务含义的字段,该字段一般取名为“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元素配置说明

配置示例:

idname=“id”type=“long”column=“ID”>

<

generatorclass=“increment”/>

/id>

id>

元素说明:

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

♦name:

标识持久化类OID的属性名

♦column:

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

♦unsaved-value:

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

♦type:

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

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

generator>

元素说明

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

♦class:

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

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

主键生成器

描述

increment

适用于代理主键。

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

ident

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

当前位置:首页 > 考试认证 > 交规考试

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

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