java.util.Date vs. java.sql.Date
java.util.Date
vs java.sql.Date
: 언제 어떤 것을 왜 사용해야합니까?
축하합니다. JDBC : Date class handling으로 제가 가장 좋아하는 애완 동물을 맞이했습니다.
기본적으로 데이터베이스는 일반적으로 날짜, 시간 및 시간 소인 인 세 가지 형식의 날짜 시간 필드를 지원 합니다. 이것들 각각은 JDBC에 상응하는 클래스를 가지고 있으며 그것들 각각은 extendjava.util.Date
. 이 세 가지 각각의 빠른 의미는 다음과 같습니다.
java.sql.Date
SQL DATE에 해당합니다. 이는 시, 분, 초 및 밀리 초 를 무시 하고 년, 월 및 일 을 저장함을 의미합니다 . 또한 시간대와 관련이 없습니다.sql.Date
java.sql.Time
SQL 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.time
Joda 기반 패키지 를 선호 합니다. 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
'development' 카테고리의 다른 글
MongoDB 또는 CouchDB-프로덕션에 적합합니까? (0) | 2020.02.13 |
---|---|
HTML을 사용하여 문서의 모든 인쇄 페이지에 머리글과 바닥 글을 인쇄하는 방법은 무엇입니까? (0) | 2020.02.13 |
Vim and Ctags 팁과 요령 (0) | 2020.02.13 |
compileSdkVersion과 targetSdkVersion의 차이점은 무엇입니까? (0) | 2020.02.13 |
푸시 된 후 커밋을 스쿼시하는 방법은 무엇입니까? (0) | 2020.02.13 |