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,域对象之间的关联。
域对象(domain object):构成域模型的基本元素就是域对象。
对真实世界的实体的软件抽象,也叫做业务对象(Business Object,BO)。
域对象可代表业务领域中的人、地点、事物或概念。
域对象分为以下几种:1,实体域对象:通常是指业务领域中的名词。
(plain old java object,简单Java 对象)。
2,过程域对象:应用中的业务逻辑或流程。
依赖于实体域对象,业务领域中的动词。
如发出订单、登陆等。
3,事件域对象:应用中的一些事件(警告、异常)。
1.2.2.域对象间的关系关联:类间的引用关系。
以属性定义的方式表现。
依赖:类之间访问关系。
无需定义成属性。
在A中访问B中的方法或属性,或者A负责实例化B。
聚集(Aggregation):整体与部分的关系。
例人与手的关系。
部分类的对象不能单独存在,他的生命周期依赖于整体类的对象的生命周期,整体消失时,部分也随之消失。
一般化(Generalization):类之间继承关系。
1.2.3.域对象的持久化概念实体域对象在内存中创建后,不能永久存在。
将实体域对象永久保存起来,就是持久化的过程。
通常只有实体域对象需要持久化,过程域对象和事件域对象一般不需要持久化。
广义持久化指增、删、改、查。
1.3.ORM与ORM框架1.3.1.ORM(Object/Relation Mapping)对象关系映射(Object Relational Mapping,简称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语句优化功能。
TopLinkOJB1.3.3.Hibernate 与 Jdbc 代码对比1.4.小结2.Hibernate入门(HelloWorld)2.1.Hibernate介绍Hibernate是一个基于jdbc的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。
Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑。
Hibernate的主页为:/Hibernate的下载地址:/projects/hibernate/files/hibernate3/ HibernateTools的下载地址:/projects/jboss/files/JBossTools/JBossTools 3.1.x/HibernateTools-3.3.1.v201006011046R-H111-GA.zip/download2.2.Hibernate的体系结构与开发步骤Hibernate的体系结构Hibernate开发步骤2.3.第一个Hibernate程序(HelloWorld)2.3.1.创建Eclipse工程并引入相关的jar包新建Java工程,并添加如下jar包:1,{hibernate_home}/hibernate3.jar2,{hibernate_home}/lib/required/*.jar3,{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.jar2,slf4j-log4j12-1.6.1.jar2.3.2.创建持久化对象:User2.3.3.创建对象-关系映射文件:User.hbm.xml2.3.4.创建Hibernate 配置文件:hibernate.cfg.xml创建表、JavaBean、写映射文件2.3.5.通过Hibernate API 编写访问数据库的代码编程步骤1,获取 Configuration 对象。
2,获取 SessionFactory 对象。
3,获取 Session,打开事务。
4,用面向对象的方式操作数据库。
5,关闭事务,关闭 Session。
增删改查功能的实现代码3.Hibernate API简介3.1.ConfigurationConfiguration 类负责管理 Hibernate 的配置信息包括如下内容:1,Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC 驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件)。
2,持久化类与数据表的映射关系(*.hbm.xml文件)。
•创建 Configuration 的两种方式1,属性文件(hibernate.properties)Configuration cfg = new Configuration();2,Xml文件(hibernate.cfg.xml)a)加载默认名称的配置文件(hibernate.cfg.xml)Configuration cfg = new Configuration().configure();b)或加载指定名称的配置文件:Configuration cfg = new Configuration().configure(―myhibernate.cfg.xml‖);3.2.SessionFactoryConfiguration对象根据当前的配置信息生成 SessionFactory 对象。
SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。
同时,SessionFactory还负责维护Hibernate的二级缓存)。
相关代码如下:Configuration cfg = new Configuration().configure();SessionFactory sessionFactory = cfg.buildSessionFactory();1,SessionFactory是线程安全的。
2,SessionFactory是生成Session的工厂:Session session = sessionFactory.openSession();3,构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个SessionFactory 对象。
3.3.SessionSession 是应用程序与数据库之间交互操作的一个单线程对象,是 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代表一次原子操作,它具有数据库事务的概念。
所有持久层都应该在事务管理下进行,即使是只读操作。
●代表一次原子操作,它具有数据库事务的概念。
所有持久层都应该在事务管理下进行,即使是只读操作。
Transaction tx = session.beginTransaction();●常用方法:commit():提交相关联的session实例rollback():撤销事务操作wasCommitted():检查事务是否提交3.5.Query和Criteria接口都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,他引用类名及类的属性名,而不是表名和字段名。