Java : java.sql.Date와 java.util.Date

java.sql.Date와 java.util.Date

미니 프로젝트를 진행하던 중, JDBC를 이용해 데이터베이스에 정보를 넣어줄 때 java.sql.Datejava.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가지 방법이 있습니다.

  1. java.util.datejava.sql.date 로 만드는 방법
    • 형 변환이라기 보다는 java.util.date의 값을 가져와 java.sql.date를 생성하는 것 입니다.
  2. 애초에 테이블 생성을 할 때 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

태그:

카테고리:

업데이트:

댓글남기기