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格式化数字、货币、金钱
网上摘来的,以后可能会用到 java开发中经常会有数字.货币金钱等格式化需求,货币保留几位小数,货币前端需要加上货币符号等.可以用java.text.NumberFormat和java.text.De ...
- 数组中的最大值以及最小值的位置变换的问题(C++)
将一个5×5的数组中的最大值放到数组的中心位置 分析:遍历数组,找到最大的元素,然后将该元素与中心位置的元素交换位置 #include<iostream> #include <std ...
- poj3171 Cleaning Shifts
传送门 题目大意 有一个大区间和n个小区间,每个小区间都有一个代价,求最少付出多少代价可以使得小区间完全覆盖大区间. 分析为了方便起见我们先将s变为2,其它的位置都对应更改以便后期处理.我们考虑以t1 ...
- Mat 类的内存管理
使用 Mat 类,内存管理变得简单,不再像使用 IplImage 那样需要自己申请和释放内存.虽然不了解 Mat 的内存管理机制,也无碍于 Mat 类的使用,但是如果清楚了解 Mat 的内存管理,会更 ...
- 小小c#算法题 - 8 - 归并排序 (Merging Sort)
“归并”的含义是将两个或两个以上的有序序列组合成一个新的有序序列.这个“归并”可以在O(n+m)的数量级上实现,但这同时也需要O(n+m)的空间复杂度.具体为:首先分配一个新的长度为n+m的空序列,然 ...
- 常用Git命令清单
我现在工作几乎每天都使用 Git ,但是很多命令记不住. 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 下面是我整理的常用 Git 命令清单.几个专用 ...
- 水平居中的那些事之解决jqpagination分页插件无法居中的问题
固定宽度的元素水平居中只需要 margin-left:auto: margin-right:auto; 换成 margin:0 auto; 也是一样的 今天给我用的jqPagination分页插件实现 ...
- C#模拟进度条
自己看源码 using System; namespace ConsoleTest { class Program { static void Main(string[] args) { Consol ...
- 图片展示js特效
html 代码片段,做一个table表格 <table width="798" height="276" border="0" ali ...
- Apache虚拟主机-解惑篇
有很多平时喜欢钻研的童鞋会发现,为什么有时候自己访问某XXse网站时,总是更新IP地址,内容却与以前一样.这个时候就要了解虚拟主机的概念了.了解这个概念,能够帮助运维同学,更内涵的隐藏自己的主 ...