02. Hibernate 初体验之持久化对象
1. 前言
本节课程让我们一起体验 Hibernate 的魅力!编写第一个基于 Hibernate 的实例程序。
在本节课程中,你将学到 :
- Hibernate 的版本发展史;
- 持久化对象的特点。
为了更好地讲解这个内容,这个初体验案例分上下 2 个章节来讲解。
2. Hibetnate 体系结构

如图可知,应用程序可以通过 Hibernate 为用户提供的接口 API 通知 Hibernate 内部组件对数据库中数据进行一系列操作。
在操作之前,先做些准备工作。
3. 使用 Hibernate 编写第一个程序
3.1 持久化对象
Hibernate 是以 Java 面向对象编程的方式操作数据库。使用之前先要定义一个对象,这个对象叫持久化对象。
为什么叫持久化对象?不急!一步步来,慢慢掀起它神秘面纱。
先一起来看看这个持久化对象的定义。这个所谓的持久化对象长得和普通的 Java 对象没有什么不同:
文章中淡化了对象和类的区别。
public class Student {//学生编号private Integer stuId;//学生姓名private String stuName;//此处省略其它属性……public Student(){super();}public Student(Integer stuId,String stuName){this.stuId=stuId;this.stuName=stuName;//省略代码……}//省略各种get set方法
}
关于这个对象定义有几点需要说明:
- 这个类的结构需要对应关系型数据库中某一张表的表结构;
- 可用类中的属性封装表中对应字段数据(数据类型保持一致);
- 所有属性提供 get 和 set 方法,类定义中提供一个无参的构造方法。且不要在这个类中提供任何业务逻辑代码。是的!这是一个符合 JavaBean 规范的普通 Java 类(POJO)。
你定义的,你心里知道。但是,Hibernate 不知道这个类是干嘛用!
所以,你必须通过元数据说明告诉 Hibernate:
- 这个类结构对应那个表结构
- 这个类的属性对应表中的那个字段(还需附加类型说明等 N 多信息)
加上元数据说明,这样,Hibernate 就能够使用这个对象操作数据中的数据了!
智能化是有前提条件的!Hibernate 再聪明也需要指引!
此时这个 POJO (普通 Java 类 POJO : Plain Ordinary Java Object,不包含业务逻辑代码的值对象)对象可换上一个更贴切的名字:持久化对象(PO:persistent object)。
你也应该要小结一下: PO = POJO + 元数据说明
此处稍加提醒下,元数据说明方法有两种:
- XML;
- 注解。
3.2 XML 映射
现在流行使用注解方式告诉 Hibernate 你操作的对象对应数据库中的那张表及更多关联信息。
对 XML 映射大家也需要了解一下,万一你以后工作的企业里有一群怀旧的叔叔呢!
本章节中的案例使用 XML 映射方式,后面的内容讲解还是要跟上潮流,使用注解方式。
命名为 Student.hbm.xml 文件中部分内容如下 (完整的文档结构说明可查看官方文档):
<Hibernate-mapping><class name="com.po.Student" table="student" schema="scott" ><id name="stuId" type="java.lang.Integer"><column name="stuId" precision="11" scale="0" /><generator class="increment"></generator></id><property name="stuName" type="java.lang.String"><column name="stuName" length="20" unique="true" /></property><!--其它属性映射--></class>
</Hibernate-mapping>
上面这个 XML 文件中的内容,语义上非常明确。为了加深理解,再解释一下 Xml 中相应元素:
- class: 类与表的映射关系;
- id: 类中的那个属性对应表中的主键字段,只能有一个。这个属性也可叫做标识属性。
- property: 通过子元素 column 一起说明类中的其它属性分别对应表中的那个字段,可以有多个。
通过 XML 元素属性或子元素所提供的附加信息越多,就可以让 Hibernate 清晰地明白自己的任务,否则某些环节它就要靠猜了!
编码规范提示: 尽可能保持 Java 类中属性命名和表中字段命名相同!
有了前面的工作。已经足够让 Hibernate 在进入数据库系统时生成正确的 SQL 语句,也足够让 Hibernate 把从数据库中带出来的数据映射成正确 Java 对象。
4. 主配置文件
何谓主配置文件?其作用是什么?
一句话概括:为 Hibetnater 的数据库操作工作做行程计划。
如:
- 指定访问的具体数据库,串门可别窜岔了;
- 操作时依赖的映射文件在那里;
- 在操作过程其它一系列设置安排。
也可以说,开发者可以通过此文档和 Hibernate 的内部组件进行互动。 Hibetnate.cfg.xml 是主配置文件的默认命名,当然,你可以改成其它名称!
好吧,现在通过此文件告诉 Hibernate 两个信息:
- 你要远行的地方叫 MySql (本课程选用 MySql 为项目数据库);
- 你要依赖的映射文件叫 Student.hbm.xml。
<hibernate-configuration><session-factory><!-- 访问MySql数据库的基本连接信息 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property : name="connection.url">jdbc:mysql://localhost:3306/myhibernate</property><property name="connection.username">root</property><property name="connection.password">abc123</property><!— 数据库连接池会在后面讲解,这里先给自己一个预习机会--><property name="connection.pool_size">1</property><!-- SQL 方言 --><property name="dialect">org.hibernate.dialect.HSQLDialect</property><!-- 是否显示Hibetnate自动生成的SQL语句 --><property name="show_sql">true</property><!—映射文件的位置--><mapping resource="com/mk/po/Student.hbm.xml"/></session-factory>
</hibernate-configuration>
文件中的内容一目了然,有几点需要强调说明:
-
数据源的目的是告诉 Hibetnate 去哪家关系数据库中获取数据。配置时一般会涉及到数据库连接池,可先作为自己预习内容,此章节不讲;
-
dialect 方言如同大家都讲普通话,因出生地区域不同,普通话中或多或少都会有本地方言。SQL 是关系数据系统的统一语言,每一种具体的关系数据库产品中的 SQL 语句也有稍许差异性。此处告诉 Hibetnate 在生成 SQL 语句时要入乡随俗,注意语法上的细节差异;
-
其它配置内容可根据开发过程的需求逐一添加。
其实不难,如果你觉得难,对于想让你工作变得简单的 Hibernate 而言就会觉得很伤心!
当然,你也不能指望 Hibetnate 是你心里的蛔虫,在 Hibernate 工作之前与之交流环节是必不可少的。
5. 小结
本节课内容先讲到这里!知识需要消化时间。
本节课程,让大家了解了 Hibernate 进行数据库操作的关键是什么!在心里反复地默念一下:
持久化对象是一个 Java 对象牵手元数据说明信息,目的是帮助 Hibernate 明白进入数据库系统的任务(生成增、删、改、查相应操作的 SQL 语句)、以及正确完成数据(关系型数据)到数据(Java OOP 数据)的映射。
相关文章:
02. Hibernate 初体验之持久化对象
1. 前言 本节课程让我们一起体验 Hibernate 的魅力!编写第一个基于 Hibernate 的实例程序。 在本节课程中,你将学到 : Hibernate 的版本发展史;持久化对象的特点。 为了更好地讲解这个内容,这个初体验案例分上下 2…...
MySQL超详细学习教程,2023年硬核学习路线
文章目录 前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL 2. MySQL数据库2.1 MySQL安装2.2 MySQL配置2.2.1 添加环境变量2.2.2 新建配置文件2.2.3 初始化MySQL2.2.4 注册MySQL服务2.2.5 启动MySQL服务 2.3 MySQL登录和退出2.4 MySQL卸载2.…...
初识SpringBoot
1.Maven Maven是⼀个项⽬管理⼯具, 通过pom.xml⽂件的配置获取jar包,⽽不⽤⼿动去添加jar包 主要功能 项⽬构建管理依赖 构建Maven项目 1.1项目构建 Maven 提供了标准的,跨平台(Linux, Windows, MacOS等)的⾃动化项⽬构建⽅式 当我们开发了⼀个项⽬之后, 代…...
Qt之元对象系统
Qt的元对象系统提供了信号和槽机制(用于对象间的通信)、运行时类型信息和动态属性系统。 元对象系统基于三个要素: 1、QObject类为那些可以利用元对象系统的对象提供了一个基类。 2、在类声明中使用Q_OBJECT宏用于启用元对象特性,…...
Provider(1)- 什么是AudioBufferProvider
什么是AudioBufferProvider? 顾名思义,Audio音频数据缓冲提供,就是提供音频数据的缓冲类,而且这个AudioBufferProvider派生出许多子类,每个子类有不同的用途,至关重要;那它在Android哪个地方使…...
加密与安全_密钥体系的三个核心目标之完整性解决方案
文章目录 Pre机密性完整性1. 哈希函数(Hash Function)定义特征常见算法应用散列函数常用场景散列函数无法解决的问题 2. 消息认证码(MAC)概述定义常见算法工作原理如何使用 MACMAC 的问题 不可否认性数字签名(Digital …...
【C++】:继承[下篇](友元静态成员菱形继承菱形虚拟继承)
目录 一,继承与友元二,继承与静态成员三,复杂的菱形继承及菱形虚拟继承四,继承的总结和反思 点击跳转上一篇文章: 【C】:继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数…...
昇思25天学习打卡营第13天|基于MindNLP+MusicGen生成自己的个性化音乐
关于MindNLP MindNLP是一个依赖昇思MindSpore向上生长的NLP(自然语言处理)框架,旨在利用MindSpore的优势特性,如函数式融合编程、动态图功能、数据处理引擎等,致力于提供高效、易用的NLP解决方案。通过全面拥抱Huggin…...
nigix的下载使用
1、官网:https://nginx.org/en/download.html 双击打开 nginx的默认端口是80 配置文件 默认访问页面 在目录下新建pages,放入图片 在浏览器中输入地址进行访问 可以在电脑中配置本地域名 Windows设置本地DNS域名解析hosts文件配置 文件地址…...
nginx+lua 实现URL重定向(根据传入的参数条件)
程序版本说明 程序版本URLnginx1.27.0https://nginx.org/download/nginx-1.27.0.tar.gzngx_devel_kitv0.3.3https://github.com/simpl/ngx_devel_kit/archive/v0.3.3.tar.gzluajitv2.1https://github.com/openresty/luajit2/archive/refs/tags/v2.1-20240626.tar.gzlua-nginx-m…...
算法学习笔记(8.4)-完全背包问题
目录 Question: 图例: 动态规划思路 2 代码实现: 3 空间优化: 代码实现: 下面是0-1背包和完全背包具体的例题: 代码实现: 图例: 空间优化代码示例 Question: 给定n个物品…...
C++catch (...)陈述
catch (...)陈述 例外处理可以有多个catch,如果catch后的小括弧里面放...,就表示不限型态种类的任何例外。 举例如下 #include <iostream>int main() {int i -1;try {if (i > 0) {throw 0;}throw 2.0;}catch (const int e) {std::cout <…...
Redis实践
Redis实践 使用复杂度高的命令 如果在使用Redis时,发现访问延迟突然增大,如何进行排查? 首先,第一步,建议你去查看一下Redis的慢日志。Redis提供了慢日志命令的统计功能,我们通过以下设置,就…...
【Lora模型推荐】Stable Diffusion创作具有玉石翡翠质感的图标设计
站长素材AI教程是站长之家旗下AI绘图教程平台 海量AI免费教程,每日更新干货内容 想要深入学习更多AI绘图教程,请访问站长素材AI教程网: AI教程_深度学习入门指南 - 站长素材 (chinaz.com) logo版权归各公司所有!本笔记仅供AIGC…...
vscode 远程开发
目录 vscode 远程连接 选择 Python 环境 vscode 远程连接 按 CtrlShiftP 打开命令面板。输入并选择 Remote-SSH: Open SSH Configuration File...。选择 ~/.ssh/config 文件(如果有多个选项)。在打开的文件中添加或修改你的 SSH 配置。 这个可以右键…...
前端Vue组件化实践:打造灵活可维护的地址管理组件
随着前端技术的不断演进,复杂度和开发难度也随之上升。传统的一体化开发模式使得每次小小的修改或功能增加都可能牵一发而动全身,严重影响了开发效率和维护成本。组件化开发作为一种解决方案,通过模块化、独立化的开发方式,实现了…...
虚幻引擎ue5游戏运行界面白茫茫一片,怎么处理
根剧下图顺序即可调节游戏运行界面光照问题: 在大纲里找到post,然后选中它,找到Exposure 把最低亮度和最高亮度的0改为1即可...
《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》
代理IP如何选以及常见反爬策略 为什么需要代理? 因为有的网站会封IP,用户如果没有登录,那IP就是身份标识,如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求,帮你转交的人对面不熟&a…...
Kotlin Flow 防抖 节流
防抖和节流是针对响应跟不上触发频率这类问题的两种解决方案。 一:防抖(debounce)的概念: 防抖是指当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次, 如果设定时间到来之前&#x…...
Android Studio下载与安装
Android Studio下载与安装_android studio下载安装-CSDN博客...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
