development

java.util.Date vs. java.sql.Date

big-blog 2020. 2. 13. 00:48
반응형

java.util.Date vs. java.sql.Date


java.util.Datevs java.sql.Date: 언제 어떤 것을 왜 사용해야합니까?


축하합니다. JDBC : Date class handling으로 제가 가장 좋아하는 애완 동물을 맞이했습니다.

기본적으로 데이터베이스는 일반적으로 날짜, 시간 및 시간 소인 인 세 가지 형식의 날짜 시간 필드를 지원 합니다. 이것들 각각은 JDBC에 상응하는 클래스를 가지고 있으며 그것들 각각은 extendjava.util.Date . 이 세 가지 각각의 빠른 의미는 다음과 같습니다.

  • java.sql.DateSQL DATE에 해당합니다. 이는 시, 분, 초 및 밀리 초 를 무시 하고 년, 월 및 일저장함을 의미합니다 . 또한 시간대와 관련이 없습니다.sql.Date
  • java.sql.TimeSQL TIME에 해당하며 명백히 시, 분, 초 및 밀리 초 에 대한 정보 만 포함합니다 .
  • java.sql.Timestamp사용자 정의 가능한 정밀도로 나노초와 정확한 날짜 인 SQL TIMESTAMP util.Date해당합니다 (밀리 초 만 지원합니다! ).

이 세 가지 유형과 관련하여 JDBC 드라이버를 사용할 때 가장 일반적인 버그 중 하나는 유형이 잘못 처리된다는 것입니다. 이 수단 sql.Date시간대 특정는 sql.Time현재 연도, 월, 일 등등 등등이 포함되어 있습니다.

마지막으로 어느 것을 사용해야합니까?

실제로 필드의 SQL 유형에 따라 다릅니다. , for for PreparedStatement#setDate()중 하나 인 세 값 모두에 대한 세터 있습니다.sql.Date#setTime()sql.Time#setTimestamp()sql.Timestamp

ps.setObject(fieldIndex, utilDateObject);실제로 사용 하면 util.Date대부분의 JDBC 드라이버에 정상적인 유형 제공 할 수 있습니다.이 드라이버는 올바른 유형 인 것처럼 행복하게 삼킬 수 있지만 나중에 데이터를 요청할 때 실제로 누락 된 것을 알 수 있습니다.

나는 실제로 날짜를 전혀 사용해서는 안된다고 말하고 있습니다.

내가 말하는 것은 밀리 초 / 나노 초를 평범한 길이로 저장하고 사용중인 모든 객체 ( 필수 조다 타임 플러그 ) 로 변환하는 것 입니다. 수행 할 수있는 하나의 해키 방법은 날짜 구성 요소를 다른 하나의 장기 및 구성 요소로 저장하는 것입니다 (예 : 현재 20100221 및 154536123).이 매직 번호는 SQL 쿼리에 사용될 수 있으며 데이터베이스에서 다른 구성 요소로 이식 가능합니다. JDBC / Java Date API 의이 부분을 완전히 피할 수 있습니다.


늦은 편집 : Java 8부터는 피할 수 있거나 사용하지 java.util.Date않아야 java.sql.Date하며 대신 java.timeJoda 기반 패키지 를 선호 합니다. Java 8을 사용하지 않는 경우 원래 응답은 다음과 같습니다.


java.sql.Date-JDBC를 사용하는 라이브러리의 메소드 / 생성자를 호출 할 때. 그렇지 않다. JDBC를 명시 적으로 처리하지 않는 응용 프로그램 / 모듈의 데이터베이스 라이브러리에 대한 종속성을 도입하지 않으려 고합니다.

java.util.Date-그것을 사용하는 라이브러리를 사용할 때. 그렇지 않으면 몇 가지 이유로 가능한 한 적게 :

  • 변경 가능하므로 메소드로 전달하거나 메소드에서 리턴 할 때마다 방어 사본을 작성해야합니다.

  • 날짜를 잘 처리하지 못하므로 실제로 당신과 같은 사람들은 날짜 처리 수업을해야한다고 생각합니다.

  • 이제 juD가 잘하지 않기 때문에 굉장히 많은 Calendar수업이 소개되었습니다. 또한 변경 가능하고 작업하기가 끔찍하므로 선택 사항이 없으면 피해야합니다.

  • Joda Time API 와 같은 더 나은 대안 이 있습니다 ( Java 7로 만들 수도 있고 새로운 공식 날짜 처리 API가 될 수도 있습니다 - 빠른 검색 은 그렇지 않습니다).

Joda와 같은 새로운 의존성을 도입하는 것이 과도하다고 생각한다면 long객체의 타임 스탬프 필드에 사용하는 것이 나쁘지는 않습니다.하지만 일반적으로 객체를 전달할 때 jud로 감싸거나 유형 안전과 문서로 사용합니다.


사용하는 유일한 시간 java.sql.Date은입니다 PreparedStatement.setDate. 그렇지 않으면을 사용하십시오 java.util.Date. 는를 ResultSet.getDate반환한다고 java.sql.Date말하지만 a 에 직접 할당 할 수 있습니다 java.util.Date.


나는 같은 문제가 있었다. 현재 날짜를 준비된 진술에 삽입하는 가장 쉬운 방법은 다음과 같다.

preparedStatement.setDate(1, new java.sql.Date(new java.util.Date().getTime()));

Java의 java.util.Date 클래스는 특정 시점 (예 : 2013 년 11 월 25 일 16:30:45에서 밀리 초까지)을 나타내지 만 DB의 DATE 데이터 유형은 날짜 만 나타냅니다 (예 : 2013 년 11 월 25 일). 실수로 DB에 java.util.Date 오브젝트를 제공하지 못하게하기 위해 Java에서는 SQL 매개 변수를 java.util.Date로 직접 설정할 수 없습니다.

PreparedStatement st = ...
java.util.Date d = ...
st.setDate(1, d); //will not work

그러나 여전히 강제 / 의도로 그렇게 할 수 있습니다 (그러면 시간과 분은 DB 드라이버에서 무시됩니다). 이것은 java.sql.Date 클래스로 수행됩니다.

PreparedStatement st = ...
java.util.Date d = ...
st.setDate(1, new java.sql.Date(d.getTime())); //will work

java.sql.Date 객체는 특정 시점을 저장할 수 있으므로 (java.util.Date에서 쉽게 구성 할 수 있음) 몇 시간 동안 요청하면 예외가 발생합니다 ( 날짜 만). DB 드라이버는이 클래스를 인식하고 시간 동안 0을 사용합니다. 이 시도:

public static void main(String[] args) {
  java.util.Date d1 = new java.util.Date(12345);//ms since 1970 Jan 1 midnight
  java.sql.Date d2 = new java.sql.Date(12345);
  System.out.println(d1.getHours());
  System.out.println(d2.getHours());
}

참고 URL : https://stackoverflow.com/questions/2305973/java-util-date-vs-java-sql-date



반응형