`
zhouxingfu520
  • 浏览: 422826 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java检查sql语法是否正确

 
阅读更多

由于之前做的项目 业务逻辑不能用系统定义的方案做计算 只能是让用户自己输入参数值设置比例计算规则 系统提供sql验证 在一般的项目中也很少用到这种类型的做法 如下:

 

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<String> variables = parser.getVariables();
			for (String string : variables) {
				System.out.println("name:"+string);
			}
		} catch (RuleParserException e) {
			System.out.println(e.getMessage());
//			e.printStackTrace();
		}
	}

}

 

 执行输出

 

name:ssyxz
name:CS
name:SZ
name:ZW
name:CL
name:CXZK

 

规则解析类 RuleParser  自己实现

 

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 List<String>variables=new ArrayList<String>();
	
	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<Exception> 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<String> columnNameSet = parser.getColumnNameSet();
			variables.addAll(columnNameSet);
			
		} catch (RecognitionException e) {
			throw new RuleParserException(e);
		} catch (TokenStreamException e) {
			throw new RuleParserException(e);
		}
	}
	
	public List<String> 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));

 

 

附件中有所有程序

 

 

分享到:
评论
9 楼 thinkInJava_rKing 2017-07-13  
insert ... select...也不行
8 楼 thinkInJava_rKing 2017-07-13  
特别不支持各种join查询
7 楼 thinkInJava_rKing 2017-07-13  
你这个不支持嵌套 + 各种join union 查询
6 楼 duxiullf 2016-06-01  
可否提供.g文件看下,谢谢!
5 楼 baicaiyu 2015-12-01  
支持update、delete、select等校验,你需要进行设置标准sql类型就可以支持。
例如设置 update:
String prefixCondition=new String("update tableName where ");
再校验where条件,字段可以从数据库中查询该表的字段再和当前抽取的字段进行校验比对,挺好的,非常感谢!
4 楼 youfeelthat 2015-02-13  
只能是select语句吗
3 楼 jkfd 2014-06-17  
中文查询条件不支持,例如:select * from table where column = '中文'。博主是否可以修正这个问题?
2 楼 gaoran2008 2013-07-10  
可否提供g文件学习下,在下载的里面没有发现。
谢谢了
1 楼 TUIOP1234 2012-07-18  

相关推荐

    基于SQL 语法解释器JSqlParser实现的SQL解析工具

    为了帮助开发者更好地理解和解析SQL语句,出现了许多工具,其中JSqlParser是一个非常实用的Java库,它提供了一种解析SQL语法的方式,使得我们能够对SQL语句进行深度处理。本文将详细介绍基于JSqlParser实现的SQL解析...

    服务器出现java.sql.SQLException No suitable driver found for 的.pdf

    当遇到“java.sql.SQLException: No suitable driver found for”这一异常时,需要从多个角度进行排查,包括检查URL、用户名和密码是否正确、确保JDBC驱动已正确导入、检查JDK版本与驱动版本是否匹配以及确保驱动...

    java+SQL数据库通讯录

    - **输入验证**:为了确保用户输入的有效性,程序需要对输入进行验证,例如检查电话号码格式是否正确,邮箱是否符合规范等。 4. **异常处理**: - **错误捕获和处理**:在数据库操作过程中可能会出现各种异常,...

    java+sqlserver图书管理系统

    - 集成测试:检查各模块间的交互是否正常,可以使用Mockito等工具模拟依赖。 9. **部署**: - 系统部署可能涉及到Java应用服务器,如Tomcat,将打包好的WAR文件部署到服务器上运行。 总之,"java+sqlserver图书...

    java.sql.connection.pdf

    - `isClosed()` 和 `isReadOnly()`:检查连接是否已关闭或是否为只读模式。 - `clearWarnings()` 和 `getWarnings()`:处理和获取数据库操作产生的警告。 4. **其他功能**: - `nativeSQL(String)`:允许驱动...

    sql自动生成java代码

    2. 数据库兼容性:不同的数据库可能有不同的语法,工具需要支持目标数据库的SQL语法。 3. 注解的配置:根据所使用的ORM框架,选择合适的注解以确保数据映射的正确性。 4. 代码维护:虽然自动生成的代码能节省时间,...

    java SQL查询分析器开发

    例如,检查表是否存在,列名是否正确,权限是否足够等。 4. **查询优化**:此阶段,查询分析器会根据数据库的统计信息,如索引、表大小等,生成最优的执行计划。这可能涉及重写查询(query rewriting)、选择最佳...

    PLSQL.rar_pl\sql_plsql_plsql java 分析_语法分析

    - **语义分析(Semantic Analysis)**:验证代码的逻辑正确性,例如变量是否已声明、类型匹配、权限检查等。 - **错误报告**:在解析过程中发现错误,软件应能准确地报告错误位置和原因。 “www.pudn.com.txt”可能...

    java项目应用中自定义sql在ibaits框架中的使用.docx

    在实际开发中,当遇到类似问题时,不仅需要检查SQL语法的正确性,还需要关注框架自身的特性和配置,以便找到合适的解决方案。通过合理的缓存管理和配置,可以确保自定义SQL的正确执行,同时保持系统的高效运行。

    代码检查器(java js jsp sql)

    它会检测是否正确处理了请求参数、是否存在SQL注入或跨站脚本攻击的风险,以及JSP页面结构的合理性。这些检查有助于提高JSP页面的健壮性和安全性。 4. **SQL脚本检查**: SQL检查则针对SQL语句的语法、性能和安全...

    oracle+ora-各种常见java.sq

    检查SQL命令并修正语法错误。 5. **表或对象不存在** - `java.sql.SQLException: ORA-00942: table or view does not exist`: 查询的表或视图不存在。核实表名或视图名的拼写和大小写,以及是否有访问权限。 6. *...

    基于java的SQL解析类库 SQLJEP.zip

    1. **SQL语句解析**:将用户输入的SQL字符串转化为可操作的对象模型,这使得你可以检查SQL的语法是否正确,或者提取特定的查询元素。 2. **安全评估**:在执行SQL之前,可以通过AST来检查SQL注入的风险,确保用户...

    基于Java的SQL工具DialectPaginationUrlParserSqlStatementParserWallFilterBatchExecutorforTest

    WallFilter会检查SQL语句是否包含非法字符或可疑的构造,如双引号、注释、动态拼接等,如果发现潜在的风险,会阻止该SQL执行,确保系统安全。 【BatchExecutor for Test】是用于测试的批量执行器,它可能提供了一种...

    学生信息管理系统 java sql 纯软件界面

    开发者需要掌握Java的基础语法、类和对象、异常处理、IO流、集合框架以及多线程等知识。 2. **Swing或JavaFX GUI设计**:为了构建纯软件界面,开发者可能使用了Java的Swing或JavaFX库来创建用户界面。这涉及到组件...

    实现sql语句正确验证的控件

    3. **逻辑检查**:除了语法正确性,还需要检查SQL语句的逻辑是否合理。例如,确保查询不会返回过多数据,更新或删除操作不会影响到不应影响的数据行。 4. **安全限制**:为了防止SQL注入,可以设定一些安全限制,如...

    一些sql语法基础笔记

    ### SQL基础语法知识点 #### 一、数据库简介与分类 - **数据库**是长期存储在计算机内、有组织的、可共享的数据集合。 - **关系型数据库管理系统(RDBMS)**:一种采用表格形式来组织数据的数据库系统。通过定义表...

    Java连接SqlServer2005和MySQL

    3. SQL语法错误:在执行SQL语句时,要遵循各数据库的语法规则。 4. 权限问题:确认用户名和密码正确,且用户具有足够的权限访问数据库。 5. 缺少jar包:确保所有必要的JDBC驱动已添加到项目的类路径中。 6. SSL连接...

    金蝶笔试.txt(sql+java)

    根据给定的文件信息,我们可以总结出以下与IT行业相关的知识点,主要集中在SQL查询与Java编程上: ### SQL基础知识及应用 #### 数据处理与聚合 在金蝶笔试中,SQL部分涉及了数据处理与聚合的基本操作。例如,在...

Global site tag (gtag.js) - Google Analytics