1.Hibernate框架
1.分层体系结构与持久化
三层体系结构:
分层体系结构:
指的是将系统的组件分隔到不同的层中,每一层中的组件应保持内聚性,并且应大致在同一抽象级 别; 每一层都应与它下面的各层保持松散耦合。
层与层之间存在自上而下的依赖关系,即上层组件会访问下层组件的API,而下层组件不应该依赖上层 组件。
每个层对上层公开API,但具体的实现细节对外透明。当某一层的实现发生变化,只要它的API不变, 不会影响其他层的实现。
持久化层:
为了把数据访问细节和业务逻辑分开,可以把数据访问作为单独的持久化层。
什么是持久化:
瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态。
持久状态:保存在数据库(磁盘)的程序数据,程序退出后,数据依然存在,称为程序数据的持久状态。
持久化:将程序数据在瞬时状态和持久化状态之间转换的机制。
持久化层
持久化层封装了数据访问细节,为业务逻辑层提供面向对象的API,使业务逻辑层可以专注于实现业务逻辑。
MVC设计模式与四层结构的对应关系:
持久化层设计目标:
持久化层的设计目标:
代码可重用性高,能够完成对象持久化操作;
如果需要的话,能够支持多种数据库平台;
具有相对独立性,当持久层发生变化时,不会影响上层实现。
Hibernate是持久化层框架。
2.软件的模型及ORM
软件的模型:
在软件开发领域,模型用来表示真实世界的实体。
在软件开发的不同阶段,需要为目标系统创建不同类型的模型:
在分析阶段,需要创建概念模型;
在设计阶段,需要创建域模型和数据模型。
模型之间的关系:软件分析阶段 软件设计阶段 概念模型 域模型 数据模型
概念模型:
概念模型用来模拟问题域中的真实实体。
概念模型描述了每个实体的概念和属性,以及实体之间的关系。
概念模型并不描述实体的行为。
关系数据模型:
关系数据模型是在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构,它由以下内容组成:
一个或多个表;
表与表之间的参照完整性;
表的所有索引;
触发器;
视图。
域模型:
域模型是面向对象的,在面向对象术语中,域模型也可称为设计模型。
域模型由以下内容组成:
具有状态和行为的域对象;
域对象之间的关系。
域对象:
域对象可以代表业务领域中的人、地点、事物或概念等。域对象分为以下几种:
实体域对象:业务领域的名词;
过程域对象:业务领域的动词;
事件域对象:业务领域中的事件。
域对象关联关系:一对多 多对一 双向一对多
对象-关系映射:
域模型与关系模型之间存在许多不匹配问题:
域模型中有继承关系,关系模型不能直接表示继承关系。
域模型中有多对多关联关系,关系模型通过连接表来表示多对多关联关系。
域模型中有双向关联关系,关系模型只有单向参照关系,而且总是many方参照one方。
域模型提倡精粒度模型,而关系模型提倡粗粒度模型。
对象-关系映射(Object Relational Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把域模型表示的对象映射到关系数据模型对应的数据库结构中去。
通过ORM模式在操作实体对象的时候,就不需要再去和复杂的 SQL语句打交道,只需简单的操作实体对象的属性和方法,ORM 技术是在对象和关系之间提供了一条桥梁,对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。
ORM框架:
通过JDBC实现的缺点:
业务逻辑和关系数据绑定,如果关系数据模型发生变化,例如修改了表的结构,那么必须手工修改程序代码中所有相关的SQL语句,增加了软件维护的难度。
如果程序代码中的SQL语句包含语法错误,在编译时不能检查这种错误,在运行时才能发现这种错误,这增加了调试程序的难度。
3.Hibernate介绍
Hibernate是什么?
在分层体系结构中Hibernate位于持久层,是完成对象持久化的持久层框架;
Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架;
Hibernate是对JDBC API的封装,是JDBC轻量级封装框架。
Hibernate能带给我们什么?
Hibernate实现了ORM,使Java程序员可以方便的运用面向对象的编程思想来操纵关系型数据库;
Hibernate是对JDBC的封装,增强了代码的重用性,简化了代码,提高了编程效率;
Hibernate是对JDBC的轻量级封装,必要时Java程序员可以绕过Hibernate直接访问JDBC API;
Hibernate不仅可以应用在独立的Java程序中,还可以应用在Java Web项目中,可以和多种Web服务器集成,并支持多种数据库平台。
4.第一个Hibernate程序
0. 安装Eclipse、Mysql;
1. 下载Hibernate,并解压缩;
2. 使用Eclipse创建新的项目;
3. 引入Hibernate及其依赖库(jar包);
4. 引入Mysql数据库驱动包;
5. 编写Hibernate配置文件;
6. 创建Java持久化类XXX.java;
7. 编写持久化类的映射配置文件XXX.hbm.xml;
8. 使用Hibernate API 完成对象的持久化。
Hibernate配置文件:
Hibernate需要从配置文件中读取数据库配置信息,配置文件一般位于项目根路径。
Hibernate配置文件两种方式:
(1)hibernate.properties (键=值方式)
(2)默认名字为:hibernate.propeties
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/MyDB</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <mapping resource="com/hibernate/entity/Customer.hbm.xml"/> </session-factory> </hibernate-configuration>
创建持久化类
持久化类:指其实例需要被Hibernate持久化到数据库中的类即实体类
private 类型属性;
public 类型的 setter 和 getter 方法;
public 或 protected 类型的无参数的构造方法。
创建持久化类的配置文件:
创建持久化类的配置文件。
描述持久化类与数据库表之间的对应关系。
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.hibernate.entity"> <class name="Customer" table="CUSTOMER"> <id name="id" type="int" > ... </id> <property name="name" type="java.lang.String"> ... </property> ... </class> </hibernate-mapping>
使用Hibernate API 操纵数据库
ServiceRegistry接口:
ServiceRegistry 注册服务的创建。
StandardServiceRegistry registry
= new StandardServiceRegistryBuilder()
.configure().build();
// 从 hibernate.cfg.xml 读取配置信息
SessionFactory接口:
SessionFactory 会话工厂的作用。
缓存Hibernate配置信息和映射元数据信息;
负责创建Session实例。
SessionFactory的创建。
SessionFactory sessionFactory
= new MetadataSources(registry).buildMetadata()
.buildSessionFactory();
final StandardServiceRegistry registry
= new StandardServiceRegistryBuilder()
.configure() // 从hibernate.cfg.xml读取配置信息
.build(); // 创建StandardServiceRegistry
SessionFactory sessionFactory = null;
try {
sessionFactory = new MetadataSources(registry)
.buildMetadata().buildSessionFactory();
} catch (Exception e) {
// 创建失败手动释放
StandardServiceRegistryBuilder.destroy(registry);
}
Session接口:
Session是Hibernate持久操作的基础核心。
Hibernate Session 与Hibernate相当于JDBC Connection与JDBC;
它代表与数据库之间的一次连续操作;
Session负责执行访问数据库的操作,比如保存、更新、删除、加载和查询,也称为持久化管理器。
Session的创建。
Session session = sessionFactory.openSession();
Session是一个轻量级对象,是非线程安全的,通常和一个数据库事务绑定。
Session接口 :
Session session = sessionFactory.openSession();
// 开始一次事务
Transaction tx = session.beginTransaction();
// 创建需要持久化的对象
Customer c1 = new Customer();
c1.setName("zhangsan");
c1.setSex(1);
c1.setAge(20);
session.save(c1); // 将对象持久化
tx.commit(); // 提交事务
session.close(); // 关闭会话