gpt4 book ai didi

java - 如何在 Java 中运行 .sql 脚本(从文件)并使用 Spring 返回结果集?

转载 作者:搜寻专家 更新时间:2023-11-01 02:10:01 28 4
gpt4 key购买 nike

如何在 Java 中运行 .sql 脚本(从文件)并使用 Spring 返回 ResultSet

我有一个程序在数据库上运行 SQL 查询,返回 ResultSet,稍后我会在我的类中处理和使用这些数据。我目前正在使用 JDBC 和 Java 程序中的脚本。

StringBuilder query = new StringBuilder("some script on multiple lines");
PreparedStatement statement = connection.prepareStatement(query.toString());
ResultSet resultSet = statement.executeQuery();

我想将 Java 程序之外的 SQL 查询移动到 .sql 文件,但我想保留 executeQuery 语句中的所有程序逻辑。这意味着我想让查询返回一个结果集。

我研究了几种方法,例如使用 ScriptRunner、使用 Spring JdbcTestUtils.executeSqlScript 或使用 BufferReader 读取 .sql 文件,然后将字符串传递给我的语句。 ScriptRunner 和 Spring JdbcTestUtils.executeSqlScript 似乎没有返回 ResultSet,或者我找不到正确的实现。我想远离 BufferReader 方法,因为它需要文本解析和大量异常处理。

ScriptRunner scriptRunner = new ScriptRunner(connection, true, true);
scriptRunner.runScript(new FileReader("script.sql"));

runScript 方法返回 void。 Spring 实现也是如此:

MysqlDataSource ds = new MysqlDataSource();
ds.setServerName("host");
ds.setUser("user");
ds.setPassword("password");

JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);

Resource resource = new ClassPathResource("script.sql");
JdbcTestUtils.executeSqlScript(jdbcTemplate, resource, true);

我仔细查看了 Spring api,但找不到与我想要的类似的东西。有没有办法从文件加载脚本然后运行它,以便它使用 Spring 返回 ResultSet?我更喜欢使用 Spring,因为它已被积极维护。

最佳答案

我找到了一种使用 Spring 的方法:

MysqlDataSource ds = new MysqlDataSource();
ds.setServerName("host");
ds.setUser("user");
ds.setPassword("password");

JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);

BufferedReader in = new BufferedReader(new FileReader("script.sql"));
LineNumberReader fileReader = new LineNumberReader(in);
String query = JdbcTestUtils.readScript(fileReader);

现在我们将使用 jdbcTemplate.query 通过我们读取的 .sql 脚本查询数据库。所需的 ResultSet 将作为参数传递给 ResultSetExtractor 实现的 extractData 或传递给 mapRow >RowMapper 实现。所以 ResultSet 的处理将在 extractDatamapRow 实现中完成,我们将返回我们需要的 Collection/Object

List<YourClass> result = jdbcTemplate.query(query, new RowMapper<YourClass>() {
@Override
public YourClass mapRow(ResultSet rs, int i) throws SQLException {
// processing of the ResultSet
return result;
}
});

YourClass object = jdbcTemplate.query(query, new ResultSetExtractor<YourClass>() {
@Override
public YourClass extractData(ResultSet rs) throws SQLException, DataAccessException {
// processing of the ResultSet
return result;
}
});

当然,使用最后一个实现你可以返回任何你想要的对象,甚至是对象的集合。

关于java - 如何在 Java 中运行 .sql 脚本(从文件)并使用 Spring 返回结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20452831/

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