帮人做网站赚钱吗,镇江网站建设费用,咨询公司网站源码,郑州网站营销推广之前在LIS.Core定义了实体特性#xff0c;在LIS.Model给实体类加了表特性#xff0c;属性特性#xff0c;外键特性等。ORM要实现增删改查和查带外键的父表信息就需要解析Model的特性和实体信息组装SQL来供数据库驱动实现增删改查功能。
实现实体得到SQL的工具类#xff0c…之前在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, ListParamDto para,ListString operList,ListString linkList, String orderBySql,Boolean IsFk){StringBuilder sbnew StringBuilder();sb.append(select );//是否含有序号列boolean HasSequencefalse;boolean HasSeqNumfalse;//组装查询列for(int i0;itableInfo.ColList.size();i){//存列名String columnName tableInfo.ColList.get(i).Name;if(columnNameSequence){HasSequencetrue;}else if(columnNameSeqNum){HasSeqNumtrue;}//组装查询列if(i0){sb.append(factory.DealPropertyName(columnName));}else{sb.append(,factory.DealPropertyName(columnName));}//组装外键查询信息if(IsFktruetableInfo.ColList.get(i).FkInfo!null) {FrekeyAttribute fkAttrtableInfo.ColList.get(i).FkInfo;String refTableNamefactory.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!nullpara.size()0){sb.append( where );for(int i0;ipara.size();i){String oper;if(operList!nulloperList.size()i){operoperList.get(i);}String linkand;if(operList!nulloperList.size()i-1){linkoperList.get(i-1);}if(i0) {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];strTableNametableInfo.Name();break;}}}return strTableName;}
}
定义的表信息实体 解析的列信息
package LIS.DAL.ORM.Common;
import LIS.Core.CustomAttributes.FrekeyAttribute;
import java.lang.reflect.Type;//列信息
public class ColumnInfo {//存外键信息public FrekeyAttribute FkInfonull;//存列名public String Name;//存列结果public Object Value;//存列的类型public Type ColType;
}
解析的id信息
package LIS.DAL.ORM.Common;//存主键信息
public class IdInfo {/// summary/// 键值ID/// /summarypublic String Key;/// summary/// 键值数据/// /summarypublic Object Value;
}
解析的表信息
package LIS.DAL.ORM.Common;
import LIS.Core.CustomAttributes.*;
import java.util.*;
import LIS.DAL.ORM.Common.ColumnInfo;//存解析的表新
public class TableInfo {//存唯一的特性public ListUniqueAttribute UniqueListnew ArrayListUniqueAttribute();//表特性public TableAttribute TableInfonull;//主键信息public LIS.DAL.ORM.Common.IdInfo IDnull;//存列信息public ListColumnInfo ColListnew ArrayListColumnInfo();
}
测试 控制台测试
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 ormnew 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.SystemSubDRdbo.SYS_SystemSub.RowID) as SystemSubDR_SYSSystemSub_RowID,(select from dbo.SYS_SystemSub where ti.SystemSubDRdbo.SYS_SystemSub.RowID) as SystemSubDR_SYSSystemSub_,(select from dbo.SYS_SystemSub where ti.SystemSubDRdbo.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.HospitalDRdbo.BT_Hospital.RowID) as HospitalDR_BTHospital_CName,(select from dbo.BT_Hospital where ti.HospitalDRdbo.BT_Hospital.RowID) as HospitalDR_BTHospital_,(select from dbo.BT_Hospital where ti.HospitalDRdbo.BT_Hospital.RowID) as HospitalDR_BTHospital_,LanguageDR,(select CName from dbo.SYS_Language where ti.LanguageDRdbo.SYS_Language.RowID) as LanguageDR_SYSLanguage_CName,(select from dbo.SYS_Language where ti.LanguageDRdbo.SYS_Language.RowID) as LanguageDR_SYSLanguage_,(select from dbo.SYS_Language where ti.LanguageDRdbo.SYS_Language.RowID) as LanguageDR_SYSLanguage_,SecurityType,PIN,Remark,Sequence,Active,PositionTitleDR,(select CName from dbo.BT_PositionTitle where ti.PositionTitleDRdbo.BT_PositionTitle.RowID) as PositionTitleDR_BTPositionTitle_CName,(select from dbo.BT_PositionTitle where ti.PositionTitleDRdbo.BT_PositionTitle.RowID) as PositionTitleDR_BTPositionTitle_,(select from dbo.BT_PositionTitle where ti.PositionTitleDRdbo.BT_PositionTitle.RowID) as PositionTitleDR_BTPositionTitle_,UserType,UKeyNo,SignImage,Theme,MenuModel,PermissionDR,(select CName from dbo.SYS_Permission where ti.PermissionDRdbo.SYS_Permission.RowID) as PermissionDR_SYSPermission_CName,(select from dbo.SYS_Permission where ti.PermissionDRdbo.SYS_Permission.RowID) as PermissionDR_SYSPermission_,(select from dbo.SYS_Permission where ti.PermissionDRdbo.SYS_Permission.RowID) as PermissionDR_SYSPermission_ from dbo.SYS_User ti Order By Sequence ASC
支持SQL组装的基础雏形完成了Maven的依赖实在是太无语了一会儿IDE提示代码不行的时候Maven编译又可以。一会儿IDE提示可以的时候Maven有编译不行摸不着规律工程换Jboss工程了工程引用浪费大量时间弃用Maven工程后引用依赖稳定了