Java反射实体组装SQL
之前在LIS.Core定义了实体特性,在LIS.Model给实体类加了表特性,属性特性,外键特性等。ORM要实现增删改查和查带外键的父表信息就需要解析Model的特性和实体信息组装SQL来供数据库驱动实现增删改查功能。
实现实体得到SQL的工具类,先实现一个得到查询SQL示例
package LIS.DAL.ORM.Common;
import LIS.Core.CustomAttributes.*;
import LIS.Core.Dto.*;
import LIS.Core.Dto.ParamDto;
import java.util.*;
import java.util.List;
import LIS.DAL.ORM.Common.TableInfo;
import LIS.DAL.ORM.DBUtility.IDbFactory;import java.lang.annotation.Annotation;
import java.lang.reflect.*;
import LIS.DAL.ORM.Common.ColumnInfo;
import LIS.DAL.ORM.Common.TableInfo;
import LIS.Core.Util.ReflectUtil;
import LIS.Core.CustomAttributes.TableAttribute;//通过实体类型得到SQL的工具类
public class ModelToSqlUtil {//通过实体对象得到表信息public static TableInfo GetTypeInfo(Object model) {if (model == null) {return null;}try {//返回的对象TableInfo tableInfo = new TableInfo();Class c = model.getClass();System.out.println("111");//得到表特性Annotation[] annoList = c.getAnnotations();if (annoList != null && annoList.length > 0) {for (int i = 0; i < annoList.length; i++) {//表特性if (annoList[i] instanceof TableAttribute) {tableInfo.TableInfo = (TableAttribute) annoList[i];}//唯一特性else {tableInfo.UniqueList.add((UniqueAttribute) annoList[i]);}}}//得到列信息Field[] declaredFields = c.getDeclaredFields();for (int i = 0; i < declaredFields.length; i++) {LIS.DAL.ORM.Common.ColumnInfo col = new LIS.DAL.ORM.Common.ColumnInfo();FrekeyAttribute fk = declaredFields[i].getAnnotation(FrekeyAttribute.class);col.FkInfo = fk;col.Name = declaredFields[i].getName();col.ColType = declaredFields[i].getType();col.Value = declaredFields[i].get(model);tableInfo.ColList.add(col);}return tableInfo;} catch (Exception ex) {ex.printStackTrace();}return null;}//通过表信息和参数列表组装查询SQL//factory:驱动工厂//tableInfo:表信息//para:参数//operList:参数对应的操作符列表//linkList:多个参数之间连接的操作符 and or这种//orderBySql:Order By的SQL语句//IsFk:是否组装外键查询的SQLpublic static String GetSelectSqlByTableInfo(IDbFactory factory,TableInfo tableInfo, List<ParamDto> para,List<String> operList,List<String> linkList, String orderBySql,Boolean IsFk){StringBuilder sb=new StringBuilder();sb.append("select ");//是否含有序号列boolean HasSequence=false;boolean HasSeqNum=false;//组装查询列for(int i=0;i<tableInfo.ColList.size();i++){//存列名String columnName = tableInfo.ColList.get(i).Name;if(columnName=="Sequence"){HasSequence=true;}else if(columnName=="SeqNum"){HasSeqNum=true;}//组装查询列if(i==0){sb.append(factory.DealPropertyName(columnName));}else{sb.append(","+factory.DealPropertyName(columnName));}//组装外键查询信息if(IsFk==true&&tableInfo.ColList.get(i).FkInfo!=null) {FrekeyAttribute fkAttr=tableInfo.ColList.get(i).FkInfo;String refTableName=factory.DealTableName(GetTableName(ReflectUtil.GetType("LIS.Model.Entity." + fkAttr.Name(), "LIS.Model")));sb.append("," + "(select " + factory.DealPropertyName(fkAttr.AssociaField()) + " from " + refTableName + " where ti." + factory.DealPropertyName(columnName) + "=" + refTableName + "." + factory.DealPropertyName(fkAttr.RefColumnName()) + ") as " + factory.DealPropertyName(columnName + "_" + fkAttr.Name() + "_" + fkAttr.AssociaField()));//如果有拉取字段1,查询拉取字段if (fkAttr.AssociaField1() != ""){sb.append("," + "(select " + factory.DealPropertyName(fkAttr.AssociaField1()) + " from " + refTableName + " where ti." + factory.DealPropertyName(columnName) + "=" + refTableName + "." + factory.DealPropertyName(fkAttr.RefColumnName()) + ") as " + factory.DealPropertyName(columnName + "_" + fkAttr.Name() + "_" + fkAttr.AssociaField1()));}//如果有拉取字段2,查询拉取字段if (fkAttr.AssociaField2() != ""){sb.append("," + "(select " + factory.DealPropertyName(fkAttr.AssociaField2()) + " from " + refTableName + " where ti." + factory.DealPropertyName(columnName) + "=" + refTableName + "." + factory.DealPropertyName(fkAttr.RefColumnName()) + ") as " + factory.DealPropertyName(columnName + "_" + fkAttr.Name() + "_" + fkAttr.AssociaField2()));}}}sb.append(" from " + factory.DealTableName(tableInfo.TableInfo.Name()) + " ti ");//组装查询参数if(para!=null&¶.size()>0){sb.append(" where ");for(int i=0;i<para.size();i++){String oper="=";if(operList!=null&&operList.size()>i){oper=operList.get(i);}String link="and";if(operList!=null&&operList.size()>i-1){link=operList.get(i-1);}if(i==0) {sb.append(factory.DealPropertyName(para.get(i).Key.toString()) + oper + factory.DealSqlPara(para.get(i).Key.toString()));}else{sb.append(" "+link+" "+factory.DealPropertyName(para.get(i).Key.toString()) + oper + factory.DealSqlPara(para.get(i).Key.toString()));}}}//存组装的排序sqlString strSort = "";//如果传入了排序字段,组装排序语句if (orderBySql != null && orderBySql.length() > 0){//用来存处理的排序串String dealStr = "";//先分割多个排序条件String[] strList = orderBySql.split(",");for (int m = 0; m < strList.length; m++){//分开多个排序条件if (m > 0){dealStr += ",";}//分开字段名称和升降序String[] strSubList = strList[m].split(" ");//处理字段名称dealStr += factory.DealPropertyName(strSubList[0]);//组装处理的串for (int n = 1; n < strSubList.length; n++){dealStr += " " + strSubList[n];}}//组装排序串strSort = " Order By " + dealStr;}else{if (HasSequence){strSort = " Order By " + factory.DealPropertyName("Sequence") + " ASC";}else if (HasSeqNum){strSort = " Order By " + factory.DealPropertyName("SeqNum") + " ASC";}else{strSort = "";}}sb.append(strSort);return sb.toString();}//通过实体类型得到实体表名称private static String GetTableName(Class c){//存表名String strTableName = "";//得到表特性TableAttribute tableInfo = null;//得到表特性Annotation[] annoList = c.getAnnotations();if (annoList != null && annoList.length > 0) {for (int i = 0; i < annoList.length; i++) {//表特性if (annoList[i] instanceof TableAttribute) {tableInfo = (TableAttribute) annoList[i];strTableName=tableInfo.Name();break;}}}return strTableName;}
}
定义的表信息实体
解析的列信息
package LIS.DAL.ORM.Common;
import LIS.Core.CustomAttributes.FrekeyAttribute;
import java.lang.reflect.Type;//列信息
public class ColumnInfo {//存外键信息public FrekeyAttribute FkInfo=null;//存列名public String Name;//存列结果public Object Value;//存列的类型public Type ColType;
}
解析的id信息
package LIS.DAL.ORM.Common;//存主键信息
public class IdInfo {/// <summary>/// 键值ID/// </summary>public String Key;/// <summary>/// 键值数据/// </summary>public Object Value;
}
解析的表信息
package LIS.DAL.ORM.Common;
import LIS.Core.CustomAttributes.*;
import java.util.*;
import LIS.DAL.ORM.Common.ColumnInfo;//存解析的表新
public class TableInfo {//存唯一的特性public List<UniqueAttribute> UniqueList=new ArrayList<UniqueAttribute>();//表特性public TableAttribute TableInfo=null;//主键信息public LIS.DAL.ORM.Common.IdInfo ID=null;//存列信息public List<ColumnInfo> ColList=new ArrayList<ColumnInfo>();
}
测试

控制台测试
package com.company;
//import org.apache.commons.configuration.ConfigurationException;
//import org.apache.commons.configuration.PropertiesConfiguration;
import LIS.Model.Entity.SYSForm;
import LIS.Model.Entity.SYSUser;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
import java.net.URL;public class Main {public static void main(String[] args) {//用容器的配置xml初始化容器LIS.Core.Context.ObjectContainer.InitIoc();//ORM通过容器取数据库驱动工厂LIS.DAL.ORM.EntityManager.EntityManagerImpl orm=new LIS.DAL.ORM.EntityManager.EntityManagerImpl();//执行查询测试orm.DBSelectTest();//测试通过实体得到SQL语句orm.InsertSqlTest(new SYSForm());orm.InsertSqlTest(new SYSUser());}
}

测试查询外键的sql

select "RowID","Code","CName","SysCode","Sequence","Active","Url","Path","Remark","FormHelp","HelpWidth","HelpHeight","HelpDoc","SystemSubDR",(select "RowID" from dbo.SYS_SystemSub where ti."SystemSubDR"=dbo.SYS_SystemSub."RowID") as "SystemSubDR_SYSSystemSub_RowID",(select "" from dbo.SYS_SystemSub where ti."SystemSubDR"=dbo.SYS_SystemSub."RowID") as "SystemSubDR_SYSSystemSub_",(select "" from dbo.SYS_SystemSub where ti."SystemSubDR"=dbo.SYS_SystemSub."RowID") as "SystemSubDR_SYSSystemSub_" from dbo.SYS_Form ti Order By "Sequence" ASCselect "RowID","Code","CName","Password","HospitalDR",(select "CName" from dbo.BT_Hospital where ti."HospitalDR"=dbo.BT_Hospital."RowID") as "HospitalDR_BTHospital_CName",(select "" from dbo.BT_Hospital where ti."HospitalDR"=dbo.BT_Hospital."RowID") as "HospitalDR_BTHospital_",(select "" from dbo.BT_Hospital where ti."HospitalDR"=dbo.BT_Hospital."RowID") as "HospitalDR_BTHospital_","LanguageDR",(select "CName" from dbo.SYS_Language where ti."LanguageDR"=dbo.SYS_Language."RowID") as "LanguageDR_SYSLanguage_CName",(select "" from dbo.SYS_Language where ti."LanguageDR"=dbo.SYS_Language."RowID") as "LanguageDR_SYSLanguage_",(select "" from dbo.SYS_Language where ti."LanguageDR"=dbo.SYS_Language."RowID") as "LanguageDR_SYSLanguage_","SecurityType","PIN","Remark","Sequence","Active","PositionTitleDR",(select "CName" from dbo.BT_PositionTitle where ti."PositionTitleDR"=dbo.BT_PositionTitle."RowID") as "PositionTitleDR_BTPositionTitle_CName",(select "" from dbo.BT_PositionTitle where ti."PositionTitleDR"=dbo.BT_PositionTitle."RowID") as "PositionTitleDR_BTPositionTitle_",(select "" from dbo.BT_PositionTitle where ti."PositionTitleDR"=dbo.BT_PositionTitle."RowID") as "PositionTitleDR_BTPositionTitle_","UserType","UKeyNo","SignImage","Theme","MenuModel","PermissionDR",(select "CName" from dbo.SYS_Permission where ti."PermissionDR"=dbo.SYS_Permission."RowID") as "PermissionDR_SYSPermission_CName",(select "" from dbo.SYS_Permission where ti."PermissionDR"=dbo.SYS_Permission."RowID") as "PermissionDR_SYSPermission_",(select "" from dbo.SYS_Permission where ti."PermissionDR"=dbo.SYS_Permission."RowID") as "PermissionDR_SYSPermission_" from dbo.SYS_User ti Order By "Sequence" ASC
支持SQL组装的基础雏形完成了,Maven的依赖实在是太无语了,一会儿IDE提示代码不行的时候Maven编译又可以。一会儿IDE提示可以的时候Maven有编译不行,摸不着规律,工程换Jboss工程了,工程引用浪费大量时间,弃用Maven工程后引用依赖稳定了
相关文章:
Java反射实体组装SQL
之前在LIS.Core定义了实体特性,在LIS.Model给实体类加了表特性,属性特性,外键特性等。ORM要实现增删改查和查带外键的父表信息就需要解析Model的特性和实体信息组装SQL来供数据库驱动实现增删改查功能。 实现实体得到SQL的工具类,…...
tensorrt安装使用教程
一般的深度学习项目,训练时为了加快速度,会使用多GPU分布式训练。但在部署推理时,为了降低成本,往往使用单个GPU机器甚至嵌入式平台(比如 NVIDIA Jetson)进行部署,部署端也要有与训练时相同的深…...
Java后端开发(十)-- idea(2022版)将 已push 的 远程仓库 的 多条commit记录 进行撤销
目录 1.多次 修改Test01类后,提交到本地仓库 。 2.多次重复 1 的步骤,多次commit成功后,在Git =》Log中会显示,commit记录...
常见面试题-Netty专栏(一)
typora-copy-images-to: imgs Netty 是什么呢?Netty 用于做什么呢? 答: Netty 是一个 NIO 客户服务端框架,可以快速开发网络应用程序,如协议服务端和客户端,极大简化了网络编程,如 TCP 和 UDP …...
【iOS】JSONModel的基本使用
文章目录 前言一、导入JSONModel二、JSONModel的基本使用1.基本用法2.模型集合3.模型导出为NSDictionary或JSON4.设置所有属性可选(所有属性值可以为空)5.下划线(蛇式)转驼峰命名法 前言 JSONModel 是一个用于 Objective-C 的开源库,它用于简…...
imu预积分学习(更新中)
imu预积分学习(更新中) IMU预积分可以做什么? 以上面那个经典图片为例子,IMU可以通过六轴数据,拿到第i帧和第j帧之间的相对位姿,这样不就可以去用来添加约束了吗 但是有一个比较大的问题是: I…...
算法刷题-链表
算法刷题-链表 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]…...
Linux 挂载磁盘到指定目录
问题:公司分配了数据磁盘,但是分区也没有挂载到目录 首先 df -h 查看一下挂载点的情况 查看服务器上未挂载的磁盘 fdisk -l 注:图中sda、sdb (a、b指的是硬盘的序号) 分区操作 我们可以看到b硬盘有536G未分区&…...
ZYNQ linux调试LCD7789
一,硬件管脚 1,参数解释和实物 LVGL是一个开源的图形库,主要用于MCU上屏幕UI的部署,功能完善,封装合理,可裁切性强,也可以实现Linux上fbx的部署。LVGL官网LVGL - Light and Versatile Embedded Graphics Library 每根线的作用...
【双向链表的插入和删除】
文章目录 双向链表双向链表的插入双向链表的删除操作 双向链表 双向链表的结构定义如下: //双向链表的结构定义 typedef struct DuLNode {ElemType data;struct DuLNode* prior, * next; }DuLNode,*DuLinkList;双向链表的结点有两个指针域:prior&#…...
【Android知识笔记】Webview专题
WebView 核心组件 类名作用常用方法WebView创建对象加载URL生命周期管理状态管理loadUrl():加载网页 goBack():后退WebSettings配置&管理 WebView缓存:setCacheMode() 与JS交互:setJavaScriptEnabled()WebViewClient处理各种通知&请求事件should...
Leetcode第 368 场周赛
元素和最小的山形三元组 II 预处理前缀和后缀最小值,记为pre[i]和sa[i] 对于当前编号i,如果前面的最小值和后面的最大值都小于nums[i],则记录ans[i] nums[i]pre[i-1]sa[i1] 结果输出最小的ans[i]即可。 合法分组的最少组数 统计每一个数字出现的次数。将每一个数…...
Mysql数据库 3.SQL语言 DML数据操纵语言 增删改
DML语句:用于完成对数据表中数据的插入、删除、修改操作 一.表数据插入 插入数据语法: 步骤例: 1.声明数据库:use 数据库名; 2.删除操作:drop table if exists 表名; 3.创建数据库中的表:create table 表…...
Java中,如何去掉字符串中前面所有的0
大家好,我是三叔,这期主要给大家分享下在开发中使用的字符串的一些常见方法。 例如:00000000110,现在需要去掉前面所有补的0,得到110,相信大家在开发中肯定有遇到过类似的开发需求,如何做&…...
数组能开空间大小
奈何辰星无可奈_leetcode,中等难度,算法-CSDN博客 这个博客介绍的很好,可以参考下...
Python 数据类 - dataclass 的作用与不足
https://docs.python.org/zh-cn/3/library/dataclasses.html https://peps.python.org/pep-0526/ https://peps.python.org/pep-0557/ dataclass 简单示例 from dataclasses import dataclassdataclass class User:name: strage: intif __name__ __main__:response_json {na…...
【C++初阶】类与对象(一)
目录 1、初识面向对象思想2、类 struct2.1 C中的struct及使用 3、类 class3.1 类的定义3.2 类的访问限定符3.2.1 访问限定符是什么3.2.2 访问限定符的使用3.2.3 访问限定符的使用规范3.2.4 访问限定符与封装 3.3 类做声明和定义分离3.3.1 声明和定义分离3.3.2 在函数声明的地方…...
thinkPHP框架详解+部署
目录 什么是ThinkPHP: ThinkPHP的主要特性: 什么是ThinkPHP: ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,由国内的技术爱好者创建,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和…...
Java拦截器(Interceptor)和过滤器(Filter)实例详解
一、Java过滤器和拦截器 1.1、过滤器(Filter) Filter过滤器,是Servlet(Server Applet)技术中的技术,开发人员可以通过Filter技术,管理web资源,可以对指定的一些行为进行拦截,例如URL级别的权限…...
通过热敏电阻计算温度(二)---ODrive实现分析
文章目录 通过热敏电阻计算温度(二)---ODrive实现分析测量原理图计算分析计算拟合的多项式系数根据多项式方程计算温度的函数温度计算调用函数 通过热敏电阻计算温度(二)—ODrive实现分析 ODrive计算热敏电阻的温度采用的时B值的…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
