gpt4 book ai didi

java - 使用选择查询和动态 SQL 执行 SQL 脚本文件

转载 作者:行者123 更新时间:2023-11-29 18:31:32 24 4
gpt4 key购买 nike

我需要使用动态 SQL 查询执行许多 sql 文件,如下所示

Query1.sql

set @a= (select col_value1 from table1 where x=y);    
set @b= (select col_value2 from table2 where x1=@a);

prepare script from @b;
execute script;
deallocate prepare script;

我需要在执行后获取ResultSet对象以进行进一步处理。

我尝试使用 iBatis 框架中的 ScriptRunner。在那里我们可以执行查询,但无法获取 ResultSet 对象。

此外,还看到了一些通过运行时作为系统命令执行的方法。由于环境是基于线程的,我不建议使用这种方法。

有没有其他方法可以做到这一点。 ?

提前致谢。

最佳答案

也许只需使用正则表达式解析您的文件,然后使用替换的参数调用查询?我想出了这样的东西:

package com.company;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

private static String queryFile() {
return "set @a= (select col_value1 from table1 where x=y);\n" +
"set @b= (select col_value2 from table2 where x1=@a);\n" +
"prepare script from @b;\n" +
"execute script;\n" +
"deallocate prepare script;";
}

private static final Pattern QUERY_PATTERN = Pattern.compile("set (@.)= (.*.)");
private static final Pattern QUERY_VARIABLE_MATCHER = Pattern.compile("@.");

public static void main(String[] args) {
Map<String, String> queryMap = new LinkedHashMap<String, String>();
String lines[] = queryFile().split("\n");
for (String line : lines) {
Matcher matcher = QUERY_PATTERN.matcher(line);
if (matcher.matches()) {
String key = matcher.group(1);
String query = matcher.group(2);
queryMap.put(key, query);
}
}

invokeQueries(queryMap);
}

/**
* Invokes queries parsed from a file. Works only if queries are sorted properly (query B uses a query A result).
*/
private static void invokeQueries(Map<String, String> queryMap) {
Map<String, String> queryResults = new HashMap<String, String>();
for (Map.Entry<String, String> entry : queryMap.entrySet()) {
String query = entry.getValue();
Matcher matcher = QUERY_VARIABLE_MATCHER.matcher(query);
if (!matcher.find()) {
String queryResult = mockInvokeQuery(query);
queryResults.put(entry.getKey(), queryResult);
System.out.println("Invoked query: " + query + " with result : " + queryResult);
} else {
matcher.reset();
System.out.println("Replacing query parameters for query: " + query);
while (matcher.find()) {
String variable = matcher.group();
String replacedQuery = query.replaceAll(variable, queryResults.get(variable));
String queryResult = mockInvokeQuery(query);
queryResults.put(entry.getKey(), queryResult);
System.out.println("Invoked query with replaced parameters:: " + replacedQuery + " with result: " + queryResult);
}
}
}
}

/**
* Invoke your query and get your result set
*/
private static String mockInvokeQuery(String query) {
return String.valueOf(query.hashCode());
}

/**
* Replaces @ parameter for all queries within a hashmap. It won't work properly if queries are dependent on each other.
*/
private static Map<String, String> replaceQueryVariables(Map<String, String> queryMap) {
Map<String, String> replacedQueries = new HashMap<String, String>();
for (Map.Entry<String, String> entry : queryMap.entrySet()) {
String query = entry.getValue();
Matcher matcher = QUERY_VARIABLE_MATCHER.matcher(query);
while (matcher.find()) {
String variable = matcher.group();
String replacedQuery = query.replaceAll(variable, queryMap.get(variable));
replacedQueries.put(entry.getKey(), replacedQuery);

}
}
return replacedQueries;
}

}

结果是:

Invoked query: (select col_value1 from table1 where x=y); with result : -316456543
Replacing query parameters for query: (select col_value2 from table2 where x1=@a);
Invoked query with replaced parameters:: (select col_value2 from table2 where x1=-316456543); with result: -1396099308

关于java - 使用选择查询和动态 SQL 执行 SQL 脚本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com