ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

eclipse学习(第三章:ssh中的Hibernate)——1.Hibernate是什么和为什么用Hibernate

2021-06-12 13:58:02  阅读:201  来源: 互联网

标签:Hibernate Java 对象 数据库 eclipse ORM ssh JDBC


eclipse学习(第三章:ssh中的Hibernate)——1.Hibernate是什么和为什么用Hibernate

前言

我是通过看这个网站做的一些笔记。我先说一句,我觉得这个网站的知识点有点小乱,看的顺序我觉得不调的话比较难理解。所以我自己弄了一下,方便我自己理解。
https://www.w3cschool.cn/hibernate/86go1ie3.html

这里我觉得初学者了解一下就好了,初学者先学会怎么用Hibernate再来看应该会有更大的收益和感触。但是一开始看一下先了解一下也是挺不错的,毕竟用一样东西你也得先知道用来干嘛的哈哈。

1.Hibernate是什么

Hibernate的历史

Hibernate 是由 Gavin King 于 2001 年创建的开放源代码的***对象关系框架***。它强大且高效的构建具有关系对象持久性和查询服务的 Java 应用程序。

Hibernate 将 Java 类映射到数据库表中,从 Java 数据类型中映射到 SQL 数据类型中,并把开发人员从 95% 的公共数据持续性编程工作中解放出来。

Hibernate 是传统 Java 对象和数据库服务器之间的桥梁,用来处理基于 O/R 映射机制和模式的那些对象。

这里这个图是用来说明Hibernate在一个项目中是什么位置的,Java Objects是一个Java写的项目;ORM/Hibernate是一个框架,通过这个框架你能够将这两者联系起来;RDBMS是关系数据库管理系统,你把它当成是数据就好了
在这里插入图片描述

Hibernate有什么优势

  • Hibernate 使用 XML 文件来处理映射 Java 类别到数据库表格中,并且不用编写任何代码。
  • 为在数据库中直接储存和检索 Java 对象提供简单的 APIs。
  • 如果在数据库中或任何其它表格中出现变化,那么仅需要改变 XML 文件属性。
  • 抽象不熟悉的 SQL 类型,并为我们提供工作中所熟悉的 Java 对象。
  • Hibernate 不需要应用程序服务器来操作。
  • 操控你数据库中对象复杂的关联。
  • 最小化与访问数据库的智能提取策略。
  • 提供简单的数据询问。

Hibernate支持的数据库

Hibernate 支持几乎所有的主要 RDBMS。以下是一些由 Hibernate 所支持的数据库引擎。

  • HSQL Database Engine
  • DB2/NT
  • MySQL
  • PostgreSQL
  • FrontBase
  • Oracle
  • Microsoft SQL Server Database
  • Sybase SQL Server
  • Informix Dynamic Server

Hibernate支持的技术

Hibernate 支持多种多样的其它技术,包括以下:

  • XDoclet Spring
  • J2EE
  • Eclipse plug-ins
  • Maven

2.Hibernate架构

架构

Hibernate 架构是分层的,作为数据访问层,你不必知道底层 API 。Hibernate 利用数据库以及配置数据来为应用程序提供持续性服务(以及持续性对象)。

下面是一个非常高水平的 Hibernate 应用程序架构视图。
在这里插入图片描述
下面是一个详细的 Hibernate 应用程序体系结构视图以及一些重要的类。
在这里插入图片描述

Hibernate 使用不同的现存 Java API,比如 JDBC,Java 事务 API(JTA),以及 Java 命名和目录界面(JNDI)。JDBC 提供了一个基本的抽象级别的通用关系数据库的功能, Hibernate 支持几乎所有带有 JDBC 驱动的数据库。JNDI 和 JTA 允许 Hibernate 与 J2EE 应用程序服务器相集成。

下面的部分简要地描述了在 Hibernate 应用程序架构所涉及的每一个类对象。

配置对象

配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化期间创造。它代表了 Hibernate 所需一个配置或属性文件。配置对象提供了两种基础组件。

  • 数据库连接:由 Hibernate 支持的一个或多个配置文件处理。这些文件是 hibernate.properties 和 hibernate.cfg.xml。
  • 类映射设置:这个组件创造了 Java 类和数据库表格之间的联系。

SessionFactory 对象

配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。

SessionFactory 是一个重量级对象所以通常它都是在应用程序启动时创造然后留存为以后使用。每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。所以如果你使用多种数据库那么你要创造多种 SessionFactory 对象。

Session 对象

一个会话被用于与数据库的物理连接。Session 对象是轻量级的,并被设计为每次实例化都需要与数据库的交互。持久对象通过 Session 对象保存和检索。

Session 对象不应该长时间保持开启状态因为它们通常情况下并非线程安全,并且它们应该按照所需创造和销毁。

Transaction 对象

一个事务代表了与数据库工作的一个单元并且大部分 RDBMS 支持事务功能。在 Hibernate 中事务由底层事务管理器和事务(来自 JDBC 或者 JTA)处理。

这是一个选择性对象,Hibernate 应用程序可能不选择使用这个接口,而是在自己应用程序代码中管理事务。

Query 对象

Query 对象使用 SQL 或者 Hibernate 查询语言(HQL)字符串在数据库中来检索数据并创造对象。一个查询的实例被用于连结查询参数,限制由查询返回的结果数量,并最终执行查询。

Criteria 对象

Criteria 对象被用于创造和执行面向规则查询的对象来检索对象。

3、Hibernate是一个ORM框架,那么我们来了解一下ORM

如果你要使用它来解决问题,那么你也要先知道这个ORM有什么作用。使用ORM会比JDBC好,所以我们先来介绍一下JDBC,再来介绍ORM。

什么是 JDBC?

JDBC 代表 Java Database Connectivity它是提供了一组 Java API 来访问关系数据库的 Java 程序。这些 Java APIs 可以使 Java 应用程序执行 SQL 语句,能够与任何符合 SQL 规范的 数据库进行交互

JDBC 提供了一个灵活的框架来编写操作数据库的独立的应用程序,该程序能够运行在不同的平台上且不需修改,能够与不同的 DBMS 进行交互。

JDBC 的优点和缺点

JDBC 的优点JDBC 的缺点
干净整洁的 SQL 处理大项目中使用很复杂
大数据下有良好的性能很大的编程成本
对于小应用非常好没有封装
易学的简易语法难以实现 MVC 的概念
查询需要指定 DBMS

那ORM又是什么?

ORM 表示 Object-Relational Mapping (ORM)***,是一个方便在关系数据库和类似于 Java, C# 等面向对象的编程语言中***转换数据的技术。一个 ORM 系统相比于普通的 JDBC 有以下的优点。

序号优点
1使用业务代码访问对象而不是数据库中的表
2从面向对象逻辑中隐藏 SQL 查询的细节
3基于 JDBC 的 ‘under the hood’
4没有必要去处理数据库实现
5实体是基于业务的概念而不是数据库的结构
6事务管理和键的自动生成
7应用程序的快速开发

一个 ORM 解决方案由以下四个实体组成:

序号优点
1一个 API 来在持久类的对象上实现基本的 CRUD 操作
2一个语言或 API 来指定引用类和属性的查询
3一个可配置的服务用来指定映射元数据
4一个技术和事务对象交互来执行 dirty checking, lazy association fetching 和其它优化的功能

Java ORM 框架

在 Java 中有几个持久化的框架和 ORM 选项。一个持久化的框架是 ORM 存储和索引对象到关系型数据库的服务。

  • Enterprise JavaBeans Entity Beans
  • Java Data Objects
  • Castor
  • TopLink
  • Spring DAO
  • Hibernate
  • And many more

一个普通的对象示例

当我们工作在一个面向对象的系统中时,存在一个对象模型和关系数据库不匹配的问题。RDBMSs 用表格的形式存储数据,然而像 Java 或者 C# 这样的面向对象的语言它表示一个对象关联图。考虑下面的带有构造方法和公有方法的 Java 类:

@Entity
@Table(name = "student")
public class Student {

	public Double getScore() {
		return score;
	}
	public void setScore(Double score) {
		this.score = score;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	
	@Id
	@GeneratedValue
	private Integer id;
	@Column(name = "name")
	private String name;
	@Column(name = "subject")
	private String subject;
	@Column(name = "score")
	private Double score;
	
}

mysql数据库里面的表结构以及部分自己加入的数据

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) NOT NULL,
  `subject` varchar(40) NOT NULL,
  `score` double(11,0) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '张三', '语文', '60');
INSERT INTO `student` VALUES ('2', '李四', '数学', '90');
INSERT INTO `student` VALUES ('3', '王五', '英语', '80');

大概看起来是这个样子的
在这里插入图片描述

为什么要用ORM?不用ORM用JDBC不行吗??那我们来说一下实际开发可能遇到的问题

第一个问题,如果我们开发了几页代码或应用程序后,需要修改数据库的设计怎么办?
第二个问题,在关系型数据库中加载和存储对象时我们要面临以下五个不匹配的问题。

不匹配描述
粒度有时你将会有一个对象模型,该模型类的数量比数据库中关联的表的数量更多
继承RDBMSs 不会定义任何在面向对象编程语言中本来就有的继承
身份RDBMS 明确定义一个 ‘sameness’ 的概念:主键。然而,Java 同时定义了对象判等(a==b)和 对象值判等(a.equals(b))
关联面向对象的编程语言使用对象引用来表示关联,而一个 RDBMS 使用外键来表示对象关联
导航在 Java 中和在 RDBMS 中访问对象的方式完全不相同

标签:Hibernate,Java,对象,数据库,eclipse,ORM,ssh,JDBC
来源: https://blog.csdn.net/weixin_43987277/article/details/117154663

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有