Java : java.sql.Date와 java.util.Date
java.sql.Date와 java.util.Date
미니 프로젝트를 진행하던 중, JDBC를 이용해 데이터베이스에 정보를 넣어줄 때 java.sql.Date
와 java.util.Date
간의 형 변환 때문에 살짝 헤매서 포스팅 하려고 합니다!
개요
파라미터로 객체를 받아와 그 파라미터를 DB에 INSERT해주는 아주 간단한 문제인 줄 알았습니다.. 하지만 businessCard 객체의 Date는 java.util.Date
ps.setDate()의 인자는.. java.sql.Date
였던 것이죠..!!
public BusinessCard addBusinessCard(BusinessCard businessCard){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "INSERT INTO businesscard values(?,?,?,?)";
try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)){
ps.setString(1, businessCard.getName());
ps.setString(2, businessCard.getPhone());
ps.setString(3, businessCard.getCompanyName());
ps.setDate(4, businessCard.getCreateDate());
// 문제의 부분
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}
return businessCard;
}
해결 방법
사실 해결 방법은 아주 간단합니다.. 총 2가지 방법이 있습니다.
java.util.date
를java.sql.date
로 만드는 방법- 형 변환이라기 보다는
java.util.date
의 값을 가져와java.sql.date
를 생성하는 것 입니다.
- 형 변환이라기 보다는
- 애초에 테이블 생성을 할 때 CreateDate에 디폴트로 날짜를 자동으로 넣어주는 방법
- 이렇게 만드는게 좋아 보이지만 테이블을 건들 수 없는 상황도 있을거라 생각합니다.
1. java.util.date
에서 java.sql.date
로 만드는 방법
// ps.setDate(4, businessCard.getCreateDate()); 기존의 코드
ps.setDate(4, new java.sql.Date(businessCard.getCreateDate().getTime()));
java.sql.Date
생성자 안에는 long 타입만 들어갑니다. 그렇기 때문에 businessCard
객체에서 Date를 가져온 후 getTime()
함수를 이용해 날짜를 long 타입으로 가져온 후 java.sql.Date
로 만드는 것 입니다.
2. 테이블 생성을 할 때 디폴트로 날짜를 자동으로 넣어주는 방법
CREATE TABLE BUSINESSCARD (
name varchar(10) NOT NULL,
phone char(13),
companyname varchar(12),
createdate datetime default now()
);
이렇게 테이블을 설정해 주면 쿼리문에서 date를 설정하지 않아도 INSERT 되는 동시에 날짜가 입력됩니다.
String sql = "INSERT INTO businesscard (name, phone, companyname) values(?,?,?)";
try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)){
ps.setString(1, businessCard.getName()); // values(?, ?, ?,) 3개 중 첫 번째 '?'에 값을 설정해 줍니다.
ps.setString(2, businessCard.getPhone());
ps.setString(3, businessCard.getCompanyName());
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}
java.sql.date, time, timestamp 차이
sql 데이터 타입과 맞추기 위해 차이를 알아봤습니다!
package org.edwith.webbe.cardmanager;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
public class test {
public static void main(String[] args) {
java.util.Date utildate = new java.util.Date();
Date date = new Date(utildate.getTime());
Time time = new Time(utildate.getTime());
Timestamp times = new Timestamp(utildate.getTime());
System.out.println(date); // 2021-02-25
System.out.println(time); // 00:30:57
System.out.println(times); // 2021-02-25 00:30:57.89
}
}
참고 : https://docs.oracle.com/javase/8/docs/api/java/util/Date.html
댓글남기기