java - 使用 JDBC 创建数据库模式的模式

标签 java sql design-patterns jdbc

我有一个 Java 应用程序,它使用 JDBC 将数据从遗留文件格式加载到 SQLite 数据库中。如果指定的数据库文件不存在,则应该创建一个新文件。目前,数据库的模式在应用程序中是硬编码的。我宁愿将它作为 SQL 脚本放在单独的文件中,但显然没有简单的方法通过 JDBC 执行 SQL 脚本。有没有其他方法或模式可以实现这样的目标?

最佳答案

您的句子 “现在有一种通过 JDBC 执行 SQL 脚本的简便方法” 让我困惑了一分钟,但我认为您是在说没有 简单的方法"。 :)

根据其他人的说法,是的......完美的世界场景是使用 ORM 工具,比如 Hibernate,但我也理解当你在工作中处理遗留问题时,你的团队可能不想花太多时间重构该项目。

我同意您应该将数据库模式重构到一个单独的文件中。您实际上可以使用 JDBC 执行 SQL 脚本。当我运行某些测试用例时,我总是这样做。

这是我的做法。在我的案例中,我使用 SQL Server 数据库。因此,您需要调整代码以满足您的需求。

String ddl = ... // load your SQL script file into this string
String delimiter = "GO"; // in my case, SQL Server uses GO as delimiter, you use whatever you want here.


private void executeDDL(String ddl, String delimiter) {
    Connection con = null;

    try {
        con = ... // get the connection

        // enable transaction
        con.setAutoCommit(false);

        Statement statement = con.createStatement();

        // for every DDL statement, execute it
        for (String sql : ddl.split(delimiter)) {
            if (StringUtils.isNotBlank(sql)) {
                statement.executeUpdate(sql);
            }
        }

        statement.close();
        con.commit();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        try {
            con.close();
        }
        catch (Exception ignored) {
        }
    }
}

关于java - 使用 JDBC 创建数据库模式的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2911806/

相关文章:

使用左连接时 MySQL 限制 "main"结果?

oop - 派生类中的额外公共(public)方法?

c# - 针对此问题的适当设计/设计模式?

java - 比较时间戳时的 Firestore 查询问题

SQL Guid 主键连接性能

sql - 单个变量由存储过程中的字符数组成?

laravel - 什么是 Laravel 特征模式?

java - Selenium 3.3.1 独立 Jar

java - 超过锁定等待超时;尝试重启事务

java - 为什么 JPA 对于 @ManyToOne 关系默认使用 FetchType EAGER