Выполните следующие шаги:
Откройте catalina.sh
из tomcat / bin.
Измените JAVA_OPTS на
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m
-Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m
-XX:MaxPermSize=256m -XX:+DisableExplicitGC"
Перезагрузите кота
Конечно, PreparedStatement
сделает ваш код лучше, но чтобы ответить на ваш вопрос, вам нужно сообщить СУБД формат вашего строкового представления Date. В Oracle (вы не называете поставщика базы данных) строка даты преобразуется в Date
с помощью функции TO_DATE ()
:
INSERT INTO TABLE_NAME(
date_column
)values(
TO_DATE('06/06/2006', 'mm/dd/yyyy')
)
Прежде чем я отвечу на ваш вопрос, я хотел бы упомянуть, что вам, вероятно, следует изучить возможность использования какого-либо решения ORM (например, Hibernate), скрытого за уровнем доступа к данным. То, что вы делаете, кажется очень анти-ОО. По общему признанию, я не знаю, как выглядит остальная часть вашего кода, но в целом, если вы начинаете видеть себя использующим множество служебных классов, вы, вероятно, принимаете слишком структурный подход.
Чтобы ответить на свой вопрос, как и другие уже упоминалось, просмотрите 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
Еще одно преимущество этого подхода заключается в том, что он автоматически экранирует ваши строки (например,
Вы обязательно должны использовать PreparedStatement
. ( Учебник )
Таким образом вы можете вызвать:
pstmt.setDate( 1, aDate );
Драйвер JDBC будет выполнять обработку даты и времени, соответствующую вашей конкретной базе данных.
Кроме того, PreparedStatement останавливает любые попытки взлома SQL-инъекции - очень важно! ( юмор )
Это должно выглядеть так:
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 );
, если вы используете mysql .., вы можете сохранить дату, например, как «2009-12-31».
update person set birthday_date = '2009-12-31'
, но я предпочитаю использовать jdbc, хотя вам нужно создать java.sql.Date ...
* Дата - это своего рода зло в этом мире. ..:)
Используйте подготовленные операторы, у них есть методы для правильной установки параметров для каждого собственного типа Java.
Вы должны использовать java.sql.Timestamp вместо java.util.Date. Кроме того, использование PreparedStatement избавит вас от забот о форматировании.