如何在 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
>RowMapperResultSet
的处理将在 extractData
或 mapRow
实现中完成,我们将返回我们需要的 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/