12. Hibernate 模板设计模式

news2024/11/23 8:54:18

1. 前言

本节课和大家一起使用模板设计模式重构 Hibernate 操作流程,通过本节课程内容,你将了解到:

  • 如何运用模板设计模式重构 Hibernate 操作流程;
  • 持久化对象与序列化接口;

2. 模板设计模式

学习 Hibernate 的过程,如同训练场上练兵。终有一天,你要奔赴真正的战场(真实项目)。

所以,随时随地,要审视代码、重构代码。

2.1 什么是模板化操作

OOP 中有一个编码原则 : 写仅写一次 。翻译过来就是,不要重复,要重用。

如何简化测试实例:

答案是:使用模板设计模式进一步封装 Hibernate 的操作。

在真实项目中,Hibernate 仅仅只是完成项目中的一部分工作,需要和其它,如 Spring 等框架联合工作,一起承担整体项目的开发。

Spring 框架中就提供的有 Hibernate 模板对象。

模板设计模式的应用场景:

一个常规的、频繁的操作代码中,大部分代码不需要变动,只有小部分代码需要根据需求变动。这种场景下的代码,可认为是模板化操作流程代码,可使用模板设计模式进行重构。

JDBC 就是一个标准化的模板化操作过程。可以说,Hibernate 是一个操作 JDBC 的模板化框架。

Hiberante 虽然高度简化 JDBC 操作流程,但使用期间,还是需要按部就班的:

  1. 创建配置对象;
  2. 创建会话工厂;
  3. 创建会话对象;
  4. 创建事务对象;
  5. 终于轮到完成需求;
  6. 嘿,记得…… 关闭会话对象!谢谢提醒,差点忘记了。

好无聊呀,重复的事情,总是让人很容易麻木。内心挣扎时刻,便是想办法应对时刻。

本文中把不需要改变的代码称为模板代码
好了,现在开始,一起使用模板设计模式继续简化 Hibernate 的操作流程。这种感觉就像风一样自由。

2.2 模板化流程

先画一个图,简要说一下模板化的基本思路:

一个模板对象中有 2 种类型代码:

  • 模板代码: 公共的代码,不需要变更的代码;
  • 通知代码: 告诉调用者,此处应该是你来做了。一般采用接口的方式进行通知。

可以得出一个结论,对于一件事情,原来完全是靠调用者独立完成,现在分摊到了两个对象上,模板对象完成公共部分代码,调用者完成属于自己需求的代码。

有了上面的理解基础,便知,一个完整的模板调用过程,会涉及到 3 个角色:

  • 调用者角色: 使用者;
  • 模板角色: 封装公共代码,简化使用者的操作;
  • 接口角色: 调用者和模板角色之间的连接通道,互相通信;

下面进行具体实例编写:

1.构建一个 HibernateTemplate 类,模板角色:

public class HibernateTemplate<T extends Serializable > {
	private SessionFactory sessionFactory;
	public HibernateTemplate() {
		// 模板代码
		Configuration configuration = new Configuration().configure();
		// 模板代码
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
				.buildServiceRegistry();
		// 模板代码
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
	}
	
	public T template(Notify<T> notify) {
		// 模板代码
		Session session = sessionFactory.openSession();
		// 模板代码
		Transaction transaction = null;
		try {
			// 模板代码
			transaction = session.beginTransaction();
			// 通知代码
            T result = notify.action(session);
			transaction.commit();
			return result;
		} catch (Exception e) {
			transaction.rollback();
		} finally {
			session.close();
		}
		return null;
	}
}

2.接口角色:

public interface Notify<T extends Serializable> {
	T action(Session session);
}

3.调用者角色:此处为测试实例:

HibernateTemplate<Student> hibernateTemplate=new HibernateTemplate<Student>();	
		Student stu= hibernateTemplate.template(new Notify<Student>() {
			@Override
			public Student action(Session session) {
				return (Student)session.get(Student.class, new Integer(1));
			}
		});
		System.out.println(stu.getStuName());

4.控制台输出结果不再贴出。不要怀疑,结果一定是你所期望的。

模板对象中的接口非常重要:

  • 通知作用,并等待调用者的响应。接口中的方法也可称为回调方法;
  • 模板对象通过接口的方式暴露出 Session 给调用者,调用者不需要关心 Session 是怎么来的,安心使用便是。

模板对象中可以进一步封装 Session 对象中的相关方法,如:

public T get(Class<?> clz, Serializable ser) {
	// 模板代码
	Session session = sessionFactory.openSession();
	// 模板代码
	Transaction transaction = null;
	try {
		// 模板代码
		transaction = session.beginTransaction();
		T result = (T) session.get(clz, ser);
		transaction.commit();
		return result;
	} catch (Exception e) {
		transaction.rollback();
	} finally {
		session.close();
	}
	return null;
}

测试实例:

HibernateTemplate<Student> hibernateTemplate=new HibernateTemplate<Student>();	
		Student stu= hibernateTemplate.get(Student.class, new Integer(1));
		System.out.println(stu.getStuName());	

是不是开心的不要不要的,除了在模板类中需要写一次 Hibernate 常规流程外,具体操作时,直接上模板对象。

对于任何知识不要理所当然地接受,要善于发现代码中冗余的地方,逐步形成代码意识,随时改进代码。

3. 序列化

不知道大家发现没有,模板对象的泛型声明:

public class HibernateTemplate<T extends Serializable>{}

前面课程使用 Session 对象中的方法时,Serializable 接口时不时的就蹦出来,为什么 Hibernate 要求持久化类实现 Serializable 接口?

为什么使用 Sesssion 的方法,某些参数也需要一个实现 Serializable 接口的对象。

public Object load(Class theClass, Serializable id);
public Object get(Class clazz, Serializable id);

原因很简单,如果你真正了解什么是序列化。

所谓序列化,通俗理解:

以二进制的形式存储对象中的数据,这个过程就叫序列化。相反的,把存储的二进制数据恢复成对象数据,这个过程是反序列化。

序列化的目的,就是要以对象为单元进行数据存储,存储并不限于本地磁盘,可以是网络等环境。

序列化屏蔽底层繁琐的编码、解码过程,完全以一种面向对象的理念进行数据存储。提高开发效率。

Hiberante 为什么要求持久化对象实现序列化?

  • 缓存数据: 如先把一个查询出来的对象数据以序列化的方式存储到内存或磁盘中,需要时再读出来,再持久化到数据库中;
  • 网络数据传输: 需要把持久化数据从一个系统传到另一个系统时,可能两个系统是基于两个平台,在异构化的系统中通过二进制进行数据传递,可打破这种壁垒。

不管怎样,让对象具有序列化能力,有点像《终结者》中的液态机器人,随时把自己液态化,来去自由。适应不同的需求场景。

4. 小结

本节课也要到说再见的时候,留一个问题给大家:如果在持久化类中重写 equals 方法,为什么也要求重写 hashCode 方法。

答案其实就在于你对这两个方法的理解了。

好了!本节课,和大家一起使用模板设计模式封装了 Hibernate 的操作代码。让 Hibernate 的使用过程变得更简单,更是为了适应真实项目需求。

本节课程也和大家一起聊到了持久化对象为什么要实现序列化接口。

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

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

相关文章

服务器上使用Docker部署sonarQube,并集成到Jenkins实现自动化。

目标是要在目标服务器上使用docker工具部署好sonar环境&#xff0c;然后再集成到Jenkins中实现自动化的代码审查工作。 Docker 首先Dokcer的源大部分现在都用不了&#xff0c;于是我上网查询&#xff0c;终于找到了一个可用的镜像。 编辑/etc/docker/daemon.json文件&#x…

71.PLC Settings for OPCSERVER(KEPWare)- SAP ME实施

目录 0.目的 1.三菱PLCMitsubishi Ethernet 1.1 型号FX-3U的配置 选择Operational settings 按下图设置通讯参数 选择Open settings 按下图设置通讯端口 选择Router ralay parameter 按下图设置网关 1.2型号Q Series 按下图设置IP、网关 按下图设置端口…

WebGoC题解(13) 狐猬编程:GoC L4 结业测试 第4题 找木柴

题目描述 小明今天找了n跟木柴&#xff0c;但是木柴太多了&#xff0c;小明只能拿走m根木柴&#xff0c;小明希望拿走的木柴都是剩下的木柴中最长的&#xff0c;小明还画出以下图形 例如 输入 5 3 10 20 30 40 50 小明要拿走30 40 50 这3根木柴 从大到小画出以下图形 矩形的宽…

AWS监控工具,监控性能指标

执行AWS监视是为了跟踪在AWS环境中主动运行的应用程序工作负载和资源&#xff0c;AWS监视器跟踪各种AWS云指标&#xff0c;以帮助提高在其上运行的应用程序的整体性能。 借助阈值突破警报系统&#xff0c;AWS应用程序监控在识别性能瓶颈来源方面起着至关重要的作用&#xff0c…

46 AP-AC实战图示

一 流程 一 无线上WEB页面 1 创建vlan 56 [AC-KongZhi]vlan 56 2 退出 [AC-KongZhi-vlan56]quit 3 进入vlan三层口 配置IP地址 [AC-KongZhi]interface Vlan-interface 56 [AC-KongZhi-Vlan-interface56]ip address 192.168.56.55 24 4 在AC控制器与Host主机的接口上能通关vl…

Adobe国际认证详解-动漫制作专业就业方向和前景

动漫制作专业的就业方向和前景随着创意产业的蓬勃发展而愈发广阔。这一专业涵盖了从角色设计、场景绘制到动画制作、特效合成等多个环节&#xff0c;是创意与技术相结合的典型代表。随着数字媒体和互联网的普及&#xff0c;动漫制作专业人才的需求正不断增长&#xff0c;为该专…

Chrome v8 pwn 前置

文章目录 参考用到啥再更新啥简介环境搭建depot_tools和ninjaturbolizer 调试turbolizer使用结构数组 ArrayArrayBufferDataViewWASMJSObject结构Hidden Class命名属性-快速属性Fast Properties命名属性-慢速属性Slow Properties 或 字典模式Dictionary Mode编号属性 (Elements…

redis的使用场景和持久化方式

redis的使用场景 热点数据的缓存。热点&#xff1a;频繁读取的数据。限时任务的操作&#xff1a;短信验证码。完成session共享的问题完成分布式锁。 redis的持久化方式 什么是持久化&#xff1a;把内存中的数据存储到磁盘的过程&#xff0c;同时也可以把磁盘中的数据加载到内存…

Ubuntu 24.04 LTS Noble安装 FileZilla Server

FileZilla Server 是一款使用图形用户界面快速创建 FTP 服务器的软件。它有助于测试需要 FTP 服务器功能的各种项目。虽然早期的 FileZilla FTP 服务器仅适用于 Windows 和 macOS&#xff0c;但现在我们也可以在 Linux&#xff08;例如 Ubuntu 24.04&#xff09;上安装 FileZil…

C++ | Leetcode C++题解之第274题H指数

题目&#xff1a; 题解&#xff1a; class Solution { public:int hIndex(vector<int>& citations) {int left0,rightcitations.size();int mid0,cnt0;while(left<right){// 1 防止死循环mid(leftright1)>>1;cnt0;for(int i0;i<citations.size();i){if(…

英伟达、Mistral AI 开源企业级大模型,120亿参数、可商用

全球AI领导者英伟达&#xff08;Nvidia&#xff09;和著名开源大模型平台Mistral.ai联合开源了&#xff0c;企业级大模型Mistral NeMo 12B。&#xff08;以下简称“MN 12B”&#xff09; 据悉&#xff0c;MN 12B一共有基础和指令微调两种模型&#xff0c;支持128K上下文长度&a…

vue3.0学习笔记(二)——生命周期与响应式数据(ref,reactive,toRef,toRefs函数)

1. 组合API-setup函数 使用细节&#xff1a; setup 是一个新的组件选项&#xff0c;作为组件中使用组合API的起点。从组件生命周期来看&#xff0c;它的执行在组件实例创建之前vue2.x的beforeCreate执行。这就意味着在setup函数中 this 还不是组件实例&#xff0c;this 此时是…

Linux、Windows和macOS上使用Telnet

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS上使用Telnet时&#xff0c;不同的系统有不同的工具和设置方法。以下是在这些系统上使用Telnet的简要说明&#xff1a; Linux 在Linux上&#xff0c;Telnet通常是通过telnet命令来使用的。首先&#xff0c;你需要确保你的系…

【等保测评】服务器——Windows server 2012 R2

文章目录 **身份鉴别****访问控制****安全审计****入侵防范****恶意代码防范****可信验证****测评常用命令** Windows服务器安全计算环境测评 测评对象&#xff1a;Windows server 2012 R2 身份鉴别 &#xff08;高风险&#xff09;应对登录的用户进行身份标识和鉴别&#x…

Mysql注意事项(二)

Mysql注意事项&#xff08;二&#xff09; 最近回顾了一下MySQL&#xff0c;发现了一些MySQL需要注意的事项&#xff0c;同时也作为学习笔记&#xff0c;记录下来。—2020年06月11日 接上一篇Mysql注意事项&#xff08;一&#xff09; 9、分组数据 GROUP BY 规定&#xff…

数据库对象中出现复杂的对象嵌套,如何使用Mybatis plus优雅的解决这个问题:

起因 类原型&#xff1a; 在User类&#xff1a; package com.itheima.mp.domain.po;import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import java.time…

小技巧:如何在已知PDF密码情况下去掉PDF的密码保护

第一步&#xff0c;用Edge打开你的pdf&#xff0c;输入密码进去 第二步&#xff0c;点击打印 第三步&#xff0c;选择导出PDF&#xff0c;选择彩印 第四步&#xff0c;选择导出位置&#xff0c;导出成功后打开发现没有密码限制了&#xff01;

Json结构解析比较

文章目录 前言正文一、项目简介二、核心代码1、 JavaBeanParser2、 JsonStructCompare3、 Client 测试结果 前言 本次练习&#xff0c;主要是针对于两个Json的结构差异。 多用于测试场景&#xff0c;比如一个很大的Json报文&#xff0c;需要和现有的Json报文对比&#xff0c;看…

Robot Operating System——Service的同步/异步通信

大纲 Service模式的服务端请求响应函数启动Service停止Service完整代码 Service模式的客户端异步模式的客户端完整代码 同步模式的客户端完整代码 测试长期运行的服务发送请求响应一次的服务发送请求 参考资料 在ROS 2中&#xff0c;除了 《Robot Operating System——topic的…

汇昌联信科技拼多多怎么样?

汇昌联信科技拼多多怎么样?汇昌联信科技是一家专注于提供电子商务解决方案的公司&#xff0c;其业务涉及多个电商平台&#xff0c;其中就包括了国内知名的电商平台——拼多多。对于汇昌联信科技在拼多多上的表现&#xff0c;我们可以从以下几个方面来进行深入的探讨和分析。 一…