복붙노트

[SQL] 자바 날짜 - 데이터베이스에 삽입

SQL

자바 날짜 - 데이터베이스에 삽입

나는 데이터베이스에 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());

내가 이런 식으로 뭔가를 실행할 때하지만 난이 오류가 발생합니다 :     날짜 시간 값의 문자열 표현의 구문이 잘못되었습니다.

Heres는 어떤 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. ==============================

    1., PreparedStatement의 더 나은 코드를 만들 것입니다 부여하지만, 귀하의 질문에 대답 할 수는 DBMS에게 날짜 당신의 문자열 표현의 형식을 알 필요가있다. 오라클에서 문자열 날짜가 TO_DATE () 함수를 사용하여 날짜로 변환됩니다 (당신은 데이터베이스 공급 업체의 이름을하지 않습니다)

    , PreparedStatement의 더 나은 코드를 만들 것입니다 부여하지만, 귀하의 질문에 대답 할 수는 DBMS에게 날짜 당신의 문자열 표현의 형식을 알 필요가있다. 오라클에서 문자열 날짜가 TO_DATE () 함수를 사용하여 날짜로 변환됩니다 (당신은 데이터베이스 공급 업체의 이름을하지 않습니다)

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

    2.나는 귀하의 질문에 대답하기 전에, 당신이 아마 데이터 액세스 계층 뒤에 포장 ORM 솔루션 (예를 들어, 최대 절전 모드)의 일종을 사용하여 조사해야한다고 언급하고 싶습니다. 당신이하고있는 것은 매우 안티 OO 것으로 보인다. 나는 틀림없이 당신이 유틸리티 클래스를 많이 사용하여 자신을보고 시작하면, 당신은 아마 접근 방식이 너무 구조 복용하고, 일반적으로 코드의 외모의 나머지 좋아하는 것을 알고 있지만하지 않습니다.

    나는 귀하의 질문에 대답하기 전에, 당신이 아마 데이터 액세스 계층 뒤에 포장 ORM 솔루션 (예를 들어, 최대 절전 모드)의 일종을 사용하여 조사해야한다고 언급하고 싶습니다. 당신이하고있는 것은 매우 안티 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
    

    이 방법의 한 가지 추가적인 이점은 자동으로 (성 "오브라이언"을 가진 사람을 삽입한다면, 예를 들어, 당신은 원래의 구현에 문제가있는 것) 당신을 위해 문자열을 탈출한다는 것입니다.

  3. ==============================

    3.당신은 확실히 된 PreparedStatement를 사용해야합니다. (지도 시간)

    당신은 확실히 된 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 ); 
    
  4. ==============================

    4.OscarRyz에 의한 답변은 정확하고 허용 대답하고 있어야합니다. 그러나 대답은 지금 밖으로-일자.

    OscarRyz에 의한 답변은 정확하고 허용 대답하고 있어야합니다. 그러나 대답은 지금 밖으로-일자.

    자바 8 이상에서 우리는 (튜토리얼 JSR 310에 의해 정의 Joda 타임에서 영감을, ThreeTen - 추가 사업 확장) 새로운 java.time 패키지가 있습니다.

    오래된 java.util.Date/.Calendar, SimpleDateFormat에, 및 java.sql.Date 클래스는 혼란 엉망이다. j.s.Date 날짜 만 시간의 일하지 않고있는 동안 한 가지 들어, j.u.Date은 날짜와 시간의 일이있다. 오, 제외 j.s.Date 만 시간의 일이없는 척하는 것이다. j.u.Date의 서브 클래스로, j.s.Date는 시간의 일을 상속하지만, 자동으로 해당 시간의 일 자정 (00 : 00 : 00.000)을 조정합니다. 혼동? 예. 솔직히 나쁜 해킹.

    이것과 더 많은 이유로, 그 오래된 클래스는 피 최후의 수단을 사용해야합니다. 대체로 Joda 타임에 사용 java.time 가능한 경우.

    java.time에서 LOCALDATE 클래스는 정상적으로 모든 시간의 일 또는 시간대없이 날짜 만 값을 나타냅니다. 그것은 우리가이 문제의 해결을 위해 필요한 것입니다.

    그 LOCALDATE 객체를 얻으려면 우리는 입력 문자열을 구문 분석합니다. 그러나 대신 사용하는 것보다 기존의 SimpleDateFormat의 클래스는 java.time는 java.time.format 패키지의 새로운 DateTimeFormatter 클래스를 제공합니다.

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

    JDBC 드라이버는 JDBC 4.2과 호환 이상 PreparedStatement의 ::의 setObject와 ResultSet의 ::으로 getObject 방법을 통해 직접 java.time 유형을 사용할 수 있습니다.

    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.*. 
    

    당신이 때까지 그러나 그런는 대체 java.sql.Date 클래스를 사용하여, JDBC 드라이버를 업데이트했습니다. 다행히, 오래된 java.sql.Date 클래스는 새로운 편리한 변환 정적 방법, valueOf (LOCALDATE)와 자바 (8)에 의해 재능이있다.

    OscarRyz에 의해 형제 응답의 샘플 코드에서는,이 하나의 "경우 SQLDate ="라인을 교체 :

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

    5.당신이 MySQL을 사용하는 경우 ... 당신은 예를 들어 "2009-12-31"으로 날짜를 저장할 수 있습니다.

    당신이 MySQL을 사용하는 경우 ... 당신은 예를 들어 "2009-12-31"으로 날짜를 저장할 수 있습니다.

    갱신 사람 세트 birthday_date = '2009-12-31'

    하지만 난 당신이 java.sql.Date을 만들 필요가 있지만, JDBC를 사용하는 것을 선호 ...

    * 날짜 종류이 세상에서 악입니다 ... :)

  6. ==============================

    6.준비된 문을 사용하여, 그들은 제대로 각 기본 Java 유형에 대한 매개 변수를 설정하는 방법이있다.

    준비된 문을 사용하여, 그들은 제대로 각 기본 Java 유형에 대한 매개 변수를 설정하는 방법이있다.

    하여 setDate 및 예제에 대한 API를 봐

  7. ==============================

    7.대신 java.util.Date의 java.sql.Timestamp 오브젝트를 사용해야합니다. 또한이 형식에 대한 걱정 저장하는 PreparedStatement를 사용하여.

    대신 java.util.Date의 java.sql.Timestamp 오브젝트를 사용해야합니다. 또한이 형식에 대한 걱정 저장하는 PreparedStatement를 사용하여.

  8. ==============================

    8.

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

    이것은 내가 JDBC를 사용하여 데이터베이스에 날짜를 저장하는 데 사용되는 코드입니다 나를 위해 잘 작동합니다

  9. ==============================

    9.이 코드 날짜를 사용할 수있는 시간 시간은 24 시간이다

    이 코드 날짜를 사용할 수있는 시간 시간은 24 시간이다

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

    10.

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

    당신은 SQL 쿼리에 변수를 삽입하는 데 사용할 수 있습니다.

  11. from https://stackoverflow.com/questions/1081234/java-date-insert-into-database by cc-by-sa and MIT license