初识GroovyShell

文章目录

  • 前言
  • 一、GroovyShell
  • 二、maven
  • 三、解决方案
  • 四、关键代码
    • 4.1 数据库配置表(pg)
    • 4.2 入参
    • 4.3 分页查询
  • 总结


前言

项目背景:查询多个表的数据列表和详情,但不想创建过多的po、dao、resp等项目文件。

一、GroovyShell

Apache Groovy是一种强大的、可选的类型和动态语言,具有静态类型和静态编译功能,用于Java平台,旨在通过简洁、熟悉和易于学习的语法提高开发人员的生产力。它可以与任何Java程序顺利集成,并立即为您的应用程序提供强大的功能,包括脚本功能、领域特定语言创作、运行时和编译时元编程以及函数式编程。

二、maven

      <dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy-all</artifactId><version>2.4.7</version></dependency>

三、解决方案

  1. 数据存储sql(条件查询)
  2. 根据资源名称和条件入参查询sql
  3. GroovyShell获取sql
  4. 查询数据

四、关键代码

4.1 数据库配置表(pg)

INSERT INTO "data_resource"."resource_query_config" ("id", "resource_code", "resource_desc", "resource_sql") VALUES ('8a8ae4db8a1bf1cf018a1c1c0656004e', 'hospital_info', '医院-详情查询', 'def infoSql(String id) {StringBuilder sb = new StringBuilder();sb.append(" SELECT A.id,A.pac,A.name,A.address,A.levelcode,A.ownshipcode,A.area,A.buildingarea,B.respoperson,B.fillinpersontel,B.powersupplycode,B.watersupplycode,B.heatsupplycode,B.commsupportcode,B.plantypecode  FROM hel_helthorg_p A  ")
sb.append("LEFT JOIN helthorg_p_bu B ON A.id = B.gid ").append(" WHERE A.ID = ''").append(id).append("''");return sb.toString();
}');
INSERT INTO "data_resource"."resource_query_config" ("id", "resource_code", "resource_desc", "resource_sql") VALUES ('ff80808189914fbe018996854a420001', 'hospital_page', '医院-分页查询', 'import org.apache.commons.lang3.StringUtilsdef pageListSql(Map<String, Object> map) {StringBuilder sb = new StringBuilder();sb.append(" SELECT A.id, A.name,d.featurename,A.address,A.pac,B.respoperson,B.fillinpersontel,A.longitude,A.latitude ").append(" FROM helthorg_p A LEFT JOIN helthorg_p_bu B ON A.id = B.gid ").append(" LEFT JOIN code_feature d ON A.featurecode = d.featurecode WHERE a.isdeleted = ''0'' ");if (StringUtils.isNotBlank(map.get("distCode"))) {sb.append(" AND A.pac like :distCode ")}if (StringUtils.isNotBlank(map.get("resName"))) {sb.append(" AND A.NAME like :resName ")}return sb.toString();
}');
INSERT INTO "data_resource"."resource_query_config" ("id", "resource_code", "resource_desc", "resource_sql") VALUES ('ff80808189914fbe018996854a420013', 'hotel_info', '宾馆饭店-详情查询', 'def infoSql(String id) {StringBuilder sb = new StringBuilder();sb.append(" SELECT A.id, A.name,A.address,A.pac,A.ownshipcode as GAT_OWNSHIPCODE,A.starcode as HOTL_STARCODE,").append(" A.area,A.buildingarea,B.roomnum,B.bednum,B.meetmaxhold,B.respoperson,B.fillinpersontel,B.powersupplycode,B.watersupplycode,B.heatsupplycode,B.commsupportcode,B.plantypecode,A.longitude,A.latitude ").append(" FROM hotel_p A LEFT JOIN hotel_p_bu B ON A.id = B.gid ").append(" WHERE A.ID = ''").append(id).append("''");return sb.toString();
}');
INSERT INTO "data_resource"."resource_query_config" ("id", "resource_code", "resource_desc", "resource_sql") VALUES ('ff80808189914fbe018996854a420012', 'hotel_page', '宾馆饭店-分页查询', 'import org.apache.commons.lang3.StringUtilsdef pageListSql(Map<String, Object> map) {StringBuilder sb = new StringBuilder();sb.append(" SELECT A.id, A.name,A.address,A.pac,B.respoperson,B.fillinpersontel,A.longitude,A.latitude ").append(" FROM hotel_p A LEFT JOIN hotel_p_bu B ON A.id = B.gid ").append(" WHERE a.isdeleted = ''0'' ");if (StringUtils.isNotBlank(map.get("distCode"))) {sb.append(" AND A.pac like :distCode ")}if (StringUtils.isNotBlank(map.get("resName"))) {sb.append(" AND A.NAME like :resName ")}return sb.toString();
}');

4.2 入参

@QueryField 为封装jpa查询注解

/*** 资源查询类*/
@Data
public class ResourceQO extends PageQO {/*** 资源标识*/private String resCode;/*** 数据主键*/private List<String> id;/*** 行政区划编码*/@QueryField(type = QueryType.RIGHT_LIKE)private String distCode;/*** 资源名称*/@QueryField(type = QueryType.FULL_LIKE)private String resName;}

4.3 分页查询

    public PageResult<Map<String, Object>> pageList(ResourceQO qo){//根据条件查询并拼接配置表数据Optional<ResourceQueryConfigPO> rqc =  dao.findByResourceCode(qo.getResCode());BizPreconditions.checkArgumentNoStack(rqc.isPresent(), "资源标识不存在");// 处理区划编码;查询当前区划下的所有数据,截取,右 likeqo.setDistCode(processDistCode(qo.getDistCode()));// 动态获取SQLGroovyShell groovyShell = new GroovyShell();//装载解析脚本代码Script script = groovyShell.parse(rqc.get().getResourceSql());//执行String json = JsonUtil.of(qo);Map<String, Object> map = JsonUtil.ofMap(json, String.class, Object.class);String pageSql = (String) script.invokeMethod("pageListSql", map);String countSql = " select count(*) from ( " + pageSql +") as pc ";//jpa执行分页查询sql,并封装map返回Page<Map<String, Object>> pageList = dao.executeNativePageQuery(pageSql, countSql, qo);return PageAdapter.adapter(pageList, p -> p.getContent());}

总结

案例中有很多自定义封装的类,下面给出GroovyShell简单示例
SpringContextUtilneTypeToHdTypeServiceImpl都是spring注入的bean

  1. SpringContextUtil是获取bean的通用工具,可参考 SpringBoot 获取bean
  2. NeTypeToHdTypeServiceImpl是具体业务服务
    @GetMapping("/v1/test/{neId}")public Result<List<HdTypeResp>> test(@PathVariable Integer neId){//创建GroovyShellGroovyShell groovyShell = new GroovyShell();//装载解析脚本代码Script script = groovyShell.parse("package groovy\n" +"\n" +"import com.gsafety.bg.si.manage.service.NeTypeToHdTypeService\n" +"import com.gsafety.bg.si.manage.service.util.SpringContextUtil\n" +"\n" +"void HelloWorld(){\n" +"    println \"\\033[33mhello world\\033[0m\"\n" +"}\n" +"\n" +"def findHdIdsByNeId(Integer neId) {\n" +"    NeTypeToHdTypeService service = SpringContextUtil.getBean(\"neTypeToHdTypeServiceImpl\")\n" +"    return service.findHdIdsByNeId(neId);\n" +"}\n");//执行HelloWorldscript.invokeMethod("HelloWorld", null);//执行findHdIdsByNeIdList<HdTypeResp> resps =  (List<HdTypeResp>)script.invokeMethod("findHdIdsByNeId", neId);resps.forEach(r->{System.out.println("\033[32m"+r+"\033[0m");});return Result.success(resps);}

输出结果:
在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/218592.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rabbitmq-windows安装使用-简易后台界面-修改密码

文章目录 1.下载2.安装3.安装 RabbitMQ4.后台访问5.修改密码 1.下载 将erlang运行时和rabbitmq-windows版本&#xff0c;上传在csdn&#xff0c;下载链接。https://download.csdn.net/download/m0_67316550/88633443 2.安装 右键&#xff0c;以管理员身份运行rabbitmq。启动…

如何安装LUT预设?达芬奇/FCP/PR怎么安装LUT预设.cube格式文件的教程

在下载的LUT调色预设压缩文件包中&#xff0c;通常两个包含不同格式的LUT文件&#xff1a; .cube 和 .xmp 包含的 .cube 文件几乎与主流的视频编辑和色彩校正软件兼容&#xff0c;并且还可以在 Adobe Photoshop 等一些照片应用程序中使用。如果主要是将这些 LUT 用于视频剪辑项…

Redis-数据结构

参考资料 极客时间Redis&#xff08;亚风&#xff09; Redis数据结构 SDS sds(Simple Dynamic String) 字符串接结构体: struct --attribute_- ((-_packed__)) sdshdr8{uint8_t len&#xff1b;/* buf已保祥的字符串字节数&#xff0c;不包含结束标示*/uint8_t alloc&#…

day02-报表技术POI

1、基于模板导出列表数据 1.1、需求 按照以下样式导出excel 1.2、思路 首先准备一个excel模板&#xff0c;这个模板把复杂的样式和固定的内容先准备好并且放入到项目中&#xff0c;然后读取到模板后向里面放入数据。 1.3、实现 第一步&#xff1a;准备一个excel作为导出的…

AI 编程助手 Copilot:从对话中分析程序性能

大家好&#xff0c;我是木川 一、介绍 GitHub Copilot 是 GitHub 和 OpenAI 合作开发的一个 AI 辅助编程工具 官网地址&#xff1a;https://github.com/features/copilot 官方文档&#xff1a;https://docs.github.com/copilot 分析程序性能在对话功能中有提到 二、安装 在 VSC…

Ubuntu 常用命令之 ll 命令用法介绍

ll是ls -l的别名&#xff0c;用于在Ubuntu系统中列出目录的详细信息。ls命令用于列出目录内容&#xff0c;-l选项则以长格式显示&#xff0c;包括文件类型、权限、链接数、所有者、组、大小、最后修改时间以及文件或目录名。 这是ll命令的基本格式 ll [选项]... [文件]...这是…

Halcon参考手册异常检测知识总结

1.1异常检测介绍 本章将介绍如何使用基于深度学习的异常检测和全局上下文异常检测。通过这两种方法&#xff0c;我们想要检测图像是否包含异常(异常是指偏离正常的事物&#xff0c;未知的事物)。 异常检测或全局上下文异常检测模型学习无异常图像的共同特征。经过训练的模型将…

JS中call()、apply()、bind()改变this指向的原理

大家如果想了解改变this指向的方法&#xff0c;大家可以阅读本人的这篇改变this指向的六种方法 大家有没有想过这三种方法是如何改变this指向的&#xff1f;我们可以自己写吗&#xff1f; 答案是&#xff1a;可以自己写的 让我为大家介绍一下吧&#xff01; 1.call()方法的原理…

Linux---压缩和解压缩命令

1. 压缩格式的介绍 Linux默认支持的压缩格式: .gz.bz2.zip 说明: .gz和.bz2的压缩包需要使用tar命令来压缩和解压缩.zip的压缩包需要使用zip命令来压缩&#xff0c;使用unzip命令来解压缩 压缩目的: 节省磁盘空间 2. tar命令及选项的使用 命令说明tar压缩和解压缩命令 …

二分查找|双指针:LeetCode:2398.预算内的最多机器人数目

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 滑动窗口 单调队列&#xff1a;计算最大值时&#xff0c;如果前面的数小&#xff0c;则必定被淘汰&#xff0c;前面的数早出队。 题目 你有 n 个机器人&#xff0c;给你两…

锁--07_2---- index merge(索引合并)引起的死锁

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 案例分析生产背景死锁日志表结构执行计划 EXPLAN为什么会用 index_merge&#xff08;索引合并&#xff09;为什么用了 index_merge就死锁了解决方案注&#xff1a;M…

初识Pandas函数是Python的一个库(继续更新...)

学习网页&#xff1a; Welcome to Python.orghttps://www.python.org/https://www.python.org/https://www.python.org/ Pandas函数库 Pandas是一个Python库&#xff0c;提供了大量的数据结构和数据分析工具&#xff0c;包括DataFrame和Series等。Pandas的函数非常丰富&…

Spring Boot3.1.6配置对应的Swagger

1. pom.xml导入Swagger依赖 <!--swagger3--> <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.0.2</version> </dependency> 2.创建SwaggerCo…

自动化访客互动:提升网站效益与用户体验的关键优势

在激烈的市场竞争环境中&#xff0c;想抢占市场&#xff0c;获得收益并不容易。每一个订单的完成都要经过一定的销售周期&#xff0c;所以企业可以根据销售周期每个阶段的特点进行优化&#xff0c;留住客户。其中&#xff0c;企业可以在与客户在线互动的过程中&#xff0c;让互…

【第2期】Springboot如何快速集成SpringSecurity

简单介绍 本专栏主要结合实战讲解&#xff0c;不过多介绍细节的概念&#xff0c;概念可以通过搜索引擎查找&#xff0c;一搜一大把&#xff0c;切入正题。 本专栏的实战项目是基于SpringbootSpringSecurityRSAJWTVUE的全栈开发项目&#xff0c;每个环节都会专门讲&#xff0c;…

C语言 文件I/O(备查)

所有案列 跳转到其他。 文件打开 FILE* fopen(const char *filename, const char *mode); 参数&#xff1a;filename&#xff1a;指定要打开的文件名&#xff0c;需要加上路径&#xff08;相对、绝对路径&#xff09;mode&#xff1a;指定文件的打开模式 返回值&#xff1a;成…

遥感图像分割系统:融合空间金字塔池化(FocalModulation)改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 遥感图像分割是遥感技术领域中的一个重要研究方向&#xff0c;它的目标是将遥感图像中的不同地物或地物类别进行有效的分割和识别。随着遥感技术的不断发展和遥感…

2024年高效远程协同运维工具推荐

随着企业的不断发展以及变化&#xff0c;企业的内部IT环境也是日益复杂&#xff0c;一跨高效远程协同运维工具必不可少&#xff0c;不仅可以提高生产力&#xff0c;还能降低运营成本。这里就给大家推荐2024年高效远程协同运维工具。 高效远程协同运维工具应用场景 1、IT运维管…

(五)STM32 按键输入实验及 GPIO做普通 IO 的注意事项

目录 1. 按键硬件连接 2. 按键软件设计 3. 按键消抖 4. 使用 IO 口时的 注意事项&#xff08;踩坑&#xff09; 上一节我们介绍了 STM32F1 的 IO 口作为输出的使用&#xff0c;这一章&#xff0c;我们将介绍如何使用 STM32F1 的 IO 口作为输入用。在本章中&#xff0c;我们…

modbus 通信协议介绍与我的测试经验分享

1、简介 Modbus 协议是一种通信协议&#xff0c;用于工业自动化系统中的设备间通信。该协议最初由 Modicon 公司开发&#xff0c;并于 1979 年发布。 Modbus 协议通过串行通信格式进行通信&#xff0c;在物理层上支持 RS-232、RS-422 和 RS-485 等多种通信方式。在协议层面&am…