java - 将 SQL 和绑定(bind)数据转换为直接 SQL

标签 java sql oracle jdbc

我有一个自定义 Java 查询引擎,它生成一个 SQL 字符串(使用 ? 作为数据占位符)和一个包含要绑定(bind)到占位符的数据的对象列表。然后将其传递给 JDBCTemplate.queryForList(sql, bindings.toArray()) API 以生成结果集。

这工作正常,但我还需要在子查询中使用此 SQL,并且无法找到一种(简单的方法)将此 SQL 转换为直接 SQL(使用 Java 类型和数据库友好格式之间的正确数据库转换,等)。

是否有实用程序可以执行此操作?

最佳答案

您可能想查看以下实用程序。
http://commons.apache.org/dbutils/

虽然这不会直接回答您的问题,但它将来可能会有用。我也遇到了这个问题,我设计了一种对我有用的方法,尽管不是最好的。我创建了一个方法,可以按照您的建议自动填充参数值,但它根本不以类型安全的方式执行此操作。无论如何,如果您决定使用该方法,也许您可​​以采用该方法并对其进行改进:

public static String preparedQueryString(String staticQuery, Object... parameters) {
    for(Object curParameter : parameters) {
        if(curParameter instanceof String) {
            staticQuery = staticQuery.replaceFirst("\\?", "'" + curParameter.toString() + "'");
        } else {
            staticQuery = staticQuery.replaceFirst("\\?", curParameter.toString());
        }

    return staticQuery;
}

您可能还想添加代码以确保参数的数量不超过问号的数量,并且您可能还想使 java 类型更适合您使用的数据库。我用它来输出PreparedStatement的SQL,因为PreparedStatement没有任何好的功能可以让您在设置适当的参数后撕掉完成的SQL查询。

希望这有帮助,

关于java - 将 SQL 和绑定(bind)数据转换为直接 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5011570/

相关文章:

java - Swing - 在同一按钮上管理多个监听器链

java - Mockito 超时验证在并发执行时意外失败

java - 将 ListView 的数据从 Asynctask 传递到自定义列表适配器类

java - 在 Swing 中显示 XHTML (JEditorPane)

mysql - 在 MySQL 中删除带有外键的列

sql - ORA-00918 : column ambiguously defined

oracle - ORA-00054: 资源繁忙并指定 NOWAIT 或超时已过期

c++ - C++平台上的ADO可以用来查询一定范围的记录吗?例如。每个查询 100 条记录?

java - 使用 JPA Criteria API 生成正确和/或条件

java - 如何管理表行中的连续列值