【问题标题】:is JDBC code tied for single database type?JDBC 代码是否与单一数据库类型相关联?
【发布时间】:2014-07-25 13:56:36
【问题描述】:

考虑这种情况:在开发期间,我想使用MySQL,而在生产中我将使用derby

要获得连接,我有这个来自java tutorial 的方法:

public Connection getConnection() throws SQLException {

    Connection conn = null;
    Properties connectionProps = new Properties();
    connectionProps.put("user", this.userName);
    connectionProps.put("password", this.password);

    if (this.dbms.equals("mysql")) {
        conn = DriverManager.getConnection(
                   "jdbc:" + this.dbms + "://" +
                   this.serverName +
                   ":" + this.portNumber + "/",
                   connectionProps);
    } else if (this.dbms.equals("derby")) {
        conn = DriverManager.getConnection(
                   "jdbc:" + this.dbms + ":" +
                   this.dbName +
                   ";create=true",
                   connectionProps);
    }
    System.out.println("Connected to database");
    return conn;
}

这里还有一些涉及查询数据库 (again from java tutorial) 的代码:

public static void viewTable(Connection con, String dbName)
    throws SQLException {

    Statement stmt = null;
    String query = "select COF_NAME, SUP_ID, PRICE, " +
                   "SALES, TOTAL " +
                   "from " + dbName + ".COFFEES";
    try {
        stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {
            String coffeeName = rs.getString("COF_NAME");
            int supplierID = rs.getInt("SUP_ID");
            float price = rs.getFloat("PRICE");
            int sales = rs.getInt("SALES");
            int total = rs.getInt("TOTAL");
            System.out.println(coffeeName + "\t" + supplierID +
                               "\t" + price + "\t" + sales +
                               "\t" + total);
        }
    } catch (SQLException e ) {
        JDBCTutorialUtilities.printSQLException(e);
    } finally {
        if (stmt != null) { stmt.close(); }
    }
}

我想知道是否需要根据我在后端使用的数据库来更改查询结构。 例如,MySQLPostgreSql 似乎在查询中有一些 key differences。 (在上面的例子中它可能没有任何区别)。

我有 django 框架背景,其中ORM 旨在处理任何类型的数据库。相同的代码适用于任何插入的数据库。

【问题讨论】:

  • 我认为这里的主要误解是 JDBC 不是 ORM。它只是抽象数据库访问,而不是查询它。为此,您需要一个“更高级别”的抽象,例如 JPA/Hibernate,它允许您使用 JPQL 等伪 SQL 语言编写独立于数据库的查询。
  • @mabi:感谢您的评论,有道理,思路清晰

标签: java mysql postgresql jdbc


【解决方案1】:

由于您在使用 JDBC 时直接编写 SQL 语句,因此这些语句本质上与您使用的数据库相关联。解决此问题的唯一方法是仅使用所有目标数据库都支持的 SQL 结构。没有什么可以使您免受数据库之间的差异的影响。

【讨论】:

    【解决方案2】:

    您的代码可以同时包含与 DB 无关的部分和与 DB 相关的部分。

    与数据库相关的部分:JDBC URL、SQL 语句(语法)通常与数据库相关。通过一些努力,可以编写所有数据库都能识别的 SQL 语法,但这可能并非在所有情况下都可行。

    与数据库无关的部分:用于获取连接、运行语句、管理连接、创建数据源、连接池等的 Java 代码(据我认为)对所有数据库都是通用的符合 JDBC 的系统。

    严格来说,“JDBC”代码大多独立于数据库。每个数据库的变化是语句语法(但 JDBC 并没有首先指定语法)

    【讨论】:

      【解决方案3】:

      我同意其他发帖者的观点,如果您使用标准 sql,那么切换数据库供应商应该很简单。

      有很多创建标准 sql 的 ORM 和映射器。我最喜欢的是sormula(我是作者)。我最近在一个使用 sormula 的项目上工作,其中测试服务器使用 HSQLDB,生产服务器使用 PostgreSQL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        相关资源
        最近更新 更多