请注意我搜索过并搜索过,但我找不到答案。
我正在编写Java应用程序,我需要同时支持Oracle和Access数据库。我目前有两个类实现他们自己的Connect()版本。
OracleDatabase:IDatabase
AccessDatabase:IDatabase
假设我需要创建一个名为“MY_TABLE”的表。我将如何支持这两种数据库类型?我想到了类似......
IDatabase.Execute(IDatabase.GetCreateMyTableQuery());
我正在使用工厂模式来选择数据库实现。 问题是我不知道如何存储查询。
答案 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更宽容。