Существует (большой) пример, записанный в Perl, включенном в источник Подрывной деятельности (это может быть просмотрено здесь ).
Я считаю, что стандартный способ доступа к списку - это методы 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. Прежде всего, я бы посоветовал просто попробовать написать код для каждого метода и посмотреть, что лучше всего подходит для вас. Поскольку вы находитесь в прекрасной стране Generics, возможно, вам действительно захочется использовать SimpleJdbcTemplate
и его методы query ()
для Списки
объектов и queryForObject ()
для отдельных объектов. Причина в том, что их даже проще использовать, чем те, что в JdbcTemplate
.
Одно небольшое дополнение к превосходным ответам выше: дополнительные методы, такие как queryForInt, queryForLong, queryForMap, queryForObject и т. Д., Иногда могут показаться хорошими вариантами, если вы выполняете простой запрос и ожидаете одну строку.
Однако, если бы вы могли вернуть 0 или 1 строку, метод queryForList, как правило, проще, иначе вам пришлось бы перехватывать IncorrectResultSizeDataAccessException. Я узнал это на собственном горьком опыте.