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

标签 java sql spring jdbc

如何在 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/

相关文章:

java - SWT:如何从一个 Action 创建一个普通的按钮

java - 使用预准备语句的 SQL 语法错误

spring - 动态添加实体到 hibernate

java - HTTP 请求中缺少元素 - Null 还是 Empty?

java - 类变量初始值设定项、类的静态初始值设定项和字段初始值设定项之间的区别

sql - 如何按纬度和经度(Postgis)从表中选择多边形

sql - PostgreSQL 按两列排序,最后可为空

spring - 如何向 Spring MVC 添加自定义注释?

java - spring + Angularjs 不能改post放

java - 如何更好地管理多项 Activity