由于之前做的项目 业务逻辑不能用系统定义的方案做计算 只能是让用户自己输入参数值设置比例计算规则 系统提供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));
附件中有所有程序
分享到:
相关推荐
为了帮助开发者更好地理解和解析SQL语句,出现了许多工具,其中JSqlParser是一个非常实用的Java库,它提供了一种解析SQL语法的方式,使得我们能够对SQL语句进行深度处理。本文将详细介绍基于JSqlParser实现的SQL解析...
- **输入验证**:为了确保用户输入的有效性,程序需要对输入进行验证,例如检查电话号码格式是否正确,邮箱是否符合规范等。 4. **异常处理**: - **错误捕获和处理**:在数据库操作过程中可能会出现各种异常,...
- 集成测试:检查各模块间的交互是否正常,可以使用Mockito等工具模拟依赖。 9. **部署**: - 系统部署可能涉及到Java应用服务器,如Tomcat,将打包好的WAR文件部署到服务器上运行。 总之,"java+sqlserver图书...
- `isClosed()` 和 `isReadOnly()`:检查连接是否已关闭或是否为只读模式。 - `clearWarnings()` 和 `getWarnings()`:处理和获取数据库操作产生的警告。 4. **其他功能**: - `nativeSQL(String)`:允许驱动...
2. 数据库兼容性:不同的数据库可能有不同的语法,工具需要支持目标数据库的SQL语法。 3. 注解的配置:根据所使用的ORM框架,选择合适的注解以确保数据映射的正确性。 4. 代码维护:虽然自动生成的代码能节省时间,...
例如,检查表是否存在,列名是否正确,权限是否足够等。 4. **查询优化**:此阶段,查询分析器会根据数据库的统计信息,如索引、表大小等,生成最优的执行计划。这可能涉及重写查询(query rewriting)、选择最佳...
- **语义分析(Semantic Analysis)**:验证代码的逻辑正确性,例如变量是否已声明、类型匹配、权限检查等。 - **错误报告**:在解析过程中发现错误,软件应能准确地报告错误位置和原因。 “www.pudn.com.txt”可能...
在实际开发中,当遇到类似问题时,不仅需要检查SQL语法的正确性,还需要关注框架自身的特性和配置,以便找到合适的解决方案。通过合理的缓存管理和配置,可以确保自定义SQL的正确执行,同时保持系统的高效运行。
它会检测是否正确处理了请求参数、是否存在SQL注入或跨站脚本攻击的风险,以及JSP页面结构的合理性。这些检查有助于提高JSP页面的健壮性和安全性。 4. **SQL脚本检查**: SQL检查则针对SQL语句的语法、性能和安全...
检查SQL命令并修正语法错误。 5. **表或对象不存在** - `java.sql.SQLException: ORA-00942: table or view does not exist`: 查询的表或视图不存在。核实表名或视图名的拼写和大小写,以及是否有访问权限。 6. *...
1. **SQL语句解析**:将用户输入的SQL字符串转化为可操作的对象模型,这使得你可以检查SQL的语法是否正确,或者提取特定的查询元素。 2. **安全评估**:在执行SQL之前,可以通过AST来检查SQL注入的风险,确保用户...
WallFilter会检查SQL语句是否包含非法字符或可疑的构造,如双引号、注释、动态拼接等,如果发现潜在的风险,会阻止该SQL执行,确保系统安全。 【BatchExecutor for Test】是用于测试的批量执行器,它可能提供了一种...
开发者需要掌握Java的基础语法、类和对象、异常处理、IO流、集合框架以及多线程等知识。 2. **Swing或JavaFX GUI设计**:为了构建纯软件界面,开发者可能使用了Java的Swing或JavaFX库来创建用户界面。这涉及到组件...
3. **逻辑检查**:除了语法正确性,还需要检查SQL语句的逻辑是否合理。例如,确保查询不会返回过多数据,更新或删除操作不会影响到不应影响的数据行。 4. **安全限制**:为了防止SQL注入,可以设定一些安全限制,如...
### SQL基础语法知识点 #### 一、数据库简介与分类 - **数据库**是长期存储在计算机内、有组织的、可共享的数据集合。 - **关系型数据库管理系统(RDBMS)**:一种采用表格形式来组织数据的数据库系统。通过定义表...
3. SQL语法错误:在执行SQL语句时,要遵循各数据库的语法规则。 4. 权限问题:确认用户名和密码正确,且用户具有足够的权限访问数据库。 5. 缺少jar包:确保所有必要的JDBC驱动已添加到项目的类路径中。 6. SSL连接...
根据给定的文件信息,我们可以总结出以下与IT行业相关的知识点,主要集中在SQL查询与Java编程上: ### SQL基础知识及应用 #### 数据处理与聚合 在金蝶笔试中,SQL部分涉及了数据处理与聚合的基本操作。例如,在...