java 验证sql正确_java检查sql语法是否正确

2023-05-16

因为以前作的项目 业务逻辑不能用系统定义的方案作计算 只能是让用户本身输入参数值设置比例计算规则 系统提供sql验证 在通常的项目中也不多用到这种类型的作法 以下:java

import java.util.List;

public class RuleMain {

/** 测试 sql语法

* @param args

*/

public static void main(String[] args) {

//定义sql 这是由用户动态输入

String s = "ssyxz = '101' and ( CS = '1' and SZ = 0) and ZW <= 12 and CL >= 1 and CXZK < 88";

RuleParser parser=new RuleParser();

try {

//检查sql语法是否存在错误

parser.analyze(s);

// 获取sql中的全部变量

List variables = parser.getVariables();

for (String string : variables) {

System.out.println("name:"+string);

}

} catch (RuleParserException e) {

System.out.println(e.getMessage());

//e.printStackTrace();

}

}

}

执行输出sql

name:ssyxz

name:CS

name:SZ

name:ZW

name:CL

name:CXZK

规则解析类 RuleParser  本身实现app

import java.io.StringReader;

import java.util.ArrayList;

import java.util.List;

import java.util.Set;

import antlr.InputBuffer;

import antlr.LexerSharedInputState;

import antlr.ParserSharedInputState;

import antlr.RecognitionException;

import antlr.TokenBuffer;

import antlr.TokenStreamException;

public class RuleParser {

//定义标准的sql查询语句

private static String prefixCondition=new String("select * from tableName where ");

public static int position_offset;

static{

position_offset=-prefixCondition.length();

}

private Listvariables=new ArrayList();

public void analyze(String statement) throws RuleParserException {

try {

SqlLexer lexer = new SqlLexer(new StringReader(new StringBuffer(prefixCondition)

.append(statement).toString()));

SqlParser parser = new SqlParser(lexer);

//启动sql规则验证

parser.start_rule();

//获取错误集合

List errorPool = parser.getErrorPool();

//是否存在错误

if(errorPool.size()>0){

for (Exception ex : errorPool) {

if(ex instanceof RecognitionException){

throw (RecognitionException)ex;

}

if(ex instanceof TokenStreamException){

throw (TokenStreamException)ex;

}

}

}

//获取全部变量

Set columnNameSet = parser.getColumnNameSet();

variables.addAll(columnNameSet);

} catch (RecognitionException e) {

throw new RuleParserException(e);

} catch (TokenStreamException e) {

throw new RuleParserException(e);

}

}

public List getVariables() {

return variables;

}

}

sql分析类 SqlLexer 指截图了一部分测试

import java.io.InputStream;

import antlr.TokenStreamException;

import antlr.TokenStreamIOException;

import antlr.TokenStreamRecognitionException;

import antlr.CharStreamException;

import antlr.CharStreamIOException;

import java.io.Reader;

import java.util.Hashtable;

import antlr.InputBuffer;

import antlr.ByteBuffer;

import antlr.CharBuffer;

import antlr.Token;

import antlr.RecognitionException;

import antlr.NoViableAltForCharException;

import antlr.TokenStream;

import antlr.ANTLRHashString;

import antlr.LexerSharedInputState;

import antlr.collections.impl.BitSet;

public class SqlLexer extends antlr.CharScanner implements SqlTokenTypes, TokenStream

{

public SqlLexer(InputStream in) {

this(new ByteBuffer(in));

}

public SqlLexer(Reader in) {

this(new CharBuffer(in));

}

public SqlLexer(InputBuffer ib) {

this(new LexerSharedInputState(ib));

}

//sql关键字定义

public SqlLexer(LexerSharedInputState state) {

super(state);

caseSensitiveLiterals = false;

setCaseSensitive(false);

literals = new Hashtable();

literals.put(new ANTLRHashString("round", this), new Integer(40));

literals.put(new ANTLRHashString("initcap", this), new Integer(45));

literals.put(new ANTLRHashString("vsize", this), new Integer(82));

literals.put(new ANTLRHashString("all", this), new Integer(20));

literals.put(new ANTLRHashString("sqrt", this), new Integer(42));

literals.put(new ANTLRHashString("replace", this), new Integer(49));

literals.put(new ANTLRHashString("count", this), new Integer(61));

literals.put(new ANTLRHashString("nvl", this), new Integer(79));

literals.put(new ANTLRHashString("sum", this), new Integer(65));

literals.put(new ANTLRHashString("hextoraw", this), new Integer(69));

literals.put(new ANTLRHashString("soundex", this), new Integer(52));

literals.put(new ANTLRHashString("chartorowid", this), new Integer(67));

附件中有全部程序this

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 验证sql正确_java检查sql语法是否正确 的相关文章

  • 关系数据库和图数据库的比较

    有人可以向我解释一下 MySQL 等关系数据库与 Neo4j 等图形数据库相比的优缺点吗 在 SQL 中 您有多个表 它们之间有不同的 id 链接 然后你必须加入来连接表 从新手的角度来看 为什么要将数据库设计为需要联接 而不是像图形数据库
  • 如何操作指定列上的 JTable 返回值?

    我有一个 JTable 有两列 可编辑的JTable 当用户在第二列中输入内容时 我的要求如下 用户只能输入数字和逗号 当用户输入错误字符时 会发出蜂鸣声 Toolkit getDefaultToolkit beep 我该如何实现这一目标
  • javax.naming.NameNotFoundException

    我正在 JBoss 5 容器中运行 ejb 示例 我正在使用一个例子从这里开始 第一部分 http www roseindia net jboss jboss 3 2 shtml 在示例中 我在 JBoss 中部署了 bean 并在 Tom
  • 如何找出已使用的 JAR?

    在更大的项目中 我们可能会使用大量的 JAR 如何找出项目 而不是整个项目 中的某个模块 包正在使用哪些 JAR 有什么工具 技术等吗 较大的项目通常使用类似的构建工具maven http maven apache org or ant h
  • 为什么 Orchard 在执行内容项查询时如此慢?

    假设我想查询所有 Orchard 用户 ID 并且还想包括那些已被删除 也称为软删除 的用户 该数据库包含大约 1000 个用户 Option A 大约需要 2 分钟 Orchard ContentManagement IContentMa
  • Java SWT 用户输入验证

    在 SWT 中进行用户输入验证时 Java 约定是什么 我读到有 FieldEditors 它们是非常方便的字段 但遗憾的是仅适用于首选项和对话框 我还了解到有一个 IValidator 接口 但它经常与数据绑定一起使用 就我而言 我的大多
  • Android 3.1 USB 主机 - BroadcastReceiver 未收到 USB_DEVICE_ATTACHED

    我经历过USB 主机的描述和示例位于developer android com http developer android com guide topics usb host html检测连接和分离的 USB 设备 如果我在清单文件中使用
  • EDITLogBack Syslog 不工作 java

    我写了一个简单的项目来在 Ubuntu 中运行日志 方法如下example https examples javacodegeeks com enterprise java logback logback syslog example 应用
  • 如何在生产中安全地更改会话 cookie 域或名称?

    我们最近意识到我们的会话 cookie 正在被写入我们网站的完全限定域名 www myapp com 例如 MYAPPCOOKIE 79D5DB83 domain www myapp com 我们希望将其切换为可以跨子域共享的cookie
  • 当列的数据类型为 int 时,如何用字符串替换 null

    我有一个包含 3 列的表和如下示例数据 所有列都是数据类型int 我有这个查询 select foodid dayid from Schedule 我要更换dayid用字符串 ifdayid null 为此我尝试了这个查询 select f
  • 在 JUnit 测试中读取资源文件

    我在单元测试中读取文本文件 并将一些输入文本文件放置在资源文件夹中 以下是目录结构 src gt com gt au gt myapp gt util gt MyFileReader 测试 gt com gt au gt myapp gt
  • 测试 Hessian remoting-servlet.xml

    我们使用 Hessian 来实现富客户端和服务器之间的通信 由于移动和重命名 remoting servlet xml 中的条目有时会与实际的类名不匹配 因此 我正在寻找一种简单的方法来测试远程处理 xml 有没有简单的方法可以做到这一点
  • 在单独的模块中使用 Spring AOP 方面

    我在一个 Maven 项目模块中有一个方面 com x NiceAspect 在一个单独的 Maven 模块中有一个类 com x NiceClass 这些模块具有相同的 POM 父级 共同创建一个项目 我想要实现的目标是拥有一个通用的方面
  • 具有多个注释的方法上的 AspectJ 切入点

    使用加载时编织 纯 AspectJ 我们有2个注释 Time and Count 以及一些带注释的方法 Time name myMethod1Time Count name myMethod1Count public void myMeth
  • 是否可以从 JBoss 容器中部署的所有 .war 文件中读取属性文件

    我已成功将 war 部署到 Jboss Web 容器 其中包含并读取位于 META INF groupid dir artifactid dir 下的 pom properties 为了访问该文件 我在同一 war 中的 JSP 中使用了以
  • 为什么我们在同一台服务器上使用多个应用程序服务器实例

    我想这是有充分理由的 但我不明白为什么有时我们会在同一物理服务器上放置例如 5 个具有相同 Web 应用程序的实例 这与多处理器架构的优化有关吗 JVM 或其他允许的最大内存限制 嗯 过了很长一段时间我又看到这个问题了 一台机器上的多个 J
  • Guava MultiSet 与 Map?

    我对Multiset的理解是一个带有频率的集合 但是我总是可以使用Map来表示频率 还有其他原因使用Multiset吗 优点Multiset
  • 单向关系和双向关系的区别

    我想知道这两个词是什么意思 我遇到他们是在教义的文档 http www doctrine project org documentation manual 2 0 en association mapping 但我不明白他们的意思 这与常见
  • java.lang.OutOfMemoryError:尝试将 Java 对象转换为 Json 字符串时的 Java 堆空间

    我尝试将 csv 文件转换为 200K 对象的 Json 文件 其中对象代表 csv 中的 1 行 我在 32 位上安装了 Java 并且项目配置 VM 参数 Xmx1024m 但是我得到 Exception in thread main
  • 产品和变体 - 设计数据库的最佳方法

    描述 商店可以有产品 鞋子 T 恤等 每个产品可以有许多变体 每个变体可以有不同的价格和库存 例如T 恤有不同的颜色和尺寸 颜色 蓝色 尺寸 L 价格 10 美元 库存 5 颜色 蓝色 尺寸 XL 价格 10 美元 库存 10 颜色 白色

随机推荐