利用反射如何动态生成sql

java高级之动态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<>(); // 条件list
			ArrayList<Object> sqlParams = new ArrayList<>(); // 参数list
			StringBuilder 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自动生成java代码 直接通过运行sql就能生成java实体类,特别方便,注解也能生成 立即下载

相关推荐

利用JAVA注解与反射 - 实现SQL语句自动生成

利用JAVA注解实现SQL语句自动生成 编写对应Entity添加相关注解,并通过SqlUtil工具,传入相关参数生成SQL语句 例如:要生成对应数据库Person的SQL增删改查 SqlUtil.create(Person.class) SqlUtil.insert(Person.class) SqlUtil.insert(Person.class,person) SqlUtil.updateById(Person.class,person) SqlUtil.deleteById(Person.class,person) 开发工具IDEA,MAVEN项目

java 静态sql_嵌入式静态、动态SQL

您是 DB2 应用程序开发新手吗?有了此实用指南,您将立刻掌握 DB2 的习惯与文化。如果您已经习惯了基于一种数据库开发应用程序,那么切换到不同的数据库就像是到本国的另一个地区去旅行一样。基本语言虽然差不多,但是很可能不熟悉当地的方言。当与那些将自己的应用程序从其他供应商的产品迁移到 DB2 Universal Database(DB2 UDB)的人们一起工作时,我发现如果他们一开始能掌握 DB2...

weixin_28702147的博客 591

10.2 在新能源、储能及电网节点的应用实践

构网型变流器技术在电力系统中的应用进展 构网型变流器技术正从理论研究走向规模化工程应用,为新能源并网提供主动支撑能力。该技术在光伏电站采用"部分构网"混合架构,由构网单元实现黑启动和弱网稳定;在风电场利用叶轮动能提供惯量响应。储能系统是理想的构网载体,可提供快速调频和动态电压支撑。在电网节点,构网型STATCOM可增强弱电网电压稳定性,大容量变流器可替代传统调相机。当前面临标准滞后、宽频振荡风险等共性挑战,需在可靠性、经济性间取得平衡。系统级协调控制和精确阻抗建模是应用成功的关键。

技术工作者 1109

JAVA生成SQL语句

我所在的项目是某手机银行的后台,提供给手机调用的后台接口,比如营销banner、APP上菜单数据、布局数据的下发等,同时也提供相应的后管页面供配置数据。以菜单功能为例,在后管中菜单的列表页上增加导出SQL按钮,鼠标放到哪一行数据上,哪一行就弹出导出为insert语句和导出为update语句的气泡按钮,点击按钮之后调用接口,后台从数据库查询这条数据,然后据此生成insert或update语句。则是表示字符串拼接,参数传入的是什么,就参数拼接到对应的位置,这就导致SQL每次都需要编译,同时有sql注入的风险。

qq896413023的博客 1161

Zemax物理光学实战:3分钟搞定高斯光束传播模拟(附菲涅尔局部分析技巧)

本文详细介绍了在Zemax中进行高斯光束传播模拟与菲涅尔局部分析的实战技巧。通过3分钟快速设置指南和参数解析,帮助光学工程师准确模拟激光光束特性,避免常见误区。特别分享了菲涅尔局部分析的关键技巧和传播参数优化策略,提升光学系统设计的精度与效率。

lambda的博客 804

Linux文件操作四剑客

① /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 yyyy-MM-dd / yy-MM-dd 格式。⑥“^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$” //正浮点数。

wuds_158的博客 1609

Java课题笔记~ 动态SQL详解

1、动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。2.动态SQL:code that is executed dynamically。它一般是根据用户输入或外部条件动态组合的SQL语句块。

qq_53142796的博客 1625

在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合

本文介绍了在Mac上搭建本地AI工作流的方法,结合Dify平台和DeepSeek模型。Dify是一个开源的大语言模型应用开发平台,支持可视化AI应用开发。部署步骤包括:1)安装Homebrew和Docker;2)克隆Dify代码库;3)配置环境变量并启动服务。同时,使用Ollama工具本地部署DeepSeek模型,将其集成到Dify中创建聊天助手。通过配置模型接口和新建应用,用户可以在本地环境中实现AI对话功能。这种方案既保证了数据隐私,又提供了灵活的AI应用开发能力。

Linda的自动化测试之旅 1535

9、动态SQL

mybatis动态SQL

希望有点用 1005

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3941

医学图像可视化实战:ITK-SNAP与Python+SimpleITK双方案解析

本文深入解析了医学图像可视化的两大核心方案:ITK-SNAP与Python+SimpleITK。ITK-SNAP作为专业无损浏览器,是数据探索与分析的必备工具;而Python+SimpleITK方案则提供了自动化处理能力,但需注意将.nii.gz数据转换为JPG等格式时的信息损失。文章通过实战对比,为医学影像处理者提供了清晰的选择指南与避坑建议。

ol789012的博客 490

用反射动态生成SQL语句(增,查)

反射是一种非常强大的功能,它可以帮助我们实现动态生成查询语句等灵活的数据库操作。在实际开发中,我们可以根据具体的需求来灵活地运用反射,从而提高开发效率,减少重复代码,使代码更加灵活和易于维护。

weixin_52104995的博客 789

基于 STM32 的智慧农业温室控制系统设计与实现

本文提出一种基于 STM32 微控制器的智慧农业温室控制系统设计方案,通过集成多类型环境传感器、执行机构及无线通信模块,实现对温室内温湿度、光照、土壤湿度等参数的实时监测与自动调控。文中详细阐述硬件选型、电路连接及软件实现流程,并附关键代码示例,为智慧农业领域提供低成本、高可靠性的温室控制解决方案。

weixin_42300449的博客 1923

Java利用反射机制实现动态生成Sql

场景 编写数据迁移的小工具,需要将大量整理好的对象数据插入不同的表中,按照原有的方式,工作量很大,因此考虑利用反射机制动态 + mybaits 实现动态生成Sql并批量入库 代码 利用 mybatis 注解 @InsertProvider 指定方法生成SQL语句 package com.company.cutover.provider.mapper.jydp; import org.apache.ibatis.annotations.InsertProvider; import org.apac

scropio0zry的博客 1508

时间门控拉曼进展

拉曼光谱就像是用光给分子拍“指纹照”,通过激光照射样品,散射光会揭示样品的分子结构。但问题来了,样品有时会发荧光,就像拍照时闪光灯太亮,把指纹照模糊了。时间门控拉曼光谱技术就像加了个“快门”,只在拉曼信号出现的那一瞬间开门,把慢吞吞的荧光挡在门外,这样就能拍到清晰的“指纹”。

qq_53529450的博客 535

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

使用反射动态生成sql语句

对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

ZHONGERMAOMAO的博客 1086

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java实体类利用反射动态生成insert sql语句

java实体类利用反射动态生成insert sql语句

qq_39462667的博客 4160

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

利用反射动态生成sql语句

/** 这里代码的意思是传进来一个object,检查里面有没有空值,如果有空值,则赋给默认值,最后传出一个没有空值的object,防止入库的时候发生空值错误 **/ package com.copote.xmove4Frame.util; import java.lang.reflect.Field; import java.lang.reflect.InvocationTarget

smile_园少 930

cxf restful 接口的多参数的通过反射动态生成sql的设计

对于需要大量查询并且带有大量参数的,写sql语句是一件很麻烦的事情,经常是一大片 if eles 类似这类的语句 如果再来几十各这样的查询,写起来是非常麻烦的,大量的ifelse和不必要的代码,况且这里还没有加上分页。所以在写了第一个这样的接口后,我就得解决这个问题。 我们可以运用ja...

chunyuqiu3531的博客 316

c# .Net动态生成SQL语句-泛型+反射

@TOC 标题 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示

qq_40317214的博客 1473

go 通过反射根据判断struct类型变量中成员变量是否为空,动态生成SQL语句的where 条件的字符串结果

请注意,这个示例中的判断是否为空的逻辑可能需要根据你的需求进行调整。这里使用了一个简单的比较,适用于基本类型的字段。如果结构体中有复杂类型(例如切片、映射等),你可能需要根据具体情况扩展判断是否为空的逻辑。你可以使用反射来检查结构体中的字段是否为空,并根据非空字段动态生成 SQL 查询的 WHERE 子句。函数接受一个结构体对象,并使用反射遍历结构体的字段。对于非空字段,它构建了一个 SQL WHERE 子句的字符串,并记录对应的字段值。函数用于判断一个值是否为空。函数中,我们创建了一个示例结构体。

servepeople的博客 386

反射+注解 封装增删改查sql语句

反射+注解+字符串拼接==生成数据库操作sql语句

mygod1994的博客 882

写入 反射_C#及JAVA等语言的反射机制,用来灵活生成sql和调用类方法太爽了

工作这些年,辛苦收集了很多源码,很多都是商业源码,拿来就能用,私活利器,如有需要请点击文章末尾的“了解更多”链接。上一篇文章给大家详细的讲解了反射是用来干什么的,并演示了一个简单的应用,点击链接可以看到哦!C#及JAVA等语言的反射机制有啥用,是用镜子反射太阳光玩么(一)这次我们来给大家看两个比较稍微难点并且应用很广泛的案例,对降低模块之间的耦合度和提升代码的可维护性有非常大的帮助哦!下面看看下面...

weixin_31782201的博客 161

Java注解(Annotation)详解(四)——注解反射生成SQL语句

(四)注解反射生成SQL语句 1.要求         ①使用注解来代替Hibernate,实现持久层数据访问。         ②使用注解来对每个字段或字段的组合条件进行检索,并打印出SQL。         ③数据为一张用户表,字段包括:用户ID、用户名、昵称、年龄、性别、所在城市、邮箱、手机号。

添仔哥哥 8617

利用反射拼接sql语句

首先,创建一个Student类:class Student{ private int age; private String name; private Date date; public Student(){} public int getAge() { return age; } public void setAge(int

xusheng_Mr的博客 2170
上一篇: java判断对象集合Map字符串为空方法
下一篇: 获取当前时间周月年开始结束时间
搬码达人
博客等级 码龄8年 9粉丝 31原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值