利用反射如何动态生成sql
一.自定义注解 @UpdateWhere
@Target({ElementType.FIELD}) //作用于类
@Retention(RetentionPolicy.RUNTIME) //运行时有效
@Documented //可以出现在文档里
@Inherited
public @interface UpdateWhere {}
二.创建实体类接受
public class NameValuePair<Name, Value> implements Serializable {private static final long serialVersionUID = 1276809011610487148L;private Name name;private Value value;public NameValuePair() {super();}public NameValuePair(Name name, Value value) {super();this.name = name;this.value = value;}public Name getName() {return name;}public void setName(Name name) {this.name = name;}public Value getValue() {return value;}public void setValue(Value value) {this.value = value;}public NameValuePair<Name, Value> returnThis() {return this;}}
三.动态sql生成
throws ServiceException {try {Class<?> updateClazz = updateObject.getClass();// Table 是类上面是否有这个注解if (!Verify.isEmpty(id) || updateClazz == null || !updateClazz.isAnnotationPresent(Table.class)) {throw new ServiceException("参数异常!");}ArrayList<NameValuePair<String, Object>> whereList = new ArrayList<>(); // 条件listArrayList<Object> sqlParams = new ArrayList<>(); // 参数listStringBuilder sqlBuffer = new StringBuilder("update " + updateClazz.getSimpleName() + " set ");// 开始解析// getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段for (Field declaredField : updateClazz.getDeclaredFields()) {if (declaredField.isAnnotationPresent(Id.class)) {continue; // ID不参与更新}if (!declaredField.isAnnotationPresent(Column.class)) {continue;}declaredField.setAccessible(Boolean.TRUE);String declaredFieldName = declaredField.getName();Object declaredFieldValue = declaredField.get(updateObject);if (declaredFieldValue == null || declaredFieldValue.toString().trim().length() < 1) {continue;}if (declaredField.isAnnotationPresent(UpdateWhere.class)) {// whereList.add(new NameValuePair<>(declaredFieldName, declaredFieldValue));continue; // 更新的条件不参与更新}sqlBuffer.append(declaredFieldName).append("=?,");sqlParams.add(declaredFieldValue);declaredField.setAccessible(Boolean.FALSE);}if (!sqlBuffer.toString().endsWith(",")) {// LOGGER.info("未检测到更新参数, 已生成的SQL: " + sqlBuffer + " ; 参数: " + updateObject);}/** sqlBuffer.deleteCharAt(sqlBuffer.length() -* 1).append(" where 1=1, ");*/// if (whereList.size() < 1) {
// throw new ServiceException("未检测到更新条件1, 已生成的SQL: " + sqlBuffer + ", 参数: " + updateObject);
// }/** for (NameValuePair<String, Object> nameValuePair : whereList) {* sqlBuffer.append(nameValuePair.getName()).append("=?,");* sqlParams.add(nameValuePair.getValue()); }*//** if (!sqlBuffer.toString().endsWith(",")) { throw new* ServiceException("未检测到更新条件2, 已生成的SQL: " + sqlBuffer + ", 参数: " +* updateObject); }*/String sqlString = sqlBuffer.append("updateTime=? ").append(" where id= ?").toString();sqlParams.add(updateTime);sqlParams.add(id);return new NameValuePair<>(sqlString, sqlParams.toArray());} catch (Exception e) {throw new ServiceException("生成hibernate更新的SQL异常, 参数: " + updateObject, e);}}
四.获取
name:动态sql语句value;参数值
相关文章:
利用反射如何动态生成sql
一.自定义注解 UpdateWhere Target({ElementType.FIELD}) //作用于类 Retention(RetentionPolicy.RUNTIME) //运行时有效 Documented //可以出现在文档里 Inherited public interface UpdateWhere {}二.创建实体类接受 pu…...
SpringBoot项目中使用Redis,Mybatis和JWT
在Spring Boot项目中,结合Redis,MyBatis和JWT的使用可以提供以下功能: Redis的作用: 1.缓存:Redis可以用作缓存存储,提高应用程序的性能和响应速度。特别是对于频繁读取但不经常更新的数据,如配…...
CSS2(一):CSS选择器
文章目录 1、CSS基础1.1 CSS简介1.2 CSS编写位置1.2.1 行内样式1.2.2 内部样式1.2.3 外部样式1.2.4 样式优先级 1.2.5 CSS代码风格 2、CSS选择器2.1、基本选择器2.1.1 通配选择器2.1.2 元素选择器2.1.3 类选择器2.1.4 ID选择器2.1.5 总结 2.2、CSS复合选择器2.2.1 交集选择器2.…...
LeetCode题练习与总结:不同的二叉搜索树--96
一、题目描述 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输出:5示例 2: 输入:n 1 输出&…...
第八十一章 将 Web 应用程序与远程 Web 服务器结合使用 - 如果从 Web 服务器提供静态文件
文章目录 第八十一章 将 Web 应用程序与远程 Web 服务器结合使用 - 如果从 Web 服务器提供静态文件如果从 Web 服务器提供静态文件配置 Web 服务器路径将虚拟目录添加到 IIS将别名添加到 Apache 配置 第八十一章 将 Web 应用程序与远程 Web 服务器结合使用 - 如果从 Web 服务器…...
AVL树、红黑树
数据结构、算法总述:数据结构/算法 C/C-CSDN博客 AVL树 定义 空二叉树是一个 AVL 树如果 T 是一棵 AVL 树,那么其左右子树也是 AVL 树,并且 ,h 是其左右子树的高度树高为 平衡因子:右子树高度 - 左子树高度 创建节点…...
Vscode编辑器 js 输入log自动补全
最近换了新电脑,新下载了Vscode,记录一下设置项。 Vscode 版本 想要的效果 js文件中输入log(点击tab键),自动补全为 console.log() Vscode 文件》首选项》设置 搜索:snippets Emmet: Show Suggestions…...
structured concurrency
1. 基于 c executions的异步实现 - 从理论到实践 - 知乎 (zhihu.com)...
【免费】在线识别通用验证码接口
模块优势价格5元1000次,每天免费100次api文档支持 使用量小的完全够用了 <?phpfunction Post_base64($base64_str){$url http://api.95man.com:8888/api/Http/Recog?Taken41******QK&imgtype1&len0 ; $fields array( ImgBase64>$base64_str); $ch…...
如何通过汽车制造供应商协同平台,提高供应链的效率与稳定性?
汽车制造供应商协同是指在汽车制造过程中,整车制造商与其零部件供应商之间建立的一种紧密合作的关系。这种协同关系旨在优化整个供应链的效率,降低成本,提高产品质量,加快创新速度,并最终提升整个汽车产业的竞争力。以…...
使用LangChain创建简易聊天机器人
LangChain 是什么 就是一个框架或者说是一个工具,用来写 AI 应用。对,没有错!AI小白也可以,有手就行! LangChain有几个核心模块:Models、Prompts、Chains、Indexes、Memory、Agents。 这篇主要介绍Models、…...
研究生学习---找工作
规划 研一~研二上学期完成小论文,实习,秋招 竞赛:kaggle? 面试题一般简单且为原题,笔试题目很难,不会出原题 项目 找工作软件...
偶然发现了Python的一个BUG。。。
一般情况下,dict(id1, **{id: 1})这句代码应该报TypeError。但如果在捕获了其他异常的情况下,再来执行这句代码,却是会报KeyError,如下图: Python3.10和Python3.9也能复现该情况,正当我摩拳踩掌,…...
36. 有效的数独 - 力扣(LeetCode)
基础知识要求: Java:方法、for循环、if判断、数组 Python: 方法、for循环、if判断、列表、集合 题目: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一…...
开源收银系统在服装连锁店中发挥的重要作用
在当今竞争激烈的零售市场中,服装连锁店面临着日益复杂的经营环境和多样化的消费需求。在这样的背景下,开源收银系统成为了服装连锁店管理的关键利器。该系统不仅提供了高效的收银功能,还涵盖了进销存管理、会员管理、门店补货等多方面功能&a…...
代码随想录三刷day51
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣200. 岛屿数量二、力扣695. 岛屿的最大面积三、力扣1020. 飞地的数量四、力扣130. 被围绕的区域 前言 依然是从地图周边出发,将周边空格相邻…...
基于python+Django的二维码生成算法设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
pytorch 2.0 多线程并行,导致GPU利用100%,卡住
背景: 程序中有pytorch模型两个,yolov5,crnn。 之前无论是pth格式,还是TRT格式,并行的都没有问题。 最近发现,多线程ThreadPoolExecutor(max_workers2)调用的时候,即单个进程内处理一张图像&a…...
后端开发面经系列 -- 阿里C++二面面经
阿里C二面面经 公众号:阿Q技术站 来源:https://www.nowcoder.com/feed/main/detail/fc4a48403b534aafa6a6bce14b542c4e?sourceSSRsearch 1、智能指针? std::shared_ptr: 原理:std::shared_ptr是基于引用计数的智能指…...
【Image captioning】In Defense of Grid Features for Visual Question Answering实现流程
In Defense of Grid Features for Visual Question Answering实现流程 网格特征预训练代码 这是该论文的特征预训练代码发布: @InProceedings{jiang2020defense,title={In Defense of Grid Features for Visual Question Answering},author={Jiang, Huaizu and Misra, Ishan…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
