支持Java中的Oracle和Access数据层

时间:2011-08-31 22:09:03

标签: java sql database oracle ms-access

请注意我搜索过并搜索过,但我找不到答案。

我正在编写Java应用程序,我需要同时支持Oracle和Access数据库。我目前有两个类实现他们自己的Connect()版本。

OracleDatabase:IDatabase

AccessDatabase:IDatabase

假设我需要创建一个名为“MY_TABLE”的表。我将如何支持这两种数据库类型?我想到了类似......

IDatabase.Execute(IDatabase.GetCreateMyTableQuery());

我正在使用工厂模式来选择数据库实现。 问题是我不知道如何存储查询。

3 个答案:

答案 0 :(得分:1)

我做了类似的事情:支持Oracle和HSQLDB进行单元测试。

我使用了带有抽象保护函数modifySql(String sqlText)的父类。接口在执行命令或注册preparedStatement之前调用this函数,后代HSQLDB类会在调用标准JDBC函数之前相应地更改SQL文本(比如将NUMBER更改为NUMERIC等)。 Oracle类显然在函数中什么都不做。

我使用Oracle SQL对应用程序进行了标准化,然后将其更改为其他类型(还启动了MySQL类)。 modifySQL函数可能会有点冗长,你最终必须交换文本来处理序列等,但你很快就会得到一些可行的东西。

除了不同的JDBC驱动程序问题之外,我只需要在主应用程序中以完全相同的方式处理数据库。通过这种方式,您不必为不同的数据库类型存储大量不同的查询格式:将它们简单地硬编码到应用程序中显然是可行的。

答案 1 :(得分:0)

您可以将其存储为代码中的最终字符串变量,或者存储在xml文件中,如下所示:http://nicodewet.com/2009/12/29/clean-code-store-native-sql-statements-in-external-file/(或使用某些库)。

答案 2 :(得分:0)

我们在工作中这样做。我们有自己的自定义DAL并支持Access,SQL和Oracle。我们使用多种形式的查询,但您关注的问题是我们将它们存储在XML文件中。根据您的编写方式,查询将决定您的难度。下面是如何存储要检索的查询的示例。

<Command ID = "3">
<Provider = "Default">
<QueryText>
   Select * from MyTable
</QueryText>
</Provider>
<Provider = "Oracle">
<QueryText>
   Select * from dual
</QueryText>
</Provider>
<Command>

然后,当您在应用程序中运行查询时 - 您可以根据提供商调用文本。如果您需要提供程序的自定义查询 - 您的代码应该能够提取正确的节点。

最简单的方法是使用IDB通用接口实现它,然后根据需要进行转换。

以下是对如何实现这一目标的一个很好的解释。

http://stevencalise.wordpress.com/2009/10/16/constructing-a-dal-in-c/

所有这一切都说明这取决于你需要多少控制你的DAL。在某些情况下,ORM工具可以更好地工作 - 但您需要确认数据支持。在使用Access和/或Oracle时,在涉及位级别(32位与64位)时,还必须小心数据提供程序。 SQL更宽容。