01. Hibernate 教程简介

1. 前言

大家好!本节课将和大家一起学习鼎鼎有名的 Hibernate 框架

本节课程将向大家介绍:

  • Hibernate 的功能 、特点;
  • Hibernate 产生的背景;
  • 并初步探讨编写 Jdbc 框架的基础构建思路。

2. Hibernate 是什么?

简而言之:

  • Hibernate 是一个 Java Jdbc 框架,用来简化 Java Jdbc 操作;
  • Hibernate 也是一个ORM 框架,可以自动完成关系数据库中关系型数据到 Java 对象型数据的映射;
  • 当然,还可以说是一个持久化框架

以上说法其实是对完成同一件事情不同角度的诠释。

Hibernate 的出现就是想让开发者的编码工作变得简单,这个简单指不需要在非核心逻辑编写上花费太多时间。

3. Hibernate 的发展历史

喝水不忘挖井人,先了解下 Hibernate 的发展历程。

故事的大致情节就是澳大利亚墨尔本一位名为 Gavin King 的 27 岁的程序员嫌弃原有的 Jdbc 编码工作方式太过无聊、无脑。于是就买了一本 SQL 编程的书籍在不长的时间内写了这么一个叫 Hibernate 的框架。

Hibernate 一出江湖,便一鸣惊人如此而已;
Hibernate 承载了一个程序员的励志故事。
Hibernate 由最初的 1.0 版本演变到了现在 6.x 版本(官网最新显示),功能越来越强大,体积当然也越来越强大。
至于你爱不爱它,还是要看项目的需要。
故事讲完,继续!

4. Hibernate 的特点

和 Hibernate 类似的框架很多,比如 Mybatis 之类。但是 Hibernate 在江湖上的地位一直都比较稳定,追捧之人众多。当然,各喜所爱!在每一个程序员的心里都会有自己的白马王子。

Hibernate 特点如下:

  • 完全面向对象操作: 操作过程可以忘记 Jdbc API 带来的伤痛;
  • 操作简单: 复杂的查询也只需几行代码,可以全身心去做核心业务逻辑;
  • 没有反射就没有框架: 操作简单的代价是底层封装代码的负重前行,Hibernate 适合业务逻辑复杂的场景,不适合数据量很大的应用;
  • Hibetnate 提供了专业级生产环境中的事务、缓存、并发等多种容错、高性能、高稳定性的解决方案。产品上线后,可减少开发者的后顾之忧,不用担心什么时候会有只 Bug 突然爬出来;
  • 简单易学,操作方便,学习成本较低。还有……还有……就是 Hiberate 提供一种框架设计思想,其开发理念对开发者可产生思想层面影响。

5. Hibernate 与其它框架的比较

  • 更适合现代开发理念: 产品的生命周期决定产品的市场价值,快速迭代开发是主流。Hibernate 能让开发者高度关注项目的核心业务逻辑,而不因重复繁杂的数据库连接操作影响产品的迭代周期;

  • 说到 Hibetnate,就会谈到与之齐名的 MyBatisMyBatis 以半开发模式吸引开发者,让开发者在开发过程具有一定的把控感。但是,在数据库操作大的情况下书写SQL语句并不是一件轻松之事;对业务量多、数据库操作相对较少的情况,书写些常规性SQL想必也带来不了成就感。不如 Hibernate 来的简单直接;

  • Hibernate 提供多元化的操作模式。纯粹主义者能以完全面向对象方式操作;Hibernate 也提供了原生SQL操作模式,适合对原生 SQL 语句钟情者;对于复杂的数据操作,也支持存储过程调用。应有尽有,总能找到自己喜欢的感觉。

专业的角度,无论哪一种 Jdbc 框架,其要解决的问题都是一样的,其核心原则和思想是一样的。Hibetnate 是一个封装的严丝合缝的开源框架,其内在的代码架构代码实现模式对于学习者无疑是一座宝藏。这点其它框架就无法与其一比。

6. Jdbc 框架形成过程

6.1 什么是持久化

要真正了解、认识 Hibernate, 先切换一下镜头,回到没有Hibernate 之前的世界,一起来了解框架的演变过程(有需求才会有市场嘛)。

现在是提问时间:

程序的本质是什么?

-----------------------我是等待你答案的中划线-----------------------

程序的本质是解决现实中的问题,解决问题之前,先解决第一个问题,用计算机建模并保存现实生活中的信息,这个过程叫信息数据化

然后,按需求对数据进行逻辑处理并产生结果数据。程序是从数据到数据的过程,当然,算法功底很重要。

程序运行时的数据是保存在内存中的,叫临时数据或叫瞬时数据

程序运行过程产生的数据有些是需要永久性保存的,选择介质较多,一般会选择保存在数据库中,Java 程序员可以使用 Jdbc Api 和数据库进行交互。

把程序中的数据写回数据库这个过程也可称为数据持久化过程。

6.2 Java Jdbc 框架演变之路

先回顾一下纯手工 Jdbc 操作流程:

1.加载由不同厂商遵循 Jdbc 规范开发的驱动类。关于 Jdbc 驱动类开发不是这里要讲的,可查阅相关资料;

Class.forName("对应数据库的驱动类名");

2.建立 Java 程序和数据库系统的连接。本质是进程和进程的网络连接;

Connection conn = DriverManager.getConnection("url","用户名","密码");

3.确定数据清单。数据库只认 SQL 语句,你需要数据库帮你做什么样的数据操作,需要传送 SQL 指令给数据库;

String sql="使用sql语法描述数据需求";

4.需要一个信使。创建一个语句处理对象充当信使,任务就是上传下达;

PreparedStatement preparedStatement=conn.prepareStatement(sql); 

5.信使工作,把程序中的数据搬运到数据库,或把数据库数据搬运到程序;

preparedStatement.各种方法();

6.数据搬运过来后,Java 代码要用呀!Java 语言有什么特点?面向对象吗?搬运过来的数据是符合关系数据库特点的数据,于是开始手工数据格式转换、封装;

省略若干代码,心里希望表结构中字段不要太多!此时的苦只有自己知道!!

7. 最后把封装成 OOP 的数据交付给 Java 业务代码使用,各种资源关闭。

在编码时,只要涉及到和数据交互行为。好吧,把前面的几个步骤再走一遍。发现没有,其实你在做大量的重复工作,好好的脑力活生生变成了体力活。

怎么办?难道要承受这种编程生活的折磨吗,当然不!

通过模板方法解决 Jdbc 访问中的重复性问题。

其实,Jdbc 编程是一个模板化的操作过程,针对不同的数据请求操作其中只有 2 个地方是不一样的。

  • 数据清单不一样。每一次、不同数据需求的 Jdbc 操作请求,SQL 语句是不一样的。
  • 另一个不一样是从关系数据库中读出来的数据封装成对应的目标对象类型是不一样的。

知道这些就好办,可以把 Jdbc 代码操作封装成一个模板方法。在模板方法中预留 2 个参数:

  • 传入 SQL 语句;
  • 传入一个用于封装结果集中的数据到 OOP 对象的方法。

按照这个思路,属于你的 Jdbc 简易框架就要诞生了。有点激动吧!

如下是查询模板方法代码参考:

/***通用 jdbc 查询数据模板方法*connection:连接对象,可由外部传入,也可由内部方法创建*sql:传过来的 SQL语句*rsh:自定义结果集处理接口,其中有封装结果集数据的方法*args:SQL中参数值*/
public <T> T query(Connection connection, String sql, ResultSetHandler<T> rsh, Object... args) throws SQLException {// 建立连接if (connection == null)connection = this.dataSource.getConnection();if (sql == null)throw new SQLException("SQL语句不正确");// 预处理语句PreparedStatement preStatement = connection.prepareStatement(sql);// SQL指定参数值fillStatement(preStatement, args);// 结果集ResultSet rs = preStatement.executeQuery();// 结果处理规范T result = rsh.handle(rs);// 资源关闭this.close(connection, preStatement, rs);return result;
}

调用上面方法时,传递一条 SQL 语句,传递一个实现了 ResultSetHandler 接口的对象(此对象提供方法完成数据映射工作)就可以了。

我们编写的模板方法与 Hibernate 相比较:

  • Hibernate 会自动构建生成 SQL 语句。复杂的 SQL 也不是问题;
  • 自动完成了关系型数据库中的数据到 Java 对象的封装

所以说Hibernate 是一个全自动化的 ORM 持久化框架。

当然 Hibernate 可不仅只完成数据库数据的访问,还会考虑性能、事务等生产环境中的诸多现实问题,这些会在本课程后面慢慢展开。

7. 学习基础

学习 Hibernate 分 2 个层次:

  • 把 Hibernate 当成一个工具, 掌握其应用。只需要学习者具有一定的 JAVA 基础知识即可;
  • 了解 Hibernate 底层运行机制,对其运行过程进行调优,则需要学习者具有反射、网络编程、多线程等相关知识的储备。

8. 小结

好了!到了总结时间:

本章节帮助大家初步了解 Hibernate 框架的作用。和原生态Jdbc 操作相比较,可发现 Hibernate 解决了 Jdbc 操作中的 SQL 语句生成问题、关系数据库中数据自动映射问题。

Hibernate通过提供统一的接口方式让用户以面向对象的方式透明的、简单地使用Jdbc连接数据库

让开发者从繁琐无太多技术含量的编码中解脱出来,用更多的心思和时间完成核心业务逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷js

原型模式 原型对象就是相当于java的static,所有实例对象可以直接用静态的属性或者方法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script type"text/javascript&q…

3D工艺大师快速生成装配动画,驱动汽车工业装配流程革新

在现代制造业的一般生产流程中&#xff0c;车间装配环节是产品由蓝图迈向市场前至关重要的一道工序。随着产品结构的日益复杂化和个性化需求的不断增长&#xff0c;车间装配工作面临着前所未有的挑战。高精密度的装配要求、错综复杂的组件关系以及频繁变更的生产计划&#xff0…

Java单边表的局部翻转

反转链表 II 这是上一个翻转全部链表的进阶版&#xff0c;大家可以先去看我的上一篇博客 Java算法之单链表的全部翻转-CSDN博客 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节…

在VSCode上创建Vue项目详细教程

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

使用 lmdeploy 部署 internlm/internlm2_5-7b-chat

使用 lmdeploy 部署 internlm/internlm2_5-7b-chat 0. 引言1. lmdeploy 性能2. lmdeploy 支持的模型3. 快速开始 0. 引言 LMDeploy 由 MMDeploy 和 MMRazor 团队联合开发&#xff0c;是涵盖了 LLM 任务的全套轻量化、部署和服务解决方案。 这个强大的工具箱提供以下核心功能&a…

webRtc架构与目录结构

整体架构 目录结构 webrtc Modules目录

Redis实践经验

优雅的Key结构 Key实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:id例&#xff1a;login:user:10长度步超过44字节&#xff08;版本不同&#xff0c;上限不同&#xff09;不包含特殊字符 优点&#xff1a; 可读性强避免key冲突方便管理节省内存&#x…

使用 Unstructured.io 和 Elasticsearch 向量数据库搜索复杂文档

作者&#xff1a;来自 Elastic Amy Ghate, Rishikesh Radhakrishnan, Hemant Malik 使用非结构化和 Elasticsearch 向量数据库为 RAG 应用程序提取和搜索复杂的专有文档 在使信息可搜索之前解析文档是构建实际 RAG 应用程序的重要步骤。Unstructured.io 和 Elasticsearch 在此…

mybatis动态传入参数 pgsql 日期 Interval ,day,minute

mybatis动态传入参数 pgsql 日期 Interval 在navicat中&#xff0c;标准写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL 5 day)在mybatis中&#xff0c;错误写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL#{numbers,jdbcTypeINTEGER} day)报错内…

CSS【详解】层叠 z-index (含 z-index 的层叠规则,不同样式的层叠效果)

仅对已定位的元素&#xff08; position:relative&#xff0c;position:absolute&#xff0c;position:fixed &#xff09;有效&#xff0c;默认值为0&#xff0c;可以为负值。 z-index 的层叠规则 z-index 值从小到大层叠 兄弟元素 z-index 值相同时&#xff0c;后面的元素在…

python | setup.py里有什么?

setup.py里有什么&#xff1f; 文章目录 setup.py里有什么&#xff1f;C/C扩展总结gcc/g的编译参数&#xff1a;Windows Visual StudioCmakesetup.py C/C扩展模块 为什么需要分发打包&#xff1f;Distutils一个简单的例子通用的 Python 术语 使用 Setuptools 构建和分发软件包源…

Android Gantt View 安卓实现项目甘特图

需要做一个项目管理工具&#xff0c;其中使用到了甘特图。发现全网甘特图解决方案比较少&#xff0c;于是自动动手丰衣足食。 前面我用 Python和 Node.js 前端都做过&#xff0c;这次仅仅是移植到 Android上面。 其实甘特图非常简单&#xff0c;开发也不难&#xff0c;如果我…

Python番外篇:万法归一,一切皆对象

目录 Python中的对象 一切皆对象 数字是对象 字符串是对象 内置类型也是对象 函数和类也是对象 总结 Python中的对象 对象是Python对数据的抽象&#xff0c;在Python程序中&#xff0c;所有的数据&#xff0c;都可以由对象或对象之间的关系表示。 从某种意义上说&#…

基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 摘 要 原理图 仿真图 元器件清单 代码 系统论文 参考文献 资源下载…

几何建模-Parasolid中GO功能使用

1.背景介绍 1.1 Parasolid和它的接口间关系 1.2 什么是GO GO全称是Graphical Output.你的程序需要在屏幕或者打印设备上显示模型数据时。在需要使用PK中的某个渲染函数时创建图形显示数据时&#xff0c;Parasolid会调用GO相关的函数。GO函数会输出绘图指令给你的应用程序提供…

《昇思25天学习打卡营第14天|SSD目标检测》

SSD&#xff08;Single Shot MultiBox Detector&#xff09;是一种用于目标检测的深度学习算法。它的设计旨在同时检测多个对象&#xff0c;并确定它们在图像中的位置和类别。与其他目标检测算法相比&#xff0c;SSD具有速度快和精度高的特点&#xff0c;在实时检测应用中非常受…

昇思25天学习打卡营第18天|MindNLP ChatGLM-6B StreamChat

现在各类chat AI不胜枚举&#xff0c;开源的闭源的都有&#xff0c;ChatGLM-6B是其中一个开源的chat AI模型&#xff0c;我们可以使用mindspore轻松的跑起来这个模型 官方提供的jupyter示例里面却少了安装mindnlp和mdtex2html&#xff0c;所以需要先把这两个模块安装一下。 !…

【Dison夏令营 Day 17】使用 Python Turtle 的 24 游戏求解器

24 点 是一个数学谜题&#xff0c;用基本算术运算符&#xff08;、-、、&#xff09;将 4 个数字运算成 24。例如&#xff0c;给定 4 个数字 1,5,5,5&#xff0c;我们可以得到表达式 (5-(15))5&#xff0c;等于 24。 我们可以用 Python 程序暴力解决这个问题。最多有 245444 7…

【游戏客户端】大话slg玩法架构(三)建筑控件

【游戏客户端】大话slg玩法架构&#xff08;三&#xff09;建筑控件 大家好&#xff0c;我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构&#xff0c;关于SLG玩法的介绍可以参考这篇上一篇文章&#xff1a;【游戏客户端】制作率土之滨Like玩法 PS&#xff1a;和之前…

谈谈软件交互设计

谈谈软件交互设计 交互设计的由来 交互设计(Interaction Design)这一概念,最初是由IDEO创始人之一Bill.Moggridge(莫格里奇)1984年在一次会议上提出。他设计了世界上第一台笔记本电脑Compass,并写作出版了在交互设计领域影响深远的《Designing Interactions》一书,被称…