02. Hibernate 初体验之持久化对象

news2024/12/24 9:16:37

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 两个信息:

  1. 你要远行的地方叫 MySql (本课程选用 MySql 为项目数据库);
  2. 你要依赖的映射文件叫 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 数据)的映射。

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

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

相关文章

自学第十六天----深入理解函数中

4. 函数的调用&#xff1a; 4.1 传值调用 函数的形参和实参分别占有不同内存块&#xff0c;对形参的修改不会影响实参。 4.2 传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系&…

在 vite+vue3+electron 中使用 express

文章目录 一、Vite Vue3 Electron 项目的搭建二、搭建 express 环境1、安装 express 框架所需依赖2、创建 express 项目3、配置路由4、启动 express 服务5、启动 electron 并获取数据 三、项目打包 一、Vite Vue3 Electron 项目的搭建 详细的项目构建和打包可参考另一篇文…

【第32章】MyBatis-Plus之代码生成器配置

文章目录 前言一、概述1.特点说明2.示例配置3. 数据库配置 (DataSourceConfig) 二、全局配置 (GlobalConfig)1.方法说明2.示例配置 三、包配置 (PackageConfig)1. 方法说明2. 示例配置 四、模板配置 (TemplateConfig)1. 方法说明2. 示例配置 五、注入配置 (InjectionConfig)1. …

第三期书生大模型实战营之Python前置知识

闯关任务1 请实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key为单词&#xff0c;value为对应单词出现的次数。 算法流程 1. 去除标点&#xff1a;使用string.punctuation和str.translate去除文本中的标点符号。 2. 转换…

制造业ERP源码 ERP系统源码 ERP小程序源码

制造业ERP源码 ERP系统源码 ERP小程序源码 资料&#xff1a; 委外工厂管理 客户列表 车间管理 供应商管理 账户管理 商品管理 仓库管理 职员管理 自取地址管理 司机管理 辅助资料 客户等级 供应商分类 客户分类 商品分类 支出类别管理 收入类别管…

第一次构建一个对话机器人流程解析(一)

1.问答机器人的组成 1.1 问答机器人的组成结构图 2. 问答机器人的组成-机器人的个人属性 所谓的机器人一般具备有个人的属性&#xff0c;这些属性固定&#xff0c;形成了机器人的个人偏好 在实现过程中&#xff0c;此处使用一个xml配置文件&#xff0c;配置了机器人的个人年…

Jetbrains IDEA中Git常用操作

Git简介与使用 Intro Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一款分布式版本控制系统&#xff08;VSC&#xff09;&#xff0c;是团队合作开发…

通信协议 | 一文玩转UART协议就够了

文章目录 协议基础1、UART简介2、UART特性3、UART协议帧3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位 4、UART通信步骤 最详细的UART通讯协议分析Verilog代码实现UART接口模块驱动 协议基础 1、UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&…

注意!避免计算组覆盖!

问题描述&#xff1a; PowerBI在实际使用中&#xff0c;针对于某些数据&#xff0c;需要呈现文本类型的标签&#xff0c;一般这类需求&#xff0c;都是通过计算组来解决的。 但计算组在使用中&#xff0c;也会存在一些问题&#xff0c;就是一旦点击交互&#xff0c;就会影响到其…

vue 自定义滚动条同步拖动(移动端)

实现效果&#xff0c;拖动左右箭头实现图片区域同步滚动&#xff0c;到边缘停止拖动。 HTML代码 <template><div touchstart"onClick"><!--使用draggable组件 图片列表区域--><draggablev-model"select_list"end"onEnd"cl…

2024软件测试面试题汇总【备战金九银十】内容较长建议收藏

一、面试基础题 简述测试流程: 1、阅读相关技术文档&#xff08;如产品PRD、UI设计、产品流程图等&#xff09;。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例&#xff08;等价类划分法、边界值分析法等&#xff09;。 5、用例评审(…

鸿蒙语言基础类库:【@ohos.convertxml (xml转换JavaScript)】

xml转换JavaScript 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 …

【Python】日期和时间模块

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言时间元组datetime 模块datetime类获取当前日期和时间 timedelta类日期和时间运算 strftime()方法格式化时间日期格式化符号 strptime()方法 Time 模块Time 模块内置函数Time 模…

牛客小白月赛98 (个人题解)(待补完)

前言&#xff1a; 昨天晚上自己一个人打的小白月赛&#xff08;因为准备数学期末已经写烦了&#xff09;&#xff0c;题目难度感觉越来越简单了&#xff08;不在像以前一样根本写不了一点&#xff0c;现在看题解已经能看懂一点了&#xff09;&#xff0c;能感受到自己在不断进步…

LLM基础模型系列:Prompt-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ 大型预训练语言模型的规模不断扩大&#xff0c;在许多自然语言处理 &#xff08;NLP&#xff09; 基准测试中取得了最先进的结果。自GPT和BERT开发以来&#xff0c;标准做法一直是在下游…

802.11ax RU - 传输的最小单元

子载波 无线信号是加载在某个固定频率上进行传输的&#xff0c;这个频率被称为载波。802.11标准中&#xff0c;对传输频率有更新的划分&#xff0c;而这些划分的频率被称为子载波。Wi-Fi 6中&#xff0c;以20Mhz信道为例&#xff0c;20Mhz信道被划分成256个子载波&#xff0c;…

Go-知识测试-子测试

Go-知识测试-子测试 1. 介绍2. 例子3. 子测试命名规则4. 选择性执行5. 子测试并发6. testing.T.Run7. testing.T.Parallel8. 子测试适用于单元测试9. 子测试适用于性能测试10. 总结10.1 启动子测试 Run10.2 启动并发测试 Parallel 建议先看&#xff1a;https://blog.csdn.net/a…

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud【翻译与解读】

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud 摘要 特征提取和匹配是许多机器人视觉任务的基本组成部分&#xff0c;如 2D 或 3D 目标检测、识别和配准。2D 特征提取和匹配已取得巨大成功。然而&#xff0c;在 3D 领域&#xff0c;当前方法由于描述性差…

手机大模型能否撑起“全村的希望”?

2023年&#xff0c;ChatGPT、SD的火爆带火了AI赛道。但现有的AI痛点则是&#xff1a;操作复杂&#xff0c;需要网络&#xff0c;大家对本地AI的呼声越来越高。也因此产生了AI PC和手机上装上大模型。手机上装大模型&#xff0c;确实会对现在低迷的手机市场带来一些影响&#xf…

链路追踪系列-02.演示zipkin

当本机启动docker es zipkinServer之后&#xff1a; 启动3个项目&#xff1a;先eureka-server&#xff0c;再 PaymentMain8001,… 浏览器打开&#xff1a;http://localhost:9001/consumer/payment/zipkin consumer代码 &#xff1a; provider: 此时查询es: