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(); // 关闭会话
1.Hibernate框架的更多相关文章
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- Hibernate 系列 01 - 框架技术 (介绍Hibernate框架的发展由来)
引导目录: Hibernate 系列教程 目录 本篇导航: 为什么学习框架技术 框架的概念 主流框架的介绍 1.为什么学习框架技术 如何制作一份看上去具有专业水准的PPT文档呢?一个简单的方法就是使用 ...
- 2.0、Hibernate框架的简单搭建
一.Hibernate:是一个开放源代码的对象关系映射框架,对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句 ...
- 【Hibernate框架】对象的三种持久化状态
一.综述 hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象).PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线 ...
- hibernate框架int和Integer类型区别
hibernate 框架在定义实体时,int类型最好定义为Inttger类型,因为在注入时int是值类型不允许为空.
- SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>
此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...
- ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...
(一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...
- Hibernate框架简单应用
Hibernate框架简单应用 Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.proper ...
- Hibernate框架(未完待续······)
作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编 ...
- Hibernate框架之get和load方法的区别
我们在学习Hibernate框架时,经常会进行修改,删除操作,对于这些操作,我们都应该先加载对象,然后在执行或删除的操作,那么这里Hibernate提供了两种方法按照主键加载对象,也就是我要说的get ...
随机推荐
- Java界面设计
---------------siwuxie095 Java SE(Java Standard Edition) 即 Java 标准版, 一般也 ...
- 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...
- 算法Sedgewick第四版-第1章基础-007一用两个栈实现简单的编译器
1. package algorithms.util; import algorithms.ADT.Stack; /****************************************** ...
- GCD 学习(一)简介
文章摘抄至:http://zhuyanfeng.com/archives/3015 并有一些改动 GCD(Grand Central Dispatch)是从OS X Snow Leopard和iOS ...
- 1027C Minimum Value Rectangle
传送门 题目大意 有n个木棍,让你选4根使得组成的矩形的周长的平方除以面积最小. 分析 这个题看起来就是一个需要证明的贪心,下面我们来证明一下: 所以我们只需要枚举一边所有的a的可能值,然后b就是比a ...
- Integer类的parseInt和valueOf的区别
我们平时应该都用过或者见过parseInt和valueOf这两个方法.一般我们是想把String类型的字符数字转成int类型.从这个功能层面来说,这两个方法都一样,都可以胜任这个功能. 但是,我们进入 ...
- form的提交方式
1,最普通最常用的方法就是用submit type.. <form name=”form” method=”post” action=”#"> <input type=”s ...
- Linux操作系统下IPTables配置方法详解
如果你的IPTABLES基础知识还不了解,建议先去看看. 们来配置一个filter表的防火墙 1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Cha ...
- break跳出多重循环
大家都知道break只能跳出当前的一个循环语句,如果碰到要跳出多个循环体,那么我们就该在循环体开头设置一个标志位,然后使用带此标志位的break语句跳出多重循环 jump: ;i<;i++){ ...
- [raspberry pi3] 安装ffmpeg
买了个pi3,pi相对于通常的嵌入式系统的最大好处是里面夹带了gcc编译器,有很多东西都不需要交叉编译了. arm和pc的性能还是不能比的,io的瓶颈还是很明显的, 想要编的快点还是要在pc上交叉编译 ...