Поддержка Oracle и Access слоев данных в Java - PullRequest
2 голосов
/ 01 сентября 2011

Обратите внимание, что я искал и искал, но мне не удалось найти ответ.

Я пишу приложение Java, и мне нужно поддерживать базы данных Oracle и Access.В настоящее время у меня есть два класса, которые реализуют свою собственную версию Connect ().

OracleDatabase: IDatabase

AccessDatabase: IDatabase

Допустим, мне нужно создать таблицу с именем "mY_TABLE».Как мне поддержать оба типа баз данных?Я думал о чем-то вроде ...

IDatabase.Execute (IDatabase.GetCreateMyTableQuery ());

Я использую шаблон фабрики, чтобы выбрать реализацию базы данных. Проблема в том, что я не знаю, как хранить запросы.

Ответы [ 3 ]

1 голос
/ 01 сентября 2011

Я сделал нечто подобное: поддерживая Oracle и HSQLDB для модульных тестов.

Я использовал родительский класс с абстрактной защищенной функцией modifySql (String sqlText). Интерфейс будет вызывать функцию this перед выполнением команды или регистрацией подготовленного состояния, а класс-потомок HSQLDB будет соответствующим образом изменять текст SQL (например, изменять NUMBER на NUMERIC и т. Д.) Перед вызовом стандартных функций JDBC. Класс Oracle, очевидно, ничего не делает в функции.

Я стандартизировал приложение, используя Oracle SQL, затем изменил его для других типов (также запустил класс MySQL). Функция modifySQL может стать немного длинной, и вам в конечном итоге придется поменять местами текст для обработки последовательностей и т. Д., Но вскоре вы получите что-то выполнимое.

Помимо различных проблем с драйвером JDBC, это все, что мне нужно было сделать, чтобы обрабатывать базы данных точно так же, как в основном приложении. Таким образом, вам не нужно хранить множество разных форматов запросов для разных типов баз данных: и, очевидно, целесообразно, чтобы они были просто жестко запрограммированы в приложении.

0 голосов
/ 01 сентября 2011

Мы делаем это на работе. У нас есть собственный 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 будет работать лучше, но вам необходимо подтвердить поддержку данных. Вы также должны быть осторожны с поставщиками данных, когда речь идет о битовом уровне (32 против 64 бит) при работе с Access и / или Oracle. SQL гораздо более щадящий.

0 голосов
/ 01 сентября 2011

Вы можете сохранить его как окончательные строковые переменные в своем коде или в XML-файлах, например: http://nicodewet.com/2009/12/29/clean-code-store-native-sql-statements-in-external-file/ (или с использованием некоторых библиотек).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...