Ответ 1
Хорошо, поэтому, прочитав всю информацию на всех ответах, а также другие сообщения, на которые указывают комментарии и т.д., я решил обобщить то, что узнал:
Настройка:
Из того, что я вижу, есть три слоя
JDBC wrapper calls (e.g. Spring SimpleJdbcTemplate)
|
|
Raw JDBC calls (e.g. PreparedStatement)
|
|
JDBC driver (e.g. Oracle)
Первый Причина
Многие обертки класса JDBC, такие как Spring известный SimpleJdbcTemplate
, позволили вам дать ему Map<String, Object>
как карту аргументов при выполнении инструкции SQL. Это удивительно просто, поскольку он передает все преобразования из объектов в соответствующие типы java.sql.*
, когда он использует необработанный JDBC под капотом. Первая проблема здесь: что произойдет, если у вас есть следующее:
Map<String, Object> paramMap = new HashMap<String,Object>();
paramMap.put("p_some_data", new java.util.Date());
Что делает Spring конвертировать его? A java.sql.Date
? A java.sql.Timestamp
? A java.sql.Time
? Или он даже отбрасывает его на java.lang.Object
? Как объяснил @BalusC в этот ответ на другой вопрос и другой человек здесь, существуют большие различия между этими тремя типами java.sql
. Итак, первая причина не использовать java.util.Date
: вы не можете полагаться на внутреннее соглашение рамки для обработки преобразования для вас.
Второй разум
Теперь, говоря о необработанных вызовах JDBC, @Nail объяснил, что вам нужны эти типы java.sql
для вызова JDBC, а он абсолютно прав, который для меня был новостью. Тем не менее, по-прежнему существует страшный вызов setObject
. Из чтения JavaDoc для этого вызова кажется немного неопределенным в отношении того, что он будет делать, если дать java.util.Date
. Таким образом, вторая причина не использовать его из-за двусмысленности там.
Третий разум
Наконец, поговорим об уровне драйвера. Я могу подтвердить с личным опытом, что иногда Spring в сочетании с драйвером Oracle работает с java.util.Date
. Иногда. И иногда это не так. Поэтому, поскольку я не знаю, как любая конкретная версия любого конкретного драйвера будет обрабатывать java.util.Date
, лучше всего быть явным. Это третья причина.
Заключение
В общем, похоже, что причина: "JDBC не предполагается использовать с java.util.Date
. Если вы это сделаете, вы не можете быть уверены, что произойдет". Это для меня достаточно хорошая причина:)