publicclassBizReferenceServiceimplementsIBizReferenceService {privatestaticMap>ruleMaps;privatestaticfinalString PATTERN="#[\\w]+#";privatestaticfinalString CFG_FILE="bizReferenceRule.xml";

... .../*** 查询指定业务数据是否被其他业务表关联依赖.

*@parambizName 关联业务名称

*@parambizId 关联业务ID.

*@paramextParam 扩展条件

*@returntrue 被关联/false 未被关联.*/publicbooleanisBizReference(String bizName,String bizId,MapextParam)throwsServiceException {

Assert.notNull(bizName,"业务名称不能为空,bizName is NULL。");

Assert.notNull(bizId,"记录ID不能为空,bizId is NULL。");try{//逐个检查依赖项是否有数据关联.Listrules=getBizRelationRule(bizName);for(BizReferenceRule rule : rules){

StringBuilder sqlBuilder=newStringBuilder();

sqlBuilder.append("select count(*) from").append(rule.getRelTable()).append("where")

.append(rule.getRelField()).append("='").append(bizId).append("'");

String extConditon=rule.getExtCondition();if(StringUtil.isNotBlank(extConditon)){

initTenantParam(extParam);

sqlBuilder.append("and").append(getExtParamSql(extConditon,extParam));

}

logger.debug(sqlBuilder);intnCount=bizReferenceDao.getBizRelationCount(sqlBuilder.toString());if(nCount!=0)returntrue;

}returnfalse;

}catch(Exception ex){

logger.error("调用业务关联服务错误。"+bizName+",bizId:"+bizId+",extParam"+LogUtil.parserBean(extParam),ex);thrownewServiceException("调用业务关联服务错误。");

}

}/*** 组装扩展查询条件的sql

*@paramcondition

*@paramextParam

*@return*@throwsException*/privateString getExtParamSql(String condition,MapextParam)throwsException {

ListparamList=parseDyncParam(condition);for(String param : paramList){

String simpleParam=simpleName(param);if(!extParam.containsKey(simpleParam)){thrownewServiceException("动态参数值未设置! param:"+param+",extParam:"+LogUtil.parserBean(extParam));

}

condition=condition.replaceAll(param,"'"+String.valueOf(extParam.get(simpleParam))+"'");

}returncondition;

}/*** 解析扩展查询条件中的动态参数名.

*@paramcondition

*@return*@throwsException*/privateListparseDyncParam(String condition)throwsException {

PatternCompiler compiler=newPerl5Compiler();

PatternMatcher matcher=newPerl5Matcher();

MatchResult result=null;

PatternMatcherInput input=null;

ListparamList=newArrayList();

input=newPatternMatcherInput(condition);

Pattern pattern=compiler.compile(PATTERN,Perl5Compiler.CASE_INSENSITIVE_MASK);while(matcher.contains(input, pattern)){

result=matcher.getMatch();

input.setBeginOffset(result.length());

paramList.add(result.group(0));

}returnparamList;

}/*** 获取业务关联查询规则.*/privateListgetBizRelationRule(String bizName){

Assert.notNull(bizName,"业务名称不能为空,bizName is NULL。");//配置定义未加载到内存时,读取配置文件if(ruleMaps==null){

parseRuleConfig();if(ruleMaps==null)returnnull;

}returnruleMaps.get(bizName);

}/*** 读取业务关联规则配置文件*/@SuppressWarnings("unchecked")privatesynchronizedvoidparseRuleConfig(){if(ruleMaps!=null){return;

}//解析业务引用定义文件.

}/*** 读取Xml文档

*@return*/privateDocument getXmlDocument(){

InputStream is=null;try{

ClassLoader loader=Thread.currentThread().getContextClassLoader();

is=loader.getResourceAsStream(CFG_FILE);

SAXBuilder sb=newSAXBuilder();returnsb.build(newBufferedInputStream(is));

}catch(Exception ex) {

logger.error("读取配置文件错误. file:"+CFG_FILE, ex);returnnull;

}finally{try{if(is!=null){

is.close();

is=null;

}

}catch(Exception ex) {

logger.error(ex);

}

}

}

}

java实现通用查询_通用业务引用查询服务实现相关推荐

  1. SpringBoot - 实践阿里巴巴【Manager 层_通用业务处理层】

    文章目录 规范 对比传统MVC 小栗子 V1.0 传统写法 V2.0 引入Manager层 源码 规范 对比传统MVC 说几个弊端 Service层代码臃肿 Service层易出现大事务,事务嵌套,易 ...

  2. java ldap 分页_具有从属引用的 LDAP 分页查询未正确处理

    具有从属引用的 LDAP 分页查询未正确处理 09/14/2020 本文内容 本文提供了一些方法来避免使用从属引用的 LDAP 分页查询未正确处理的问题. 原始产品版本:   Windows 8 原始 ...

  3. java 数据权限_通用数据权限的思考与设计

    1.数据权限概述 1.1.什么是数据权限? 如果想学习Java工程化.高性能及分布式.深入浅出.微服务.Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:7877071 ...

  4. 使用java反射写一个通用的jdbc查询

    在后端开发中,我们经常和数据库打交道.从最开始的使用jdbc进化到框架(mybatis)我们的开发效率提升了很多,但是不知道你没有思考过框架是如何在日常的开发中帮助我们的? 在我之前的博客中,讨论过 ...

  5. 使用内连接查询选修了Java程序基础_使用内连接 查询选修了“java程序基础”课程的学生学号、姓名、课程号、课程名和期末成绩_学小易找答案...

    [简答题]BOD5/COD比值说明什么? [单选题]在制图中有一实物的某个尺寸为10,绘图时采用的比例为1:2.标注是应标注( ) [判断题]在表格布局中,有多少列就看最多的一个行中添加多少个控件,直 ...

  6. ## 大一java课程设计_航班查询系统(我是小白)

    大一java课程设计_航班查询系统(我是小白) 备注:第一个java程序有借鉴别人的成分,因为忘了在哪个大佬上面借鉴的,所以在此备注,如有侵权,请联系删除,(仅用于学习使用,并未想盈利) 框体介绍 一 ...

  7. java对象引用出错_“Java有值传递和引用传递”为什么错了?

    前言 初学Java的时候,老师在课堂上说"Java有值传递和引用传递",但网上"Java只有值传递"的呼声很高. 本人在查找资料的过程中,在这两个说法之间反复横 ...

  8. c++中的引用和python中的引用_【总结】C++、C#、Java、Javascript、Python中引用的区别...

    首先分两大阵营:C++中引用是一块阵营, C#.Java.Javascript.Python中引用是另一块阵营. 之所以这样分是因为同一阵营中引用使用方法基本一样. C++引用本质是个常量指针,而其他 ...

  9. java 查询快递_调用快递100查询快递信息

    [java]代码库/** * 根据快递单号查询数据信息 * @param kuaidiNo * @return */ public static String getExpressInfo(Strin ...

最新文章

  1. 【转载】Asp.Net 全生命周期
  2. ipython换行操作_ipython 换行
  3. 「机器学习速成」过拟合的风险和泛化
  4. React开发(216):ant dedign 弹窗销毁后再打开,原来的值仍存在,如何销毁弹窗内容?
  5. JavaScript中的Function类型总结
  6. Android自定义view之ViewPager指示器——1
  7. hdu 5178 pairs (线性探查问题)
  8. 百度网盘破解限速(免费)
  9. EPSON机械手视觉操作手册
  10. 期权定价公式的推导(欧式)
  11. python编写自定义函数计算约登值(约登指数、Youden Index)、寻找最佳阈值(threshold、cutoff)、以及最佳阈值对应的ROC曲线中的坐标点
  12. 【那些年,我们一起追的女孩】第十四章
  13. 从零开始部署深信服EDR
  14. SQL 基础(五)数据查询实战演练一
  15. html js制作高级拼图,基于JavaScript实现十五拼图代码实例
  16. 解决jmeter压测试时java.net.SocketException: Socket closed异常
  17. java hashtable 数据结构_java数据结构——哈希表(HashTable)
  18. 原根算法C语言,算法导论-----数论-----元素的幂
  19. ElementUI日期转为“yyyy-MM-dd“格式
  20. 【数据可视化应用】绘制QQ图(附Python和R语言代码)

热门文章

  1. html ready 调用函数,Chrome和JQuery问题 - $(document).ready(function(){});在页面加载之前调用...
  2. 3d pdf reader android,3D PDF Reader
  3. mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!
  4. git学习4--公钥的配置
  5. android 加载更多动画效果,Android实践之带加载效果的下拉刷新上拉加载更多
  6. php 属性名字访问,php – 如何使用连字符的名称访问此对象属性?
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生信息与选课系统
  8. 跟我一起写一个chrome扩展程序
  9. vmware 虚拟机设置 redhat 桥接模式
  10. 栈帧与操作数栈剖析及符号引用与直接引用的转换