当前位置: 首页 > news >正文

java实现sql解析器 JSQLParser

java实现sql解析器 JSQLParser

前言

JSQLParser是基于JavaCC构建的sql语句解析器。它以可遍历的Java类层次结构来转换SQL。而且它不仅限于一个数据库,而且还支持 Oracle, SqlServer, MySQL, PostgreSQL等许多数据库。另外 自 5.0 版本起,JSQLParser 依赖于 Java 11。所以我们需要根据项目依赖环境选取对应的版本。

使用场景

在面对一些内网环境的项目,我们无法访问数据库的情况下,需要快速查一些客户需要的信息时,我们可以在项目中集成JSQLParser 只需要调用接口,就可以可前端配合将数据展示在页面上了。

各种RDBMS 不支持的语法

JSQLParser是一款与关系型数据库(RDBMS) 无关的解析器,专注于符合SQL:2016标准的查询以及“四大数据库”(Oracle,MS SQL Server, Postgres, Mysql/MariaDB)。需要编写可移植且符合标准的SQL。
1.不支持Oracel PL/SQL 块

DECLAREnum NUMBER;
BEGINnum := 10;dbms_output.put_line('The number is ' || num);
END;
  1. Oracle INSERT ALL…不受支持
INSERT ALLINTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;
  1. DDL 语句
虽然JSQLParser为 DDL 语句提供了大量通用支持,但某些 RDBMS 特定语法(尤其是关于索引、编码、压缩)可能不受支持。
  1. 区间运算符
不支持任何类似DAY HOUR MINUTE SECOND [TO HOUR MINUTE SECOND]的内容。values cast ((time '12:03:34' - time '11:57:23') minute to second as varchar(8));

快速上手

1.添加依赖(如果我们项目中引入了 mybatis-plus 就不需要添加该依赖了)

<dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>5.1</version>
</dependency>

2.代码实现

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);CCJSqlParserManager ccjSqlParserManager = new CCJSqlParserManager();Statement parse =null;try{parse = ccjSqlParserManager.parse(new StringReader(dto.getSql()));} catch (Exception e) {log.error("SQL执行错误:{}", e.getMessage());
//            return e.getMessage();}try {ExecutionSqlVO vo = new ExecutionSqlVO();if (parse instanceof Select) {List<Map<String, Object>> maps = SqlRunner.db().selectList(dto.getSql());Map<String, Object> sqlData = new HashMap<>();sqlData.put("head", CollUtil.isEmpty(maps)? Lists.newArrayList():maps.get(0).keySet());sqlData.put("data", maps);vo.setResult(sqlData);vo.setType(Select.class.getSimpleName());} else if (parse instanceof Update) {Update updateSql = (Update) parse;Expression where = updateSql.getWhere();if (where == null) {throw new ServiceException("禁止执行没有条件的SQL");}boolean update = SqlRunner.db().update(dto.getSql());if(!update){vo.setResult("执行失败");}else {vo.setResult("执行成功");}vo.setType(Update.class.getSimpleName());return vo;} else if (parse instanceof Insert) {boolean insert = SqlRunner.db().insert(dto.getSql());if(!insert){vo.setResult("执行失败");}else {vo.setResult("执行成功");}vo.setType(Insert.class.getSimpleName());} else if (parse instanceof Delete) {Delete deleteSql = (Delete) parse;Expression where = deleteSql.getWhere();if (where == null) {throw new ServiceException("禁止执行没有条件的SQL");}boolean delete = SqlRunner.db().delete(dto.getSql());if(!delete){vo.setResult("执行失败");}else {vo.setResult("执行成功");}vo.setType(Delete.class.getSimpleName());} else if (parse instanceof CreateTable) {jdbcTemplate.execute(dto.getSql());vo.setResult(String.format("执行成功"));vo.setType(Delete.class.getSimpleName());} else {throw new ServiceException("不支持的SQL类型");}return vo;} catch (Exception se) {
//            return se.getMessage();}return  null;}

方法测试

在这里插入图片描述

http://www.dtcms.com/a/329018.html

相关文章:

  • 16-docker的容器监控方案-prometheus实战篇
  • 30 HTB Soccer 机器 - 容易
  • 【Android】四种不同类型的ViewHolder的xml布局
  • 双写一致性问题如何解决?
  • Python 元类基础:从理解到应用的深度解析
  • 机器翻译:学习率调度详解
  • 小电视视频内容获取GUI工具
  • 长篇音频制作(小说自动配音)完整教程
  • 嵌入式 - linux软件编程: 目录 IO及时间相关的函数接口
  • 《Python学习之基础语法1:从零开始的编程之旅》
  • Verilog功能模块--SPI主机和从机(02)--SPI主机设计思路与代码解析
  • 电商项目微服务架构拆分实战
  • 使用TexLive与VScode排版论文
  • 内容索引之word转md工具 - markitdown
  • 华为 HCIE 大数据认证中 Linux 命令行的运用及价值
  • 【linux】--U盘挂载
  • 【CV 目标检测】③——目标检测方法
  • 2025_07_安装Jmeter,创建一个登录请求
  • python的游戏评级论坛系统
  • 云计算-OpenStack 实战运维:从组件配置到故障排查(含 RAID、模板、存储管理,网络、存储、镜像、容器等)
  • PLM产品管理系统有什么功能模块?PLM系统核心功能模块解析
  • WPS文字和Word文档如何选择多个不连续的行、段
  • rk3588 ubuntu20.04安装包经常出现的问题总结(chatgpt回复)
  • 疏老师-python训练营-Day44预训练模型
  • 【leetcode】55. 跳跃游戏1
  • 阿里云Anolis OS 8.6的公有云仓库源配置步骤
  • Python uv的使用和配置
  • 联网车辆功能安全和网络安全的挑战与当前解决方案
  • TraeCN与Cursor对比分析:双雄争锋下的AI编程工具演进之路
  • 河南萌新联赛2025第(五)场:信息工程大学”