【问题标题】:Multiple database support in Java ApplicationJava 应用程序中的多数据库支持
【发布时间】:2013-12-30 09:23:17
【问题描述】:

我有一个 Java Web 应用程序,它目前支持 DB2 和 Oracle 作为后端数据库。我也计划支持 MySQL,因此面临这个问题。

到目前为止,我一直在代码本身中对查询进行硬编码,并在必要时为 Oracle 和 DB2 不同的查询设置 if-else 条件。

例如。为了让前 10 名员工获得高薪,我必须像这样编写代码

String query = null;
if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("oracle"))
{
    query = "select * from ( select * from emp order by sal desc ) where ROWNUM <= 5";
}
else if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("db2"))
{
    query = "select * from emp order by sal desc fetch first 5 rows only";
}

如果我添加 Mysql,if-else 条件会变大并且变得混乱。

if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("oracle"))
{
    query = "select * from ( select * from emp order by sal desc ) where ROWNUM <= 5";
}
else if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("db2"))
{
    query = "select * from emp order by sal desc fetch first 5 rows only";
}
else if(DatabaseUtil.getDatabaseName().equalsIgnoreCase("mysql"))
{
    query = "select * from emp order by sal desc limit 0,5";
}

您认为有什么办法可以解决这个问题。 Hibernate/JPA可以解决这个问题吗?

我尝试过的事情

1) 编写了一个工厂设计模式来进行基于接口的查询选择。只需调用 Interface.getHighSalEmployees(),它就会根据加载的驱动程序返回具体类实现的查询。也就是说如果应用程序连接到Oracle,它会给我OracleConcreteClass.getHighSalEmployees()

2) 阅读有关 Hibernate/HQL 的信息 - 但无法找到任何可能的内容。

【问题讨论】:

    标签: java sql hibernate jpa


    【解决方案1】:

    您可以指定使用 Hibernate 时要使用的方言。您可以在https://github.com/hibernate/hibernate-orm/tree/master/hibernate-core/src/main/java/org/hibernate/dialect 中找到 Hibernate 方言列表。例如,有Oracle10gDialectH2DialectMySQL5Dialect

    您也可以根据需要创建自己的方言。

    如果您只使用 HQL 或 JP QL(并且从不直接发出本机查询),您应该能够删除您的 if - else 条件。在您的应用程序启动时,您的代码需要在创建持久化上下文时选择正确的 JDBC 驱动程序和 Hibernate 方言。

    如果您在应用程序中使用多个数据库,您应该能够创建具有不同方言的多个持久性上下文。

    【讨论】:

      【解决方案2】:

      据我所知,您的问题完全符合在数据库和 Java 逻辑之间使用 ORM 的想法。这个想法是在您的数据库表、视图等之上构建 Hibernate(即实现)实体,并将特定底层 DB 语法中查询、更新等的构建委托给 ORM。

      当您部署应用程序时,您应该使用其配置文件来实例化正确的 JDBC 驱动程序和 Hibernate 配置,以及配置文件中的所有内容,因此您永远不必更改您的逻辑。一旦您完成了这项工作,将您的应用程序移植到您可以想象的任何其他 RDBM 将是微不足道的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多