初识GroovyShell

2023-12-14 09:52
文章标签 初识 groovyshell

本文主要是介绍初识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);}

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


在这里插入图片描述

这篇关于初识GroovyShell的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/492068

相关文章

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

docker学习系列(一)初识docker

在第一版本上线之后公司,我们决定将之前使用的开源api文档项目转移到本公司的服务器之上,之前用的是showdoc,showdoc利用的是php技术,作为java程序员表示需要快速部署php环境以及apach容器都需要时间,所以采用第二种方法,即利用docker进行快速部署(虽然学习成本也不比php少)。 一、docker简介 docker的官网是https://www.docker.com,

框架template初识

框架初识 框架就是一个别人帮我们搭好的舞台,造好了很多现成的工具供我们使用,让开发过程更快速、简洁。 Gin框架介绍 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 Gin是一个用Go语言编写的web框架。它是一个类似于martini 但拥有更好性能的API框架, 由于使用了 httprouter,速度提高了近40倍。 第一个Gin示例 package mai

【数据结构】--初识泛型

1. 包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 1.2 (自动)装箱和(自动)拆箱 装箱(装包): 把 基本数据类型 变为 包装类类型 的过程 叫做装箱。 反汇编指

初识Linux · 进度条

目录 前言: 1 缓冲区和回车换行 2 进度条 前言: 我们目前学习了些许知识,已经足够支持我们写一个非常非常小的项目了,即进度条,相信大家都有过下载游戏,等待游戏更新完成的时候,那么此时就有一个进度条,代表着游戏的更新进度,那么我们今天就来模拟实现这个过程,在此之前,我们需要一些预备知识。 1 缓冲区和回车换行 回车换行?是的,你没有看错,相信不少人对换行有一定的误解,我们

Linux初识线程

前言 前面在介绍进程的时候,说过进程的内核表述是"进程是承担资源分配的基本实体",但是我们至今都没有介绍如何理解他?本期我们就会介绍! 目录 前言 一、再谈地址空间和页表 1、OS对物理内存的管理 • 为什么4KB是OS进行I/O的基本单位? 2、再谈页表 • 二级页表 • 如何找到一个变量的所有字节? • 虚拟地址是如何转为物理地址的? • 理解动态内存管理 • 为什么对

初识命名空间

1.创建两个命名空间 ip netns add host1 ip netns add host2 2.  查看命名空间 ip netns ls 3 、 创建veth ip -netns host1 link add veth0 type veth peer name host1-peer 4、 查看命名空间接口  ip -netns host1 address 5、 把hos

Linux进程初识:OS基础、fork函数创建进程、进程排队和进程状态讲解

目录 1、冯诺伊曼体系结构 问题一:为什么在体系结构中存在存储器(内存)? 存储单元总结: 问题二:为什么程序在运行的时候,必须把程序先加载到内存? 问题三:请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。 2、操作系统 2.1操作系统的概念: 我们首先要明白什么是管理: 2.2为什么要有操作系统? 2.3操作系统如何保证稳定和安全呢?(利用系统调用函数解决)

初识string(一)and内存管理

对类和对象的补充:缺省参数在函数定义中从右向左依次赋值,如果从右向左有一个参数没有赋值缺省参数,则左边的变量就不能在赋缺省参数,类中的变量可以赋缺省参数并且没有限制。 在类定义中我们总是看到函数后加const。这其实是调用常量类对象或类对象的意思。 一、引言 俗话说“工欲善其事,必先利其器。”一门语言创造的初衷一定是为了交流和记录重要的事。计算机语言肯定也不例外,虽然计算机语言创造的初衷单纯

Web安全之GroovyShell讲解:错误与正确示范,安全问题与解决方案

1. 引言 Groovy 是一门基于 Java 虚拟机(JVM)的动态语言,而 GroovyShell 是 Groovy 提供的一个灵活强大的脚本执行工具。通过 GroovyShell,开发者可以在运行时动态执行 Groovy 脚本,它的灵活性非常适合那些需要动态编译与执行脚本的应用场景。然而,动态执行脚本同时也带来了一些潜在的安全风险,尤其在开发电商交易系统等敏感业务场景时,防止脚本注入与权限