Hibernate框架的搭建

news2024/12/22 21:00:53

Hibernate框架的搭建

分层体系结构与持久化

三层体系结构
分层体系结构

        指的是将系统的组件分隔到不同的层中,每一层中的组件应保持内聚性; 每一层都应与它下面的各层保持松散耦合。 

        层与层之间存在自上而下的依赖关系,即上层组件会访问下层组件的API,而下层组件不应该依赖上层组件。

        每个层对上层公开API,但具体的实现细节对外透明。当某一层的实现发生变化,只要它的API不变,不会影响其他层的实现。

持久化层是怎么来的

为了把数据访问细节和业务逻辑分开,可以把数据访问作为单独的持久化层。

什么是持久化

瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态。

持久状态:保存在数据库(磁盘)的程序数据,程序退出后,数据依然存在,称为程序数据的持久状态。

持久化:将程序数据在瞬时状态和持久化状态之间转换的机制。

 

 持久化层的作用

持久化层封装了数据访问细节,为业务逻辑层提供面向对象的API,使业务逻辑层可以专注于实现业务逻辑。

MVC设计模式与四层结构的对应关系
 
持久化层设计目标

持久化层的设计目标:

        代码可重用性高,能够完成对象持久化操作;

         如果需要的话,能够支持多种数据库平台;

        具有相对独立性,当持久层发生变化时,不会影响上层实现。

Hibernate是持久化层框架。 

软件的模型及ORM

软件的模型

在软件开发的不同阶段,需要为目标系统创建不同类型的模型:

        在分析阶段,需要创建概念模型;

        在设计阶段,需要创建域模型和数据模型。

概念模型 

        概念模型用来模拟问题域中的真实实体。

        概念模型描述了每个实体的概念和属性,以及实体之间的关系。

        概念模型并不描述实体的行为。

关系数据模型

关系数据模型是在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构,它由以下内容组成:

        一个或多个表;

        表与表之间的参照完整性;

        表的所有索引;

        触发器;

        视图。

域模型

域模型是面向对象的,在面向对象术语中,域模型也可称为设计模型。

域模型由以下内容组成:

        具有状态和行为的域对象;

        域对象之间的关系。

域对象

域对象可以代表业务领域中的人、地点、事物或概念等。

域对象分为以下几种:

        实体域对象:业务领域的名词;

        过程域对象:业务领域的动词;

        事件域对象:业务领域中的事件。

域对象关联关系

从Order到Customer的多对一单向关联。

从Customer到Order的一对多单向关联。

 从Customer到Order的一对多双向关联。

 

对象-关系映射

一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。 

域模型与关系模型之间存在许多不匹配之处

        域模型中有继承关系,关系模型不能直接表示继承关系。

        域模型中有多对多关联关系,关系模型通过连接表来表示多对多关联关系。

        域模型中有双向关联关系,关系模型只有单向参照关系,而且总是many方参照one方。

        域模型提倡精粒度模型,而关系模型提倡粗粒度模型。

对象-关系映射

对象-关系映射(Object Relational Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。用来把域模型表示的对象映射到关系数据模型对应的数据库结构中去。

通过ORM模式在操作实体对象的时候,就不需要再去和复杂的 SQL语句打交道,只需简单的操作实体对象的属性和方法,ORM 技术是在对象和关系之间提供了一条桥梁,对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。

ORM框架

通过ORM框架实现

通过JDBC实现 

直接通过JDBC API来持久化实体域对象。

public interface CustomerManger {
    public void saveCustomer(Customer customer);
    public void deleteCustomer(Customer customer);
    public void updateCustomer(Customer customer);
    public Customer loadCustomer(long id);
    public List findCustomerByName(String name);
    public List findCustomerByAge(int age);
    public List findCustomerByNameAndAge(String name,
                                         int age);
    public List findCustomer(String sqlstr);
}
通过JDBC实现的缺点

业务逻辑和关系数据绑定,如果关系数据模型发生变化,例如修改了表的结构,那么必须手工修改程序代码中所有相关的SQL语句,增加了软件维护的难度。

如果程序代码中的SQL语句包含语法错误,在编译时不能检查这种错误,在运行时才能发现这种错误,这增加了调试程序的难度。 

持久化层产生大量冗余代码,如下3个查询方法,程序代码都很相似,仅仅是 SQL SELECT 语句中的查询条件不一样。

public List findCustomerByName(String name);
public List findCustomerByAge(int age);
public List findCustomerByNameAndAge(String name, int age);

findCustomer()方法是供业务逻辑层调用,使得业务逻辑层需要了解数据库的访问细节,无法达到软件分层的效果。 

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

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

相关文章

【一学就会】(一)C++编译工具链——基于VSCode的CMake、make与g++简单理解与应用示例

目录 一、CMake、make与g 1、名词辨析 2、孰优孰劣 二、应用示例 1、工具类安装与配置 1)VSCode安装与配置 2)CMake下载与安装 3)MinGW-W64下载与安装 A、科学上网法 B、无需科学上网法 4)VSCode推荐插件 A、c/c编译环…

nandgame中的Tokenize(标记化)

题目说明: "Tokenize" "标记化"标记器预先配置为识别数字和符号 。请配置标记器以额外识别符号减号 - 和括号 ( 和 )。您可以编辑源代码区域中的代码以测试它的标记化。level help 我们将构建一种高级编程语言。 高级语言具有更加人性化和灵…

K8s-Ingress Nginx-Day 08

1. 什么是Ingress 官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#what-is-ingress Ingress 是 kubernetes API 中的标准资源类型之一,主要是k8s官方在维护。 2. Ingress的作用 Ingress 提供从集群外部到集群内服务…

NAT转换是怎么工作的?

前言 对象: 服务器S,NAT设备,用户设备C1,用户设备C2 用户C1向服务器S发起一个HTTP请求,经过NAT转化,服务器收到并作出响应,用户C1收到响应。 问题来了,NAT是怎么知道这个响应是给用户C1而不是…

配电室实现智能化用电管理平台的搭建构思

1 宝安区水务现状 河流基本情况:宝安区共有66条河涌,66条河涌分属茅洲河及珠江口沿海河涌两大水系,总长254km,流域总面积532km2。全区水环境状况有以下几个特点:一是水质污染严重,主要污染物为氨氮、总磷和阴离子表面…

利用虚拟机建ITtools

网上给的虚拟机多数都是VMX格式的封包,而我这次用的是ovf 我先把虚拟机在导出为ovf 生成了三个文件 去服务器上创建虚拟机,选择从OVF或OVA文件部署虚拟机,点下一页 给虚拟机起个名字 把相应的文件扡到里面去(这里生成的四个文件中…

(React生命周期)前端八股文修炼Day8

一 React的生命周期有哪些 React组件的生命周期可以分为三个主要阶段:挂载(Mounting)、更新(Updating)和卸载(Unmounting)。React类组件的生命周期方法允许你在组件的不同阶段执行代码。 挂载…

第十二天--二维数组的彻底解刨--地址

1.二维数组我们用父子的地址来称呼二维数组的地址 比如arr[3][4] 这里的arr是二维数组的首地址,也是父数组的首地址,也是子数组的首地址 arr1父数组的地址偏移1,实际上是偏移了4*416个字节 arr[0]是子数组的首地址,arr[0]1是子数…

Vue3---基础2(component)

主要讲解 component 的创建 以及vue插件的安装 Vue.js Devtools 为谷歌浏览器的Vue插件,可以在调试工具内查看组件的数据等 下载 有两种下载方式 1. 谷歌应用商店 打开Chrome应用商店去下载,这个方法需要魔法 2. 极简插件 极简插件官网_Chrome插件下载_…

OpenC910 datasheet 2.0 翻译

概述 C910是由THEAD半导体有限公司开发的一款RISC-V兼容的64位高性能处理器。它通过架构和微架构创新,在控制流、计算和频率方面提供行业领先的性能。C910处理器基于RV64GC指令集,并实现了XIE(XuanTie指令扩展)技术。C910采用先进…

Python自动化测试怎么去学习?熬夜7天整理出这一份3000字学习指南!

一、Python常用领域 Python用于简单脚本编程,如编写2048小游戏或12306的自动抢票软件;Python用于系统编程,如开发系统应用;Python用于开发网络爬虫;网络爬虫的用途是进行数据采集,也就是将互联网中的数据采…

OSPF中配置静态路由负载分担实验简述

OSPF中配置静态路由负载分担 实验简述 在静态路由负载分担中,多个路由器被配置为共享负载的目标,以实现流量的均衡分配。 到达目的地有N条相同度量值的路径,默认值60,N条路由是等价路由,数据报文在N条链路上轮流发送。…

力扣刷题 二叉树遍历的统一迭代法

题干 给定一个二叉树的根节点 root ,返回 它的 前中后序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入:root […

C++设计模式:构建器模式(九)

1、定义与动机 定义:将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化) 动机: 在软件系统中,有时候面临着“一个复杂对象”的创建工作&#x…

基于SSM的课程进度管理系统的设计与实现

摘要: 在信息技术飞速发展的当下, 借助互联网平台以及功能性系统的支持,人们获取信息以及信息整合的通道越来越多元化。系统和平台帮助人们实现了信息的共享,同时帮助人们更加直观的看到成果和过程的变动。以课程进度管理为例&…

python使用uiautomator2操作雷电模拟器9找图

接上篇文章python使用uiautomator2操作雷电模拟器9并遇到解决adb 连接emulator-5554 unauthorized问题-CSDN博客 搭建好uiautomator2后,主要就是使用了。 本文就利用uiautomator2的截屏、模拟点击和aircv的找图功能,实现对指定寻找的图片的位置的点击。…

HikariPool-1 - jdbcUrl is required with driverClassName.

文章目录 前言一、问题提示二、如何改进1.原来配置2.应该修改成 总结 前言 这是在配置数据库发生多数据源产生的错误 一、问题提示 二、如何改进 1.原来配置 2.应该修改成 总结 以上就是今天要讲的内容,本文仅仅简单介绍了springboot多数据源报错问题

Leetcode算法训练日记 | day17

一、平衡二叉树 1.题目 Leetcode:第 110 题 给定一个二叉树,判断它是否是 平衡二叉树 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:true示例 2: 输入:root [1,2,2,3,3,null,null,4,4]…

旋转链表--快慢指针思想

相似题型:删除链表的第倒数第n个节点,建议先做,有利于理解 class Solution {public ListNode rotateRight(ListNode head, int k) {ListNode prehead;ListNode firsthead;ListNode secondhead;ListNode lenpre;int length1;if(headnull)retu…

Linux——fork复制进程

1)shell: 在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令&…