可配置的数据库字段扩展方法_第1页
可配置的数据库字段扩展方法_第2页
可配置的数据库字段扩展方法_第3页
可配置的数据库字段扩展方法_第4页
可配置的数据库字段扩展方法_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

可配置的数据库字段扩展方法技术背景(背景技术)背景技术在软件产品中,一般是使用数据表来存储各种数据,在开发过程中,通常都是由开发人员针对某个功能进行数据库字段的设计。随着软件产品的迭代,或针对不同项目进行客制化,需要对原来的业务表添加或修改字段。如果一张表如果数据量很大,执行加字段操作就会照成锁表,这个过程可能需要很长时间甚至导致服务崩溃,还会给软件开发人员带来很大的工作量,以及复杂的业务数据处理,工作效率得不到提高,产品市场竞争力性下降。本本发明解决了这种因数据库中的数据字段变化,导致重复修改数据库表的问题,使用本发明,可以快速增加扩展数据字段;同时可以通过配置,动态修改查询数据的select字段以及where的条件,可以大大的缩短软件的开发周期、减少开发成本,提高了产品的竞争力。2、详细内容2.1本方法所要解决的技术问题目的:通过配置的方式实现动态的字段扩展,以及查询sql的扩展;基于数据库表的预留字段,以及mysql的新特性json类型字段,通过字段映射进行字段的管理,支持同一个表针对不同的业务场景能够复用相同数据库的字段;实现不需要修改代码、不需要停机,降低开发成本及管理成本,快速响应客户需求的目的。2.2完整技术方案(一)设计原理基于数据库表预留字段(包括普通字段、mysql5.7版本新支持的json类型字段)进行字段的管理,同时采用了mybatis的拦截器实现了查询sql的动态扩展。整体功能分为俩部分一、字段扩展,管理字段的映射与转换1、保存数据的时候,先将前端传入的参数转换为数据库的实际字段再保存到数据库2、查询数据时,则需要将扩展的字段映射为实际的业务字段进行返回二、查询sql扩展,基于mybatis拦截器进行查询sql扩展1、前端按通过某个特定参数传入需要展示的字段,拦截器拦截到这个特定参数后进行分析所需要的字段在查询sql的哪个表中,找到则把字段添加到返回列表中注:当前该方法只支持基于上面第一点的字段扩展功能完成扩展的字段2、通过MyBatis的拦截器对Executor接口的query方法进行拦截,对sql的select、from、where三个部分进行改写和扩展(二)执行过程说明1、保存数据用户提交表单数据到后端,后端先读取提交的数据,从缓存中读取扩展字段映射关系,根据映射关系,将提交的数据转换为真实的数据库字段,然后保存到数据库中。2、查询数据查询数据有三种方式,前两种是针对配置了扩展字段映射的查询,第三种是针对做了查询sql扩展配置的:(1)直接在代码中,通过映射字段转换器,将数据库的扩展字段转换为实际的业务字段返回(2)前端传入特定的参数(mappingShowColumns),内容为需要返回的扩展字段;后端通过Mybatis拦截器,拦截参数:mappingShowColumns,然后再根据字段映射配置,将要返回的扩展字段拼到sql中执行。(3)查询sql扩展配置,通过Mybatis拦截器,拦截配置的查询id,对目标sql的select、from、where端进行扩展(三)核心组件设计说明1、业务表结构设计在设计业务表结构的时候,添加10到20个varchar(50)的扩展字段,以及5个TEXT类型的扩展字段,另外还要加一个json类型的字段。可以在varchar(50)的扩展字段按需建索引,不建议在TEXT类型以及json类型的扩展字段建索引。例如:2、字段映射表结构:字段映射表,用于配置业务表中的扩展字段的,一个业务表支持两层配置(通过BILL_TYPE、BUSINESS_TYPE字段)。FILED_TYPE字段,1表示映射的是业务表中的varchar(50)或Text类型的扩展字段;2表示映射的json类型的扩展字段。DB_FIELD_CODE字段表示映射的实际数据库字段,例如上面的t_sac_review表的column1、big_column1。FILED_CODE字段则是为了方便后端代码出来,将数据库扩展字段转为驼峰,例如bigColulmn1。FILED_NAME表示字段的业务含义。最后MAPPING_FILED_CODE字段表示有实际的业务含义的字段编码。 配置样例:3、字段转换组件(FieldMappingUtil)根据使用场景,提供两个方法:1.保存数据时,将参数转换为数据库的字段:调用样例:Map<String,Object>param=newHashMap<>();//一般为前端传入参数param.put("billType","CLUE");//单据类型编码param.put("outColorCode","color1");param.put("fcousType","xxx");//转换后的param为:{"billType":"CLUE","outColorCode":"color1","fcousType":"xxx","column1":"color1","extendsJson":"{\"fcousType\":\"xxx\"}"}fieldMappingUtil.transFiled("t_sac_review","",param);2.查询数据时,将数据库的字段转换为实际业务字段:调用样例://查询数据库获取数据List<Map<String,Object>>list=xxx;//循环获取到的数据例如:{"column1":"color1","extendsJson":"{\"fcousType\":\"xxx\"}"}for(inti=0;i<list.size();i++){Map<String,Object>infoMap=list.get(i);//获取原始的json扩展字段内容StringextendsJson="";if(!StringHelper.IsEmptyOrNull(infoMap.get("extendsJson"))){extendsJson=infoMap.get("extendsJson").toString();}//调用方法转换字段:转换后结果:{"column1":"color1","extendsJson":"{\"fcousType\":\"xxx\"}","outColorCode":"color1","fcousType":"xxx"}fieldMappingUtil.unTransFiled("t_sac_review",extendsJson,infoMap);}附:FieldMappingConfigService代码importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.UUID;importjava.util.stream.Collectors;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importcom.ly.mp.busi.base.context.BusicenException;importcom.ly.mp.busi.base.handler.BusicenUtils;importcom.ly.mp.busi.base.handler.BusicenUtils.SOU;importcom.ly.mp.busi.base.handler.ResultHandler;importponent.entities.EntityResult;importponent.helper.StringHelper;importcom.ly.mp.assembly.sqlplus.entities.FieldMappingConfig;importcom.ly.mp.assembly.sqlplus.entities.in.FieldMappingIn;importcom.ly.mp.assembly.sqlplus.entities.out.FieldMappingOut;importcom.ly.mp.assembly.sqlplus.idal.mapper.FieldMappingConfigMapper;importcom.ly.mp.assembly.sqlplus.service.IFieldMappingConfigService;/***<p>*扩展字段配置表服务实现类*</p>**/@ServicepublicclassFieldMappingConfigServiceextendsServiceImpl<FieldMappingConfigMapper,FieldMappingConfig>implementsIFieldMappingConfigService{ privateLoggerlog=LoggerFactory.getLogger(FieldMappingConfigService.class); @Autowired FieldMappingConfigMappersacFieldMappingConfigMapper; /** *根据输入参数,返回数据库对应的字段 */ @Override publicFieldMappingOuttranField(FieldMappingIninfo){ //校验参数 checkParam(info); FieldMappingOutoutInfo=newFieldMappingOut(); Map<String,Object>targetMap=newHashMap<>(); if(info.getParam()!=null&&info.getParam().size()>0){ Map<String,Object>paramMap=info.getParam(); JSONObjectcolumnJson=newJSONObject(); //先获取原来保存的json if(!StringHelper.IsEmptyOrNull(info.getOldJson())){ JSONObjectoldJson=JSON.parseObject(info.getOldJson()); columnJson.putAll(oldJson); } //获取配置的映射字段信息 QueryWrapper<FieldMappingConfig>wraper=newQueryWrapper<>(); wraper.lambda().eq(FieldMappingConfig::getSourceTableCode,info.getSourceTableCode()); wraper.lambda().eq(FieldMappingConfig::getBillType,info.getBillType()); //-1或传入的businessType wraper.lambda().and(cs->cs.eq(FieldMappingConfig::getBusinessType,info.getBusinessType()).or().eq(FieldMappingConfig::getBusinessType,"-1")); wraper.lambda().eq(FieldMappingConfig::getIsEnable,"1"); List<FieldMappingConfig>list=sacFieldMappingConfigMapper.selectList(wraper); for(inti=0;i<list.size();i++){ if(paramMap.containsKey(list.get(i).getMappingFiledCode())){ if("1".equals(list.get(i).getFiledType())){ //处理普通映射字段 targetMap.put(list.get(i).getFiledCode(),paramMap.get(list.get(i).getMappingFiledCode())); }elseif("2".equals(list.get(i).getFiledType())){ //处理json字段 columnJson.put(list.get(i).getMappingFiledCode(),paramMap.get(list.get(i).getMappingFiledCode())); } } } outInfo.setTargetFields(targetMap); outInfo.setTargetJson(columnJson.toJSONString()); } returnoutInfo; } /** *根据输入参数,返回数据库对应的字段json字段不处理 */ //@Override publicFieldMappingOutunTranField(FieldMappingIninfo){ //校验参数 checkParam(info); FieldMappingOutoutInfo=newFieldMappingOut(); Map<String,Object>targetMap=newHashMap<>(); if(info.getParam()!=null&&info.getParam().size()>0){ Map<String,Object>paramMap=info.getParam(); //获取配置的映射字段信息 QueryWrapper<FieldMappingConfig>wraper=newQueryWrapper<>(); wraper.lambda().eq(FieldMappingConfig::getSourceTableCode,info.getSourceTableCode()); wraper.lambda().eq(FieldMappingConfig::getBillType,info.getBillType()); //-1或传入的businessType wraper.lambda().and(cs->cs.eq(FieldMappingConfig::getBusinessType,info.getBusinessType()).or().eq(FieldMappingConfig::getBusinessType,"-1")); wraper.lambda().eq(FieldMappingConfig::getIsEnable,"1"); List<FieldMappingConfig>list=sacFieldMappingConfigMapper.selectList(wraper); for(inti=0;i<list.size();i++){ if(paramMap.containsKey(list.get(i).getFiledCode())){ if("1".equals(list.get(i).getFiledType())){ //处理普通映射字段 targetMap.put(list.get(i).getMappingFiledCode(),paramMap.get(list.get(i).getFiledCode())); } } } outInfo.setTargetFields(targetMap); } returnoutInfo; } /** *将参数转换为数据库字段 *字段转换后返回MAP返回的json字段对应键值为extendsJson *@paraminfo *@return */ @Override publicMap<String,Object>tranFieldToMap(FieldMappingIninfo){ Map<String,Object>returnMap=newHashMap<>(); FieldMappingOutfieldOut=tranField(info); //获取转换的普通字段 Map<String,Object>filedMap=fieldOut.getTargetFields(); if(filedMap!=null&&filedMap.size()>0){ returnMap.putAll(filedMap); } //获取转换的JSON字段 StringjsonFile=fieldOut.getTargetJson(); if(!StringHelper.IsEmptyOrNull(jsonFile)){ returnMap.put("extendsJson",jsonFile); } returnreturnMap; } /** *反转:将数据库字段转换为映射的参数字段 *字段转换后返回MAP *@paraminfo *@return */ @Override publicMap<String,Object>unTranFieldToMap(FieldMappingIninfo){ Map<String,Object>returnMap=newHashMap<>(); FieldMappingOutfieldOut=unTranField(info); //获取转换的普通字段 Map<String,Object>filedMap=fieldOut.getTargetFields(); if(filedMap!=null&&filedMap.size()>0){ returnMap.putAll(filedMap); } //获取转换的JSON字段 StringjsonFile=info.getOldJson(); if(!StringHelper.IsEmptyOrNull(jsonFile)){ returnMap.putAll(JSON.parseObject(jsonFile)); } returnreturnMap; } /** *字段转换后返回MAP返回的json字段对应键值为extendsJson *@paraminfo *@return */ @Override publicEntityResult<Map<String,Object>>tranFieldToMapTest(Map<String,Object>param){ try{ FieldMappingIninfo=newFieldMappingIn(); info.setSourceTableCode(param.get("sourceTableCode").toString()); info.setBillType(param.get("billType").toString()); if(!StringHelper.IsEmptyOrNull(param.get("businessType"))){ info.setBusinessType(param.get("businessType").toString()); }else{ info.setBusinessType("-1"); } info.setParam(param); if(!StringHelper.IsEmptyOrNull(param.get("oldJson"))){ info.setOldJson(param.get("oldJson").toString()); } //获取转换的普通字段 Map<String,Object>filedMap=tranFieldToMap(info); returnResultHandler.updateOk(filedMap); }catch(Exceptione){ throwe; } } @Override publicList<FieldMappingConfig>getList(FieldMappingIninfo){ //校验参数 checkParam(info); StringbusinessType=info.getBusinessType(); if(StringHelper.IsEmptyOrNull(businessType)){ businessType="-1"; } //获取配置的映射字段信息 QueryWrapper<FieldMappingConfig>wraper=newQueryWrapper<>(); wraper.lambda().eq(FieldMappingConfig::getSourceTableCode,info.getSourceTableCode()); wraper.lambda().eq(FieldMappingConfig::getBillType,info.getBillType()); wraper.lambda().eq(FieldMappingConfig::getBusinessType,businessType); wraper.lambda().eq(FieldMappingConfig::getIsEnable,"1"); List<FieldMappingConfig>list=sacFieldMappingConfigMapper.selectList(wraper); returnlist; } /** *获取前端传入的要展示的扩展字段,转换为对应的select语句 *例如传入:clueLevel,clueLevelName,转换为column1asclueLevel,column2asclueLevelName *@paramselectColumns *@return */ @Override publicStringtranToSelectStr(FieldMappingIninfo){ StringBuildersBuilder=newStringBuilder(); //获取配置列表 List<FieldMappingConfig>configList=getList(info); if(info.getParam()!=null&&info.getParam().size()>0){ if(!StringHelper.IsEmptyOrNull(info.getParam().get("showColumn"))){ String[]showArr=info.getParam().get("showColumn").toString().split(","); for(inti=0;i<showArr.length;i++){ StringshowColumn=showArr[i]; //表前缀 StringcolumnPrefix=""; //字段编码 StringcolumnPart2=showColumn; //识别字段对应的表别名,例如A.COLUMN1,B.COULUM1,针对查询SQL多个表的情况 String[]columnPart=showColumn.split("\\."); if(columnPart.length==2){ columnPrefix=columnPart[0]+"."; columnPart2=columnPart[1]; } StringcolumnCode=columnPart2; //过滤出对应的配置 List<FieldMappingConfig>fileList=configList.stream().filter(c->columnCode.equals(c.getMappingFiledCode())).collect(Collectors.toList()); for(intj=0;j<fileList.size();j++){ if("1".equals(fileList.get(j).getFiledType())){ sBuilder.append(String.format("%s%sas%s",columnPrefix,fileList.get(j).getDbFiledCode(),fileList.get(j).getMappingFiledCode())); }elseif("2".equals(fileList.get(j).getFiledType())){ sBuilder.append(String.format("json_unquote(JSON_EXTRACT(%s%s,'$.%s'))as%s",columnPrefix,fileList.get(j).getDbFiledCode(),fileList.get(j).getMappingFiledCode(),fileList.get(j).getMappingFiledCode())); } if(i<showArr.length-1){ //最后一个不需要拼上, sBuilder.append(","); } } } } } returnsBuilder.toString(); } //校验参数 privatevoidcheckParam(FieldMappingIninfo){ if(StringHelper.IsEmptyOrNull(info.getSourceTableCode())){ thrownewBusicenException("源表编码不能为空"); } if(StringHelper.IsEmptyOrNull(info.getBillType())){ thrownewBusicenException("单据类型不能为空"); } } /** *根据主键判断插入或更新 * *@paraminfo *@return */ @Override @Transactional publicEntityResult<Map<String,Object>>sacFieldMappingConfigSave(Map<String,Object>mapParam,Stringtoken){ try{ BooleanupdateFlag=false; if(!StringHelper.IsEmptyOrNull(mapParam.get("id"))){ QueryWrapper<FieldMappingConfig>wrapper=newQueryWrapper<>(); wrapper.lambda().eq(FieldMappingConfig::getId,mapParam.get("id")); if(list(wrapper).size()>0){ updateFlag=true; } } if(!updateFlag){ //新增 if(StringHelper.IsEmptyOrNull(mapParam.get("id"))){ //主键 mapParam.put("id",UUID.randomUUID().toString()); } BusicenUtils.invokeUserInfo(mapParam,SOU.Save,token); sacFieldMappingConfigMapper.insertSacFieldMappingConfig(mapParam); }else{ //更新 BusicenUtils.invokeUserInfo(mapParam,SOU.Update,""); sacFieldMappingConfigMapper.updateSacFieldMappingConfig(mapParam); } returnResultHandler.updateOk(mapParam); }catch(Exceptione){ log.error("sacFieldMappingConfigSave",e); throwe; } } publicList<FieldMappingConfig>getFieldMappingList(StringsourceTableCode,StringbillType,StringbusinessType){ FieldMappingIninfo=newFieldMappingIn(); info.setSourceTableCode(sourceTableCode); info.setBillType(billType); info.setBusinessType(businessType); List<FieldMappingConfig>list=getList(info); returnlist; }}4、扩展字段查询拦截器针对这些扩展字段,前端可以自定义需要返回那些字段。通过Mybatis拦截器,拦截参数:mappingShowColumns,根据扩展字段配置表获取到对应的数据库字段,然后拼接到sql中执行。要显示哪些字段(只限扩展字段配置表里的映射字段),由前端控制,只需传入mappingShowColumns参数即可返回需要的字段还是以上面的t_sac_review表为例:映射字段如下:前端需要查询t_sac_review表的外观颜色编码和外观颜色名称字段,则传入参数:{"pageIndex":1,"pageSize":10,"mappingShowColumns":"outColorCode,outColorName"}返回的结果自动加上outColorCode,fcousType字段:拦截器代码如下: 5、查询sql扩展拦截器 通过Mybatis拦截器,对查询类sql进行扩展。使用场景:1.引用了第三方jar包,想要修改jar包里的Mybatis配置的xml文件里的查询sql;2.线上环境,想不停机发布,修改某个查询sqlSql配置表结构:

MS_ID字段:mybatis的xml里配的查询sqlid CONDITION字段:根据传入参数进行过滤,符合条件的才进行扩展,多个条件用逗号分割,支持>,<,=,!=,<=,>=,in,notin操作 SELECT_EXTEND字段:对原sql的select字段进行扩展 FROM_EXTEND字段:对原sql的from段进行扩展 WHERE_EXTEND字段:对原sql的where段进行扩展 已以下sql为例:配置如下:配置说明:扩展的sqlId为:com.ly.mp.assembly.approve.idal.mapper.CommonAuditMapper.queryUnAuditList这个sql进行扩展;条件为:billType=ACTION(获取前端传入的billType条件做判断);select扩展:在原sql基础上添加返回act.ACTIVITY_ID和act.ACTIVITY_NAME字段;from扩展:为了返回act.ACTIVITY_ID和act.ACTIVITY_NAME字段,需要关联t_acc_bu_activity表;where扩展:另外支持查询条件act.ACTIVITY_NAME=#{activityName}andact.BEGIN_TIME>=#{beginTimeMin}andact.BEGIN_TIME<=#{beginTimeMax}例如:需要查询活动名称为:活动1且活动时间在2022-06-01到2022-06-02的数据前端传入参数:{"pageIndex":1,"pageSize":10,"billType":"ACTION","activityName":"活动1","beginTimeMin":"2022-06-01","beginTimeMax":"2022-06-02"}最终扩展后的sql为:部分代码实现:importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Properties;importorg.apache.ibatis.executor.Executor;importorg.apache.ibatis.mapping.BoundSql;importorg.apache.ibatis.mapping.MappedStatement;importorg.apache.ibatis.mapping.ParameterMapping;importorg.apache.ibatis.mapping.SqlSource;importorg.apache.ibatis.plugin.Interceptor;importorg.apache.ibatis.plugin.Intercepts;importorg.apache.ibatis.plugin.Invocation;importorg.apache.ibatis.plugin.Plugin;importorg.apache.ibatis.plugin.Signature;importorg.apache.ibatis.session.ResultHandler;importorg.apache.ibatis.session.RowBounds;importcom.alibaba.fastjson.JSON;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.ly.mp.assembly.sqlplus.helper.ConditionFilterUtil;importcom.ly.mp.busi.base.handler.MapUtil;importponent.helper.StringHelper;importnet.sf.jsqlparser.expression.Alias;importnet.sf.jsqlparser.expression.operators.conditional.AndExpression;importnet.sf.jsqlparser.parser.CCJSqlParserUtil;importnet.sf.jsqlparser.statement.Statement;importnet.sf.jsqlparser.statement.select.Join;importnet.sf.jsqlparser.statement.select.PlainSelect;importnet.sf.jsqlparser.statement.select.Select;importnet.sf.jsqlparser.statement.select.SelectExpressionItem;@Intercepts({@Signature(type=Executor.class,method="query",args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})})publicclassAssemblySqlInterceptorimplementsInterceptor{ @SuppressWarnings({"unchecked","rawtypes"})@OverridepublicObjectintercept(Invocationinvocation)throwsThrowable{ //获取sql配置信息 if(SqlPlusContainer.sqlList()!=null&&SqlPlusContainer.sqlList().size()>0){ Object[]args=invocation.getArgs(); MappedStatementms=(MappedStatement)args[0]; //id为执行的mapper方法的全路径名,如com.mapper.UserMapper StringmsId=ms.getId(); //获取参数,可能有多个(自定义参数、分页参数等) ObjectparameterObject=args[1]; //输入参数 MapinputParam=getInputParam(parameterObject); //匹配sql List<AssemblySqlPlusInfo>fileList=SqlPlusContainer.sqlFilterList(msId,inputParam); if(fileList!=null&&fileList.size()>0){ //取匹配到的第一个 AssemblySqlPlusInfosqlPlusInfo=fileList.get(0); BoundSqlboundSql=ms.getBoundSql(parameterObject); StringorigSql=boundSql.getSql(); //解析sql Statementstatement=CCJSqlParserUtil.parse(origSql); Selectselect=(Select)statement; PlainSelectplain=(PlainSelect)select.getSelectBody(); //select字段处理 dealSelect(sqlPlusInfo,plain); //from处理 dealFrom(sqlPlusInfo,plain); //where处理 //[{"paramCode":"column1","condition":"column1!=''","express":"A.COLUMN1=?"}] dealWhere(sqlPlusInfo,plain,inputParam); //重新new一个查询语句对象 BoundSqlnewBoundSql=newBoundSql(ms.getConfiguration(),select.toString(), boundSql.getParameterMappings(),boundSql.getParameterObject()); //把新的查询放到statement里 MappedStatementnewMs=newMappedStatement(ms,newBoundSqlSqlSource(newBoundSql)); for(ParameterMappingmapping:boundSql.getParameterMappings()){ Stringprop=mapping.getProperty(); if(boundSql.hasAdditionalParameter(prop)){ newBoundSql.setAdditionalParameter(prop,boundSql.getAdditionalParameter(prop)); } } Object[]queryArgs=invocation.getArgs(); queryArgs[0]=newMs; } } returnceed(); } //获取输入参数,不包含分页参数 @SuppressWarnings("rawtypes") privateMapgetInputParam(ObjectparameterObject){ MapinputParam=newHashMap<>(); try{ Mapparams=(Map)parameterObject; for(Objectkey:params.keySet()){ if(keyinstanceofIPage){ }else{ if(params.get(key)!=null){ if(keyinstanceofMap){ inputParam=(Map)params.get(key); }else{ inputParam=MapUtil.convertToMap(params.get(key)); } } break; } }}catch(Exceptione){ }returninputParam; } //select字段扩展 privatevoiddealSelect(AssemblySqlPlusInfosqlPlusInfo,PlainSelectplain)throwsThrowable{ if(!StringHelper.IsEmptyOrNull(sqlPlusInfo.getSelectExtend())){ String[]selectArr=sqlPlusInfo.getSelectExtend().split(","); for(intj=0;j<selectArr.length;j++){ StringselectStr=selectArr[j].replace("as","AS"); String[]selectStrArr=selectStr.split("AS"); //列名 StringcolumnName=selectStrArr[0]; //别名 Stringalia=selectStrArr.length==2?selectStrArr[1]:""; SelectExpressionItemselectItem=newSelectExpressionItem(); selectItem.setExpression(CCJSqlParserUtil.parseExpression(columnName)); if(!StringHelper.IsEmptyOrNull(alia)){ selectItem.setAlias(newAlias(alia,true)); }plain.addSelectItems(selectItem); } } } //from扩展 privatevoiddealFrom(AssemblySqlPlusInfosqlPlusInfo,PlainSelectplain)throwsThrowable{ if(!StringHelper.IsEmptyOrNull(sqlPlusInfo.getFromExtend())){ //构造临时sql,取到临时sql的joins,添加到原sql上 StringsqlTemp=String.format("select*fromdual%s",sqlPlusInfo.getFromExtend());StatementstatementTemp=CCJSqlParserUtil.parse(sqlTemp);SelectselectTemp=(Select)statementTemp;PlainSelectplainTemp=(PlainSelect)selectTemp.getSelectBody();List<Join>joinList=plainTemp.getJoins();for(inti=0;i<joinList.size();i++){ plain.addJoins(joinList.get(i));} } } //where扩展 @SuppressWarnings({"rawtypes","unchecked"}) privatevoiddealWhere(AssemblySqlPlusInfosqlPlusInfo,PlainSelectplain,MapinputParam)throwsThrowable{ if(!StringHelper.IsEmptyOrNull(sqlPlusInfo.getWhereExtend())){ List<Map>whereList=JSON.parseArray(sqlPlusInfo.getWhereExtend(),Map.class); for(inti=0;i<whereList.size();i++){ booleanflag=true; if(!StringHelper.IsEmptyOrNull(whereList.get(i).get("condition"))){ flag=ConditionFilterUtil.check(whereList.get(i).get("condition").toString(),inputParam); } if(flag){ //符合条件 if(!StringHelper.IsEmptyOrNull(whereList.get(i).get("express"))){ StringwhereStr=""; //获取参数值 StringparamValue=null;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论