Дата Java - вставка в базу данных

Мне нужно выяснить способ вставки записи с полем java.util.Date в базу данных, и я застрял.

Кто-нибудь знает, как я могу это сделать? Прямо сейчас у меня есть что-то вроде.

        java.util.Date myDate = new java.util.Date("01/01/2009");

        sb.append("INSERT INTO USERS");
        sb.append("(USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE) ");
        sb.append("VALUES ( ");
        sb.append("  '" + userId + "'");
        sb.append(", '" + myUser.GetFirstname() + "' ");
        sb.append(", '" + myUser.GetLastname() + "' ");
        sb.append(", '" + myUser.GetSex() + "' ");
        sb.append(", '" + myDate  + "'");
        sb.append(")");

        Util.executeUpdate(sb.toString());

Но когда я запускаю что-то вроде этого, я получаю ошибку:   Синтаксис строкового представления значения datetime неверен.

Вот как выглядит выражение sql:

INSERT INTO USERS (USER_ID
    , FIRST_NAME
    , LAST_NAME
    , SEX
    , CRDATE) 
VALUES (   
    'user'
    , 'FirstTest' 
    , 'LastTest' 
    , 'M'
    , 'Thu Jan 01 00:00:00 CST 2009')

Спасибо

Ответы

Ответ 1

Конечно, PreparedStatement сделает ваш код лучше, но для ответа на ваш вопрос вам нужно сообщить СУБД формат строкового представления даты. В Oracle (вы не называете поставщика базы данных) строковая дата преобразуется в Date с помощью функции TO_DATE():

INSERT INTO TABLE_NAME(
  date_column
)values(
  TO_DATE('06/06/2006', 'mm/dd/yyyy')
)

Ответ 2

Прежде чем ответить на ваш вопрос, я хотел бы упомянуть, что вам следует, вероятно, изучить использование какого-либо решения ORM (например, Hibernate), завернутого за уровень доступа к данным. То, что вы делаете, кажется очень анти-OO. Я, по общему признанию, не знаю, как выглядит остальная часть вашего кода, но, как правило, если вы начнете видеть, что используете много уроков, вы, вероятно, слишком структурируете подход.

Чтобы ответить на ваш вопрос, как упомянули другие, просмотрите java.sql.PreparedStatement и используйте java.sql.Date или java.sql.Timestamp. Что-то вроде (как можно больше использовать свой исходный код, возможно, вы захотите изменить его еще больше):

java.util.Date myDate = new java.util.Date("10/10/2009");
java.sql.Date sqlDate = new java.sql.Date(myDate.getTime());

sb.append("INSERT INTO USERS");
sb.append("(USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE) ");
sb.append("VALUES ( ");
sb.append("?, ?, ?, ?, ?");
sb.append(")");

Connection conn = ...;// you'll have to get this connection somehow
PreparedStatement stmt = conn.prepareStatement(sb.toString());
stmt.setString(1, userId);
stmt.setString(2, myUser.GetFirstName());
stmt.setString(3, myUser.GetLastName());
stmt.setString(4, myUser.GetSex());
stmt.setDate(5, sqlDate);

stmt.executeUpdate(); // optionally check the return value of this call

Еще одно преимущество этого подхода состоит в том, что он автоматически ускользает от ваших строк для вас (например, если бы вы вставляли кого-то с фамилией "O'Brien", у вас были бы проблемы с вашей исходной реализацией).

Ответ 3

PreparedStatement

Вы должны обязательно использовать PreparedStatement. (Tutorial)

Таким образом вы можете вызвать:

pstmt.setDate( 1, aDate );

Драйвер JDBC будет обрабатывать дату-время, подходящую для вашей конкретной базы данных.

Кроме того, PreparedStatement останавливает любые попытки SQL injection - очень важно! (юмор)

Он должен выглядеть так:

SimpleDateFormat format = new SimpleDateFormat( "MM/dd/yyyy" );  // United States style of format.
java.util.Date myDate = format.parse( "10/10/2009" );  // Notice the ".util." of package name.

PreparedStatement pstmt = connection.prepareStatement(
"INSERT INTO USERS ( USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE ) " +
" values (?, ?, ?, ?, ? )");

pstmt.setString( 1, userId );
pstmt.setString( 3, myUser.getLastName() ); 
pstmt.setString( 2, myUser.getFirstName() ); // please use "getFir…" instead of "GetFir…", per Java conventions.
pstmt.setString( 4, myUser.getSex() );
java.sql.Date sqlDate = new java.sql.Date( myDate.getTime() ); // Notice the ".sql." (not "util") in package name.
pstmt.setDate( 5, sqlDate ); 

И что он, драйвер JDBC создаст для вас правильный синтаксис SQL.

Получение

При извлечении объекта Date вы можете использовать SimpleDateFormat для создания форматированного строкового представления значения даты и времени.

Вот одна быстрая строка примера, но поиск StackOverflow для многих других.

String s = new SimpleDateFormat("dd/MM/yyyy").format( aDate ); 

Ответ 4

Ответ от OscarRyz правильный, и должен был быть принятым ответом. Но теперь этот ответ устарел.

java.time

В Java 8 и более поздних версиях мы имеем новый пакет java.time (вдохновленный Joda-Time, определяемый JSR 310, с tutorial, расширенный ThreeTen-Extra проект.)

Избегать старых классов времени

Старый класс java.util.Date/.Calendar, SimpleDateFormat и java.sql.Date - путаница. Во-первых, j.u.Date имеет дату и время суток, в то время как j.s.Date - это дата-только без времени суток. О, за исключением того, что j.s.Date только притворяется, что у него нет времени. В качестве подкласса j.u.Date j.s.Date наследует время суток, но автоматически корректирует это время суток до полуночи (00:00:00.000). Смешение? Да. Плохо взломать, честно говоря.

По этой и многим другим причинам следует избегать тех старых классов, которые используются только в крайнем случае. Используйте java.time, где это возможно, с Joda-Time в качестве резервной копии.

LocalDate

В java.time класс LocalDate чисто представляет значение только для даты без какого-либо времени или часового пояса, Это то, что нам нужно для решения этих вопросов.

Чтобы получить этот объект LocalDate, мы проанализируем входную строку. Но вместо использования старого класса SimpleDateFormat, java.time предоставляет новый класс DateTimeFormatter в пакет java.time.format.

String input = "01/01/2009" ;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM/dd/yyyy" ) ;
LocalDate localDate = LocalDate.parse( input, formatter ) ;

Драйверы JDBC, совместимые с JDBC 4.2 или более поздние версии могут напрямую использовать типы java.time с помощью методов PreparedStatement::setObject и ResultSet::getObject.

PreparedStatement pstmt = connection.prepareStatement(
    "INSERT INTO USERS ( USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE ) " +
    " VALUES (?, ?, ?, ?, ? )");

pstmt.setString( 1, userId );
pstmt.setString( 3, myUser.getLastName() ); 
pstmt.setString( 2, myUser.getFirstName() ); // please use "getFir…" instead of "GetFir…", per Java conventions.
pstmt.setString( 4, myUser.getSex() );
pstmt.setObject( 5, localDate ) ;  // Pass java.time object directly, without any need for java.sql.*. 

Но пока у вас нет такого обновленного драйвера JDBC, отмените использование класса java.sql.Date. К счастью, этот старый класс java.sql.Date был одарен Java 8 новым удобным статическим методом преобразования, valueOf( LocalDate ).

В примере кода sibling Answer by OscarRyz, замените его строку "sqlDate =" следующим образом:

java.sql.Date sqlDate = java.sql.Date.valueOf( localDate ) ;

Ответ 5

если вы используете mysql.., вы можете сохранить дату как "2009-12-31", например.

update person set birthday_date = '2009-12-31'

но я предпочитаю использовать jdbc, хотя вам нужно создать java.sql.Date...

* Дата - вид зла в этом мире...:)

Ответ 6

Используйте подготовленные инструкции, у них есть методы для установки правильных параметров для каждого родного типа Java.

Посмотрите на api для setDate и примеры

Ответ 7

Вы должны использовать java.sql.Timestamp вместо java.util.Date. Также использование PreparedStatement избавит вас от беспокойства о форматировании.

Ответ 8

pst.setDate(6, new java.sql.Date(txtDate.getDate().getTime()));

это код, который я использовал для сохранения даты в базе данных, используя jdbc, отлично подходит для меня

  • pst - переменная для подготовленного состояния
  • txtdate - имя JDateChooser

Ответ 9

вы можете использовать этот код, дата и время 24 часа

INSERT INTO TABLE_NAME(
  date_column
)values(
  TO_DATE('2016-10-05 10:53:56', 'SYYYY-MM-DD HH24:MI:SS')
)

Ответ 10

VALUES ('"+user+"' , '"+FirstTest+"'  , '"+LastTest+"'..............etc)

Вы можете использовать его для вставки переменных в запрос sql.