Стратегия сопоставления результатов SQL с объектами Java

Я использую JDBC (и jdbcTemplate spring-jdbc) для доступа к моей базе данных в веб-приложении Java. У меня много разных разных запросов, некоторые из которых я присоединяюсь к таблице там, один с подзапросом, другой с использованием группы здесь и т. д. и т. д.

Часто мне нужен результат только для отображения конкретной таблицы, созданной JSP, поэтому я могу просто использовать удобный метод queryForList, который возвращает List<Map<String, Object>>, список, каждая строка которого представлена ​​картой, которая сопоставляет имена столбцов со значениями. В JSP это просто отлично, в любом случае нет проверки типа во время компиляции, нет завершения кода для свойств с помощью eclipse и т. д.

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

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

Как лучше всего поступить в этой ситуации? Просто написать эти чертовы объекты? Или есть лучший способ?


person yankee    schedule 23.07.2011    source источник


Ответы (2)


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

Вы хотите, чтобы компилятор понял вашу объектную модель, поэтому (по крайней мере, в Java) вам нужно будет ее создать, я боюсь.

Достойная IDE предоставит вам возможность генерировать методы get/set из переменных-членов, что может сэкономить время. Если объектная модель существует исключительно для применения некоторой семантики к запросам JDBC, а не для бизнес-логики, возможно, уместны общедоступные члены, что позволяет избежать необходимости в геттерах и сеттерах в стиле J2EE Передача объекта. Просто следите за бизнес-логикой и не забывайте о equals() и hashCode().

Однако в Spring JDBC доступна некоторая помощь для выполнения сопоставления с вашими объектами, например RowMapper и MappingSqlQuery. Вы также можете ознакомиться с платформами объектно-реляционного сопоставления, такими как Spring ORM чтобы избавить себя от некоторых усилий. Я думаю, что эти подходы экономят время при написании кода перевода в SQL и обратно, управлении транзакциями и схеме базы данных — нам все еще нужно создать объектную модель.

person brabster    schedule 23.07.2011
comment
Ладно, хорошо. Я думаю, я буду писать объекты, чем. Я боялся, что отойду от любой приличной дизайнерской структуры. Но ваши рассуждения имеют смысл... Спасибо :-). - person yankee; 25.07.2011

Как упоминал Брабстер, RowMapper и MappingSQLQuery помогут вам преобразовать ваши наборы результатов sql в объекты. Но я понимаю, что вас беспокоит то, что вы не всегда извлекаете целые объекты из запросов, а иногда извлекаете комбинацию объектов (выполняя соединения sql).

Итак, если я правильно понимаю, вам в основном интересно, придется ли вам создавать классы и для каждой из этих комбинаций объектов?

Простой ответ: нет, вам не нужно создавать собственные классы для каждого типа запроса на соединение, но при отсутствии надлежащего ORM вам придется предоставить RowMappers для каждого типа соединения (обратите внимание, что M в ORM означает отображение ). Поскольку среда JDBC Spring не является ORM, она просит вас предоставить логику сопоставления для каждого запроса. Если это звучит слишком сложно, добро пожаловать в мир ORM :)

person Tahir Akhtar    schedule 23.07.2011
comment
Ну, я использовал реальный ORM (Hibernate) в других проектах, но в этом проекте я слишком зависим от прямого SQL ;-). Конечно, мне не нужны дополнительные классы только для дополнительного соединения, но как насчет группировки по + агрегатным функциям... - person yankee; 25.07.2011
comment
Я сам не использовал его, но вы можете проверить MyBatis. Там ваши собственные слова: чтобы использовать средство отображения данных MyBatis, вы полагаетесь на свои собственные объекты, XML и SQL. Мало что можно узнать из того, что вы еще не знаете. С MyBatis Data Mapper вы получаете всю мощь как SQL, так и хранимых процедур. - person Tahir Akhtar; 25.07.2011