Spring中对Hibernate 的简单封装原理

2023-11-12

微笑开篇提示:本文以spring2.5.6为基准展开,如文中有误欢迎指出。

疑问开篇大家可以思考一些问题:

1、spring中对于hibernate的整合是怎样的?

2、spring为什么要对hibernate做进一步的封装?这样做的好处是什么?

***************************************************************************************************************

我的讲解需要引用spring2.5.6的代码,为了省空间这里不给粘贴源码了,源码位置:spring.jar-->org.springframework.orm.hibernate3.HibernateTemplate.java。

参考文档:spring docs  index.html--->第12章

需要提前了解的概念:模板模式Template Method、匿名内部类。

害羞谈谈我学习该知识点时的囧态吧:

       我学习这个地方的时候,是看马士兵老师的视频学的,版本可能老一点,没关系,学精髓就可以了。可是我怎么听也不明白,callback是什么东西,为啥又用到匿名内部类,这些跟hibernate的封装有啥鸟关系?!呵呵,到此你的思维千万不要被我拐了,主题还是HibernateTemplate.java,先不要管其他的。

好,我们从为啥要引入这个HibernateTemplate说起吧:

       原来使用sessionFactory.openSession();时你看看下面被注的代码中是不是很多行,而且这只是一个dao实现类就这样,那要是项目中有很多个这样的dao咋办,难道还要重复这些代码吗,你仔细观察就可以看到不管是不是同一个dao实现,不同的只有对数据库的操作,为了避免这种重复的体力劳动才引入模板这个概念,从而HibernateTemplate诞生了。现在好了,有了模板,不管你对数据库做啥都一句话搞定:template.方法名(u);

       到此为止,Spring中对Hibernate 的简单封装还没讲到呢,只是讲了讲人家封装完之后怎么用的,原理在该代码之后。

package com.wuf.spring.dao.impl;

import javax.annotation.Resource;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import com.wuf.spring.dao.UserDAO;
import com.wuf.spring.model.User;

@Component("userDAO")
public class UserDAOImpl implements UserDAO {
private HibernateTemplate template;
public HibernateTemplate getTemplate() {
return template;
}
@Resource
public void setTemplate(HibernateTemplate template) {
this.template = template;
}
//使用HibernateTemplate后的save方法
public void save(User u){
template.save(u);
}
//使用HibernateTemplate前的save方法
// 关于HibernateTemplate的实验代码,除了session.save(u);其他的都可以作为公共部分
// public void save(User u){
// Session session = null;
// try {
// session = sessionFactory.openSession();
// // session.beginTransaction();
// session.getTransaction().begin();
//
// session.save(u);// 这里可以是update、delete、insert,这里是变化的
//
// session.getTransaction().commit();
// } catch (HibernateException e) {
// e.printStackTrace();
// session.getTransaction().rollback();
// } finally {
// if (session != null) {
// session.close();
// session = null;
// }
// }
// }
}

封装原理:

就是将不变的部分封起来,想办法把变的部分通过方法弄进来。结合生活例子理解更简单一点:都做过试卷吧,一个考场好几十个呢,卷子刚发下来都是一样的没答案,这些一样的试卷就是模板,你只需要填答案就行了,因人不同所以答案可能不同,这里需要注意啊,重点是给考生的都是模板,不要纠结答案同不同。

       所以封装的原理就是模板,严格来说就是模板方法。这是一种设计模式,自己去查资料。

     来看一下spring是怎样实现的:

    //dao实现类里是模板类调save方法。这咋就体现了模板的概念呢,别急,他体现在模板类对save方法的实现 executeWithNativeSession方法上。

     public void save(User u){
template.save(u);
    }

     //HibernateTemplate中对save的实现,可以说executeWithNativeSession(..)就是模板

     public Serializable save(final Object entity) throws DataAccessException {
          return (Serializable) executeWithNativeSession(new HibernateCallback() {
                      public Object doInHibernate(Session session) throws HibernateException {
                       checkWriteOperationAllowed(session);
                       return session.save(entity);
                        }
                });
         }

     //来看一下模板executeWithNativeSession是啥样子吧,下面这段代码是我自己模拟的,他的源码讲解起来又没玩没了了

import org.hibernate.Session;
public class MyHibernateTemplate {
public void executeWithNativeSession(MyHibernateCallback callback) {
Session s = null;
try {
s = getSession();
s.beginTransaction();
callback.doInHibernate(s);
s.getTransaction().commit();
} catch (Exception e) {
s.getTransaction().rollback();
} finally {
//...
}
}
private Session getSession() {
return null;
}
public void save(final Object o) {
new MyHibernateTemplate().executeWithNativeSession(new MyHibernateCallback() {
public void doInHibernate(Session s) {
s.save(o);
}
});
}
}
事实上模板类不仅仅是实现save一个方法,spring的模板类HibernateTemplate将数据库操作的方法都实现了,这里HibernateTemplate把变化(即未知)的部分当参数传进来的,而spring又利用匿名内部类作为这个参数的载体,所以模板类、模板方法、匿名内部类就是这样的关系啦。其实就是一个抽取、传参的过程。

总结:开篇的第一个问题不在这里给予解答,那只是让你复习下spring对hibernate的整合,第二个问题回答就是省代码了,这也算是一种性能的提升吧。没有陌生的技巧,spring用的很巧妙。

提醒:不要忘了spring的注入,在beans.xml中写

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring中对Hibernate 的简单封装原理 的相关文章

  • Maven 未运行 Spring Boot 测试

    我有一个要测试的 Spring Boot REST API 我可以在 Eclipse 中手动运行测试 无需 Maven 并通过将应用程序作为 JUnit 测试运行 它运行良好并显示结果 但是mvn test正如您将在下面发现的那样 它不起作
  • Spring @PostConstruct 依赖于 @Profile

    我想在一个配置类中拥有多个 PostConstruct 带注释的方法 这些方法应该根据 Profile 进行调用 你可以想象这样的代码 Configuration public class SilentaConfiguration priv
  • Spring Data:2个不同数据源之间的关系

    在 Spring Boot 应用程序项目中 我有 2 个数据源 MySQL 数据库 又名 db1 MongoDB 数据库 又名 db2 我在用着Spring数据JPA and Spring数据MongoDB 而且效果很好 一次一个 假设 d
  • 如何将 Hibernate 5 安装到 Apache Karaf v4 中

    我已经安装了 Apache Karaf v4 03 并查询了 Hibernate 的可用功能列表 如下所示 不幸的是 我使用的是 Hibernate v5 hibernate 3 3 2 GA Uninstalled enterprise
  • Spring MVC 3.0中使用下划线绑定请求参数

    考虑以下要求 请求参数必须使用 Spring MVC 3 0 绑定到对象 请求参数包含下划线 例如http myurl 80 x param one 1 param two 2 这些参数应绑定到以下对象 class MyObject pri
  • Hibernate 级联删除未按预期工作

    我正在使用 hibernate 3 并尝试删除数据库中的记录 但删除操作未按我的预期进行 hibernate 正在针对的模式 以伪代码形式 create table Employer employer id number 12 primar
  • 用 @DataJpaTest 注释的测试不是用 @Autowired 注释的自动装配字段

    我有一个 Spring Boot 应用程序 其中包含 Spring Data Jpa 存储库 我需要围绕这个存储库运行单元 或组件 测试 我对 Spring Data Jpa 没有太多经验 这是我的测试 这很简单 我无法让它通过 impor
  • jdbc-initialize-database 找不到脚本文件 - DataAccessResourceFailureException

    我无法让我的 Spring Web 应用程序找到我的脚本 我已经配置了 jdbc 命名空间 我已经写好了脚本 但是 我不明白为什么无论我把脚本放在哪里 都找不到它们 我特别将文件夹标记为 类文件夹 我把它们和我所有的罐子放在同一个文件夹里
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮
  • 在 Spring Singleton 中创建新实例会导致内存泄漏吗?

    我目前正在维护一个应用程序 并注意到许多在 Spring 接线中定义为 Singleton 的对象在其方法中创建了其他对象的新实例 例如 有一个 LoginService Singleton 每次调用 login 方法时都会创建 Login
  • 使用 Swagger UI 进行基本身份验证

    我正在尝试通过 Swagger UI 开发一个基于 spring boot 的 REST API 服务以及 API 文档 我想通过 swagger UI 启用基本身份验证 以便用户只有在使用 swagger UI 上的 授权 按钮进行身份验
  • 如何重新启动服务器关闭后动态创建的 Quartz 作业

    我正在使用 spring mvc 4 2 5 RELEASE 和quartz 2 2 1quartz jobs 2 2 1 当用户输入石英作业的名称和 cron 表达式时 我有一个用户界面 然后我像这样创建作业 SchedulerFacto
  • 如何在 spring 中使用配置文件指定外部 application.yml

    来自弹簧文档http docs spring io spring boot docs current reference html boot features external config html boot features exter
  • Spring Batch 多线程

    我正在编写一个 Spring Batch 并希望在需要时对其进行扩展 我的 ApplicationContext 看起来像这样 Configuration EnableBatchProcessing EnableTransactionMan
  • Hibernate HQL 查询:如何将集合设置为查询的命名参数?

    给定以下 HQL 查询 FROM Foo WHERE Id id AND Bar IN barList I set id使用查询对象的setInteger 方法 我想设置 barList用一个List对象 但查看 Hibernate 文档和
  • Maven:缺少工件 org.springframework:spring:jar:4.2.6

    我在 SpringToolSuite 中有一个动态 Web 项目 它被转换为 Maven 项目 我遇到问题 缺少工件 org springframework spring jar 4 2 6 我已经尝试清理 重建和运行该项目 它给 读取文件
  • Spring @Transactional 并发

    class MyService 公共无效a 同步 某个键 b Transactional 传播 传播 REQUIRES NEW 公共无效b 数据库工作吗 除非您使用代码编织 否则这是行不通的 Spring处理事务的默认方式是通过AOP代理
  • 如何在 Hibernate 中左连接获取多个子项?

    我正在使用 hibernate 但在创建一个获取对象的所有子对象的 hql 查询时遇到了麻烦 例如 对象用户有一个汽车列表和一个朋友列表 为了让用户拥有他的汽车 我将使用以下查询 from User u left join fetch u

随机推荐

  • Kafka学习(三)——Java工具类、Springboot集成批量消费、SparkStreaming集成

    文章目录 前言 一 Java中工具类 1 添加maven依赖 2 消费者 KafkaConsumerTest 3 生产者 KafkaProducerTest 二 SpringBoot中使用 4 1 引入依赖 4 2 application
  • vim复制多行和删除多行的方法

    方法1 光标放到第6行 输入 2yy 光标放到第9行 输入 p 此方法适合复制少量行文本的情况 复制第6行 包括 下面的2行数据 放到第9行下面 方法2 命令行模式下输入 6 9 co 12 复制第6行到第9行之间的内容到第12行后面 方法
  • 泛微 E-Office文件上传漏洞复现(CVE-2023-2523、CVE-2023-2648)

    0x01 产品简介 泛微E Office是一款标准化的协同 OA 办公软件 泛微协同办公产品系列成员之一 实行通用化产品设计 充分贴合企业管理需求 本着简洁易用 高效智能的原则 为企业快速打造移动化 无纸化 数字化的办公平台 0x02 漏洞
  • Python 基础知识记录

    一 两个list第一个列表排序后 第二个列表根据第一个列表索引进行排序 x 2 1 4 5 6 0 y a b c d e f x sorted sorted x index sorted range len x key lambda k
  • QMessageBox的使用

    QMessageBox是Qt中常用的对话框类 用于显示消息 警告 错误等信息 常用的QMessageBox用法包括 1 显示信息框 QMessageBox information parent title text 2 显示警告框 QMes
  • 超实用!这是我见过最全面的python入门教程,新手小白不要错过

    Python 是一门开源免费 通用型的脚本编程语言 它上手简单 功能强大 坚持 极简主义 Python 类库 模块 极其丰富 这使得 Python 几乎无所不能 不管是传统的 Web 开发 PC 软件开发 Linux 运维 还是当下火热的机
  • Hello React (创建自己的第一个React 页面)

    Rract是啥 React 是用于构建用户界面的 JavaScript 库 构建用户界面 User Interface 对咱们前端来说 简单理解为 HTML 页面 javscrtipt库 不是框架 是库 react 全家桶才是框架 reac
  • 统计学习的基本概念和分类

    前言 一 统计学习的概念 1 统计学习应用领域 pic center 80 x80 2 统计学习的概念 统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科 以计算机和网络为平台 以数据为研究对象 以预测和分
  • Fake Objects

    Spring的创始人Rod Johnson关于伪对象 Fake Objects objects in appearance but which don t exhibit some of the characteristics of obj
  • java: DAL using SQL Server

    sql 角色类型表RoleType geovindu 涂聚文 Geovin Du IF EXISTS select from sysobjects where id object id N dbo RoleTypeList and OBJE
  • 史上最全,K8s创建pod yaml例子

    kubernetes创建pod的yaml文件 参数说明 apiVersion v1 指定api版本 此值必须在kubectl apiversion中 kind Pod 指定创建资源的角色 类型 metadata 资源的元数据 属性 name
  • 服务器加固系统文档,手把手教你如何加固你的服务器.docx

    摘要 为提升服务器安全性 减少信息资产的泄漏风险 我们需要对服务器进行安全加固 从系统 策略 应用程序 帐号密码等各方面进行加强 避免一些低级安全问题的出现 本文基于集 团信息化安全规定 针对服务器安全配置的方法进行详细描述 并提供了服务器
  • 超全C1认证学习笔记,内容详细,赶快收藏

    在我们考过C认证和正在考C认证的同学们当中 都有十分认真的同学 他们每堂课都认证的记下笔记 归纳好 方便自己后续的复习 今天我们也收到我们C认证考生的投稿 他一共投稿了三篇文章 内容包括计算机通识 WEB基础 JavaScript基础三篇文
  • Android调用C++实现共享内存(Native层)

    Android下匿名共享内存java层接口利用MemoryFile实现进程间内存共享 利用MemoryFile可以参考这篇文章 https blog csdn net qq 24451593 article details 80514566
  • Node之在多个子进程中运行Node.js应用程序

    引 一个Node js应用程序只能使用在一个线程中 最近 为了充分发挥多核CPU的优势 Node js中提供了一个cluster模块 允许在多个子进程中运行不同的Node js应用程序 使用fork方法创建worker对象 在cluster
  • 【linux】buff/cache手动释放

    在云上跑了一个深度学习的东西 但是数据量实在太大 为了加速 我就直接将数据集全部加载到内存中 毕竟对于GPU云服务器来说 内存和GPU比起来实在不算钱 但是运行top指令发现 linux中的buff cache占比相当大 但没发现占用这个的
  • Python 程序设计习题(3) —— 程序控制结构

    目录 1 Python 习题部分 2 Python 习题讲解 while 循环 if else条件分支语句 for 循环 其他 1 Python 习题部分 要想学习一门语言 便少不了练习 故附上部分 Python 习题 供大家学习参考 如有
  • Ted 带你学习数据结构 之 二叉堆(Binary Heap)

    二叉堆 Binary Heap 1 structure property Heap 堆 是一个除了底层节点外的完全填满的二叉树 底层可以不完全 左到右填充节点 a heap is a binary tree that completely
  • vue3中全局引入less

    1 安装less less loader yarn add less less loader 2 安装style resources loader yarn add style resources loader 3 安装vue cli pl
  • Spring中对Hibernate 的简单封装原理

    开篇提示 本文以spring2 5 6为基准展开 如文中有误欢迎指出 开篇大家可以思考一些问题 1 spring中对于hibernate的整合是怎样的 2 spring为什么要对hibernate做进一步的封装 这样做的好处是什么 我的讲解