当前位置: 首页 > news >正文

利用反射如何动态生成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;参数值
http://www.lryc.cn/news/349474.html

相关文章:

  • SpringBoot项目中使用Redis,Mybatis和JWT
  • CSS2(一):CSS选择器
  • LeetCode题练习与总结:不同的二叉搜索树--96
  • 第八十一章 将 Web 应用程序与远程 Web 服务器结合使用 - 如果从 Web 服务器提供静态文件
  • AVL树、红黑树
  • Vscode编辑器 js 输入log自动补全
  • structured concurrency
  • 【免费】在线识别通用验证码接口
  • 如何通过汽车制造供应商协同平台,提高供应链的效率与稳定性?
  • 使用LangChain创建简易聊天机器人
  • 研究生学习---找工作
  • 偶然发现了Python的一个BUG。。。
  • 36. 有效的数独 - 力扣(LeetCode)
  • 开源收银系统在服装连锁店中发挥的重要作用
  • 代码随想录三刷day51
  • 基于python+Django的二维码生成算法设计与实现
  • pytorch 2.0 多线程并行,导致GPU利用100%,卡住
  • 后端开发面经系列 -- 阿里C++二面面经
  • 【Image captioning】In Defense of Grid Features for Visual Question Answering实现流程
  • MySQL用SQL取三列中最大的数据值
  • 【Mac】如何解决打开PD虚拟机后Mac无法上网的问题?
  • 【NodeMCU实时天气时钟温湿度项目 7】和风天气API返回JSON数据信息的解压缩实现——ArduinoUZlib功能库
  • leetcode题目9
  • CNAME记录
  • pytest + yaml 框架 -69.新增depend 关键字,导入其它yaml用例
  • 【网络】tcp的初始化序列号为什么要随机生成
  • 【SRC实战】利用APP前端加密构造数据包
  • ThreadLocal描述
  • Linux-基础命令第三天
  • Windows Server 2022 环境下WEB和DNS服务器配置方法