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博客...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...