hibernate执行外部sql

开发背景

公司多年前项目,使用hibernate作为持久层,部分sql查询采用spring的JdbcTemplate,sql穿插在java代码中。因此,需要统一使用hibernate,并且sql部分需要类似Mybatis一样从文件中读取。由于引入Mybatis需要对项目改动较大,因此,需要编写相应代码用以支持hibernate动态读取外部sql。

功能介绍

对hibernate功能进行拓展,使之可读取外部sql并执行相应逻辑返回结果,功能类似Mybatis的相关逻辑。

代码简介

项目主要通过com.feng.spring.hibernate.extend.processor.HibernateExtendPostProcessor的postProcessBeanDefinitionRegistry方法,解析相关sql并缓存,将相关接口解析成代理类,其中:

        BeanDefinitionBuilder builder1 = BeanDefinitionBuilder.genericBeanDefinition();AbstractBeanDefinition definition1 = builder1.getBeanDefinition();definition1.setBeanClass(HibernateExtendFactory.class);definition1.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);definition1.getPropertyValues().add("hibernateExtendConfiguration", configuration);definition1.getPropertyValues().add("hibernateExtendSQLExecutor", new DefaultHibernateExtendSQLExecutor());definition1.getPropertyValues().add("hibernateExtendSQLBuilder", new DefaultHibernateExtendSQLBuilder());registry.registerBeanDefinition(FACTORY_NAME, definition1);

建议HibernateExtendFactory的注册可以放到标注为@Configuration的配置文件中进行,由于项目没有引用springboot相关依赖,因此可以参照如下:

@Bean
public HibernateExtendFactory hibernateExtendFactory(SessionFactory sessionFactory){HibernateExtendFactory hibernateExtendFactory = new HibernateExtendFactory();hibernateExtendFactory.setSessionFactory(sessionFactory);return hibernateExtendFactory;
}

使用帮助

  • 建议将代码下载,调整后编译为相应的jar包使用而不是直接拖入项目中。
  • 项目需要spring的支持
  • 相关查询的dao必须是接口形式存在,且相关方法名不允许多态
  • sql文件命名规则为 类名全限定名 + _ + 方法名 +.sql ,且拓展名.sql须小写,例如:com.feng.springboot.hibernate.demo.Tee_get.sql
  • sql扫描路径配置属性为“hibernate-extend.locations”,例如:hibernate-extend.locations=classpath*:/sql/**/*_*.sql,不填写的情况下默认项目内扫描*_*.sql的文件。建议填写越详细越好,可以提高扫描速度减少项目启动时间。
  • 需要根据项目本身情况对本项目进行调整,尤其是Executor部分逻辑,需要定制更贴合自身项目的代码!
  1. 编写sql
  • 编写第一个sql文件com.feng.springboot.hibernate.demo.Tee_get.sql
select id, name from ${tableName} where id = #{id}

和Mybatis一样 ${}表示替换变量,#{}表示预编译参数。

  • 编写第二个sql文件com.feng.springboot.hibernate.demo.Tee_list.sql:
select id, name from test_hibernate_entity where id in (#{ids})

和上面一样#{}表示预编译参数,但是会根据java方法中传入的参数,判断为多个参数,会自动拼接多个占位符用以支持in查询。

  1. 编写接口类com.feng.springboot.hibernate.demo.Tee:
public interface Tee {List get(String tableName, int id);List list(List ids);   // 参数说明:java.util.List或者相应格式数组都会被解析为多个参数
}

通过这两个步骤,代码中就可以自动注入Tee这个类了

其他

参照demo
源代码下载:
https://download.csdn.net/download/u013271384/89096891

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

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

相关文章

哈希存节点,双dp数组存选和不选

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连…

Linux:安装zabbix-agent被监控端(2)

本章是结合着上一篇文章的续作 Linux:部署搭建zabbix6(1)-CSDN博客https://blog.csdn.net/w14768855/article/details/137426966?spm1001.2014.3001.5501本章将在两台centos部署agent端,然后使用server进行连接监控 agent1 在1…

11、子串-滑动窗口最大值

题解: 双端队列是一种特殊的队列,允许你在队列的两端进行插入和删除操作。在滑动窗口问题中,我们使用它来存储可能是当前窗口最大值的元素的索引。 维护队列的顺序: 当新元素进入窗口时,我们将它与队列尾部的元素进…

RSA相关学习存档

什么是RSA,以及RSA算法: https://zhuanlan.zhihu.com/p/450180396 https://blog.csdn.net/m0_51607907/article/details/123884953 https://blog.csdn.net/firechungelaile/article/details/39974379 https://blog.csdn.net/lesczx/article/details/…

【LeetCode热题100】4. 寻找两个正序数组的中位数(二分)

一.题目要求 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 二.题目难度 困难 三.输入样例 示例 1: 输入:nums1 [1,3…

子集(迭代)(leetcode 78)

核心逻辑&#xff1a; 根据子数组包含的元素个数迭代&#xff1a; 现有子集的基础上通过添加这个新元素来翻倍子集的数量 f(n)2f(n−1) vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> ans;int i,j,k;ans.p…

《科技创业月刊》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a;问&#xff1a;《科技创业月刊》是什么级别的刊物&#xff1f; 答&#xff1a;省级&#xff0c;主管单位&#xff1a; 湖北省科学技术厅 &#xff1b;主办单位&#xff1a;湖北省科技信息研究院 问&#xff1a;《科技创业月刊》是c刊吗&#xff1f; 答&…

spring面试八股

常用的注册bean的方式 ComponentScan扫描到的service和Controller等的注解 Configration配置类或者是xml文件的定义。 spring中有几种依赖注入的方式 1.构造器注入。 2.setter方法注入。 3.使用field属性的方式注入。 applicationContext是什么 spring bean spring aop Aop…

Linux命令-dpkg-deb命令(Debian Linux下的软件包管理工具)

说明 dpkg-deb命令 是Debian Linux下的软件包管理工具&#xff0c;它可以对软件包执行打包和解包操作以及提 供软件包信息。 语法 dpkg-deb(选项)(参数)选项 -c&#xff1a;显示软件包中的文件列表&#xff1b; -e&#xff1a;将主控信息解压&#xff1b; -f&#xff1a;把…

java种Hutools常用方法

目录 一、依赖二、Convert三、DateUtil四、StrUtil五、ReflectUtil六、IdUtil七、RandomUtil八、BeanUtil九、JSONUtil Hutool是一个小而全的Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&#xff0c;使Java拥有函数式…

2-django、http、web框架、django及django请求生命周期、路由控制、视图层

1 http 2 web框架 3 django 3.1 django请求生命周期 4 路由控制 5 视图层 1 http #1 http 是什么 #2 http特点 #3 请求协议详情-请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本-请求头---》key:value形式-referer&#xff1a;上一次访问的地址-user-agen…

【算法-数组】移除元素

这里写自定义目录标题 暴力解法双指针思路 leecode27 : https://leetcode.cn/problems/remove-element/submissions/521113648/ 暴力解法 循环匹配&#xff0c;每次匹配到就将数组匹配到的元素的后面元素向前移动一位 【注意】 注意最后一位元素&#xff0c;避免数组越界 pu…

tcp/ip细节

主动方: 发送fin进入fin_wait1,收到fin的ack进入fin_wait2&#xff0c;发送fin时接收缓冲区还有数据 - 应用层不读数据你就close?发reset告知对端你出问题了 默认&#xff1a;linger关闭&#xff0c;close调用立即返回(发出发送缓冲区未发出数据和fin后) linger开启&#xff0…

Sora是什么?Sora怎么使用?Sora最新案例视频以及常见问题答疑

Sora 是什么&#xff1f; 2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型Sora 这样说吧给你一段话&#xff0c; 让你写一篇800字的论文&#xff0c;你的理解很可能都有偏差&#xff0c;那么作为OpenAi要做文生视频到底有多难&#xff0c;下面…

【从零到一手撕脚手架 | 第三节】项目集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged

【从零到一手撕脚手架 | 第三节】项目集成CommitLIntESLintPrettierStyleLintLintStaged Hello大家好我是⛄&#xff0c;前两节教大家如何初始化一个脚手架项目以及如何封装Vue技术栈常用的工具库。本小节教大家如何向我们的脚手架中配置ESLint、Prettier、StyleLint、LintStag…

科研学习|研究方法——扎根理论三阶段编码如何做?

一、背景介绍 “主题标引”意指对文献内容进行分析, 然后对文献所表达的中心思想、所讨论的基本问题以及研究的对象等进行提取, 以形成主题概念, 然后在此基础上把可检索的主题词表示出来, 再将这些主题词按一定顺序 (如字顺) 排列, 对论述相同主题内容的文献加以集中, 从而提高…

Linux下场景模拟--cpu、内存打满测试

Linux下场景模拟–cpu、内存打满测试 打满CPU占用 编写脚本vi /root/cpu_run_full.sh vi /root/cpu_run_full.sh填写如下内容&#xff1a; #!/bin/bash function while_run_cpu() {while true;doi2;done }function cpu_full() {for ((i0; i<$1; i));dowhile_run_cpu &am…

css伪类:last-child或:first-child不生效

目录 一、问题 二、原因及解决方法 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.想使用伪类:last-child给 for循环出来的最后一个元素单独添加样式。但是发现无论怎么写都没有添加上去。 2.真是奇怪呀&#xff0c;明明写的没有问题呀&a…

云备份day04

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C云备份项目 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容介绍了文件工具了类的实现 文章目录 云备份day041.文件…

掌握Go语言:Go语言精细错误,清晰、高效的错误处理实践(32)

错误处理是任何编程语言中都至关重要的一部分&#xff0c;Go 语言提供了一套简单而强大的错误处理机制&#xff0c;使得处理错误变得高效而清晰。 Go 错误类型 在 Go 中&#xff0c;错误是一个普通的接口类型&#xff0c;即 error 接口&#xff0c;其定义如下&#xff1a; t…