Программирование Java - Spring и JDBCTemplate - запрос Использования, queryForList или queryForRowSet?

Существует (большой) пример, записанный в Perl, включенном в источник Подрывной деятельности (это может быть просмотрено здесь ).

15
задан Adrian 2 November 2009 в 16:11
поделиться

3 ответа

Я считаю, что стандартный способ доступа к списку - это методы query () , а не какие-либо другие подходы. Основное различие между query и другими методами заключается в том, что вам необходимо реализовать один из интерфейсов обратного вызова (либо RowMapper , RowCallbackHandler , либо ResultSetExtractor ) для обработки набора результатов.

A RowMapper , вероятно, будет тем, что вы будете использовать большую часть времени. Он используется, когда каждая строка набора результатов соответствует одному объекту в вашем списке. Вам нужно реализовать только один метод mapRow , в котором вы заполняете тип объекта, который идет в вашей строке, и возвращаете его. Spring также имеет BeanPropertyRowMapper , который может заполнять объекты в списке путем сопоставления имен свойств bean-компонентов с именами столбцов (NB, этот класс предназначен для удобства, а не производительности).

A RowCallbackHandler ] более полезен, когда вам нужно, чтобы ваши результаты были чем-то большим, чем простой список. Вам придется самостоятельно управлять возвращаемым объектом, если вы используете этот подход. Я обычно использую это, когда мне нужна структура карты в качестве возвращаемого типа (например, для сгруппированных данных для древовидной таблицы или если я создаю собственный кеш на основе первичного ключа).

A ResultSetExtractor используется, когда вы хотите контролировать итерацию результатов. Вы внедряете единственный метод extractData , который будет возвращаемым значением вызова query . Я использую это только в том случае, если мне нужно создать некоторую пользовательскую структуру данных, которую сложнее построить с использованием любого из других интерфейсов обратного вызова.

Методы queryForList () ценны тем, что вы не делаете этого. Эти методы обратного вызова необходимо реализовать. Есть два способа использования queryForList. Во-первых, если вы запрашиваете только один столбец из базы данных (например, список строк), вы можете использовать версии метода, который принимает класс в качестве аргумента, чтобы автоматически предоставить вам список только объектов этих классов. .

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

На самом деле я никогда не видел, чтобы методы queryForRowSet широко использовались. Это загрузит весь результат запроса в объект CachedRowSet , замененный Spring SqlRowSet. Я вижу большой недостаток в использовании этого объекта в том, что если вы передаете SqlRowSet другим уровням вашего приложения, вы связываете эти уровни с вашей реализацией доступа к данным.

Вы не должны этого делать. Я не вижу огромных различий в производительности между этими вызовами, за исключением случаев, когда я упоминал о BeanPropertyRowMapper . Если вы работаете со сложной обработкой большого набора результатов, вы можете получить некоторый прирост производительности, написав оптимизированный ResultSetExtractor для вашего конкретного случая.

Если вы хотите узнать больше, я бы проконсультировался с Spring документацией JDBC и JavaDoc для упомянутых мной классов . Вы также можете взглянуть на некоторые книги по Spring Framework. Хотя он немного устарел Разработка Java с помощью Spring Framework имеет очень хороший раздел по работе с JDBC framework. Прежде всего, я бы посоветовал просто попробовать написать код для каждого метода и посмотреть, что лучше всего подходит для вас.

Вы также можете взглянуть на некоторые книги по Spring Framework. Хотя он немного устарел Разработка Java с помощью Spring Framework имеет очень хороший раздел по работе с JDBC framework. Прежде всего, я бы посоветовал просто попробовать написать код для каждого метода и посмотреть, что лучше всего подходит для вас.

Вы также можете взглянуть на некоторые книги по Spring Framework. Хотя он немного устарел Разработка Java с помощью Spring Framework имеет очень хороший раздел по работе с JDBC framework. Прежде всего, я бы посоветовал просто попробовать написать код для каждого метода и посмотреть, что лучше всего подходит для вас.

41
ответ дан 1 December 2019 в 00:33
поделиться

Поскольку вы находитесь в прекрасной стране Generics, возможно, вам действительно захочется использовать SimpleJdbcTemplate и его методы query () для Списки объектов и queryForObject () для отдельных объектов. Причина в том, что их даже проще использовать, чем те, что в JdbcTemplate .

3
ответ дан 1 December 2019 в 00:33
поделиться

Одно небольшое дополнение к превосходным ответам выше: дополнительные методы, такие как queryForInt, queryForLong, queryForMap, queryForObject и т. Д., Иногда могут показаться хорошими вариантами, если вы выполняете простой запрос и ожидаете одну строку.

Однако, если бы вы могли вернуть 0 или 1 строку, метод queryForList, как правило, проще, иначе вам пришлось бы перехватывать IncorrectResultSizeDataAccessException. Я узнал это на собственном горьком опыте.

2
ответ дан 1 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: