【问题标题】:SQL Statements Extractor in Java classJava 类中的 SQL 语句提取器
【发布时间】:2020-07-01 12:53:13
【问题描述】:

我有很多连接 Oracle 数据库并执行 DML 命令的 Java 组件。 我查找使用哪个 Oracle 对象的 Java 模块。

我想提取 SQL 语句,但语句多种多样。

例如;

StringBuilder or StringBuffer named sb
sb.append("select * from oracle_table");
sb.append("inner join oracle_table2");
(PreparedStatement p).executeQuery(sb);

或单个字符串变量中的所有 sql 语句。 或休眠。

像这个选择语句一样有更新、删除、插入语句。

所以我想找到最终连接的 SQL 语句。也许那时我可以找到使用哪个 Oracle 对象的 Java 模块。

此操作是否有插件、ide、应用程序、工具、java或其他语言代码等?

【问题讨论】:

    标签: java sql parsing extract


    【解决方案1】:

    有几种方法可以做到这一点。您可以使用定义查询的 String 对象并仅在相关类中定义它们,这可能无法维护。另一种选择是使用枚举来强制不变性,但这也会很快变得无法维护。正如您所说,另一个选择是 Hibernate,它可以解决您的问题,但会增加一层复杂性和难度,因此存在学习曲线。一个简单的选项是在属性或 JSON 等文件类型中简单定义查询。

    属性

    query.user.select = SELECT * FROM user WHERE name = ?;
    

    JSON

    [
        {
            "name": "user.select",
            "query": "SELECT * FROM user WHERE name = ?;"
        }
    ]
    
    class NamedQuery {
    
        private final String name;
    
        private final String query;
    
    }
    

    然后你可以创建一些由这些 NamedQuery 对象组成的不可变类。

    class QueryService {
    
        // use ImmutableSet to enforce immutability
        private final Set<NamedQuery> queries;
    
        // constructor (create from JSON file using GSON for example)
        public QueryService(Set<NamedQuery> queries) {
            this.queries = queries;
        }
    
        public NamedQuery get(String name) {
            // get for name, could even use a Map for faster lookup if needed
        }
    
    }
    

    【讨论】:

    • 我有数千个 Java 类和查询。我不想手动找到这个。我也不为此操作运行此代码。我想离线扫描文件。
    • 如果是这种情况,研究 JOOQ 或 Hibernate 可能对您最有利。
    • 感谢您的回答,但有没有人有其他想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2013-02-08
    • 2020-09-22
    相关资源
    最近更新 更多