Шаблон для обнаружения небезопасных / неправильных запросов во время компиляции - PullRequest
1 голос
/ 16 декабря 2008

Моя команда разрабатывает большое Java-приложение, которое активно запрашивает базу данных MySQL (в разных классах и модулях). Я хотел бы знать, есть ли шаблон, который позволяет мне получать уведомления во время компиляции, если есть запросы, которые ссылаются на неправильную структуру таблицы (например, если я удаляю или добавляю поле в таблицу, а строка запроса ссылается на это), чтобы предотвратить ошибки во время выполнения. Это должно работать и для запросов JOIN.

Ответы [ 3 ]

1 голос
/ 10 февраля 2009

Querydsl аналогичен LiquidForm и поддерживает как бэкэнды на основе JPA / Hibernate, так и SQL.

Для версии на базе SQL мы в настоящее время поддерживаем MySQL (5.? Протестировано), Oracle (10g протестировано) и HSQLDB.

В двух словах такой запрос

select count(*) from test where name = null

станет

long count = query.from(test).where(test.name.isnull()).count();

Querydsl SQL использует генерацию кода для отражения схем SQL в классах Java.

0 голосов
/ 16 декабря 2008

Существует инструмент с открытым исходным кодом под названием DODS (Data Object Design Studio), который может делать то, что вы хотите. Инструмент DODS изначально был частью проекта сервера приложений Java Enhydra, и с тех пор, как компания, поддержавшая этот проект, в 2002 году перешла на kablooey, DODS размещалась и поддерживалась на ObjectWeb. Во всяком случае, это с открытым исходным кодом (LGPL).

http://forge.objectweb.org/projects/dods

Концепция заключается в том, что вы описываете свою схему в файле XML, а DODS генерирует классы Java POJO, с помощью которых вы можете запрашивать таблицы базы данных и манипулировать ими. Конечно, каждый раз, когда вы меняете свою схему, вам нужно снова запускать DODS, чтобы заново генерировать классы ORM и перекомпилировать ваше приложение для них.

Но в результате этого, если таблица или столбец исчезают, а ваше приложение запрашивает метаданные базы данных, которых больше не существует, вы получаете ошибку времени компиляции, потому что ваш код теперь вызывает соответствующий класс или метод, который больше не существует.

0 голосов
/ 16 декабря 2008

Я бы сказал, что простой ответ - «нет». Более полный ответ «да, в некоторой степени», в зависимости от вашей готовности прыгать через обручи.

Если у вас нет java-представления вашей схемы базы данных, вы никогда не сможете получать уведомления во время компиляции, если ваши запросы неверны (эти классы могут быть сгенерированы). Кроме того, вы должны использовать эти классы для построения ваших запросов, поэтому метод, который вы используете сегодня (строки запросов), следует отказаться. Чтобы иметь возможность использовать Java-классы для построения ваших запросов, вы также должны использовать хитрости. LiquidForm использует необходимые приемы для построения запросов JPA, но я не видел подобной библиотеки для построения запросов SQL (LiquidForm является новой и довольно блестящей). Вы бы на самом деле должны были создать подобную библиотеку самостоятельно. Итак, как вы видите, получение предупреждений времени компиляции при построении SQL сложно, но не невозможно (только практически невозможно). Но даже если вы сможете создать то, что я предлагаю, ваше представление схемы Java должно быть обновлено сразу после изменения схемы, поэтому генерация классов Java должна быть встроена в вашу среду IDE или инструмент сборки.

Я бы посоветовал вам иметь хорошие модульные тесты, которые будут замечать, когда ваши запросы становятся недопустимыми в результате изменения схемы. Это самый распространенный способ добиться того, чего вы хотите. Кроме того, если вы решите «обновить» до JPA, вы можете использовать LiquidForm, чтобы получить то, что вы хотите.

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