[하고자 하는 것]
MySQL 테이블과 Eclipse에 작성한 CRUD를 연동하여 데이터 입력, 수정, 조회, 삭제 해보기
[준비물]
MySQL 테이블
- 테이블명: sample
- 컬럼명: num, strData, sampleDate
Eclipse CRUD
- C(create): 입력
- R(read): 조회
- U(update): 수정
- D(delete): 삭제
[코드 작성 SampleVO, SampleDAO, DbUtil]
[DB와 연결할 필드, 생성자 Get/Set]
// SampleVO.java
import java.util.Date;
public class SampleVO {
private int num;
private String strData;
private Date sampleDate;
//default constructor
public SampleVO() {
}
//using fields
public SampleVO(int num, String strData, Date sampleDate) {
this.num = num;
this.strData = strData;
this.sampleDate = sampleDate;
}
//override toString()
@Override
public String toString() {
return "SampleVO [num=" + num + ", strData=" + strData + ", sampleDate=" + sampleDate + "]";
}
//getters & setters
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getStrData() {
return strData;
}
public void setStrData(String strData) {
this.strData = strData;
}
public Date getSampleDate() {
return sampleDate;
}
public void setSampleDate(Date sampleDate) {
this.sampleDate = sampleDate;
}
}
[DB 연결하는 함수 / DB 연결 해제하는 함수]
public class DbUtil {
//DB연결
public Connection dbConn() {
String url = "jdbc:mysql://localhost:3306/smart?characterEncoding=UTF-8&serverTimezone=Asia/Seoul";
String user = "";
String password = "";
Connection conn = null;
try {
//드라이버로드
Class.forName("com.mysql.cj.jdbc.Driver");
//DB연결
conn = DriverManager.getConnection(url. user, password);
//원래는 ClassNotFoundException이지만 SQL 연결 이후 SQLException이 또 발생하기 때문에 바로 Exception으로 바꿔준다.
} catch (Exception e) {
e.printStackTrace();
}
//연결되는 변수명을 리턴해준다.
return conn;
}
//DB해제(닫아줘야 할 3개의 변수)
public void dbClose(Connection conn, Statement stmt, Resultset rs) {
try {
if (rs !=null) rs.close();
if (stmt !=null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
[CRUD]
package dao;
/**
* 하면서 느낀 점:
* DB열고 닫는 함수를 사용하기 전 과정은 어느 정도 기억에 남으나
* 함수를 사용하고 나서는 순서가 꼬여서 그런지 동선에 혼동이 자주 온다.
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.sql.Date;
import domain.ExamVO;
import domain.SampleVO;
import util.DbUtil;
public class SampleDAO extends DbUtil {
public void create(SampleVO vo) {
StringBuffer sql = new StringBuffer();
sql.append(" \n INSERT INTO sample ");
sql.append(" \n (num, strDate, sampleDate) ");
sql.append(" \n VALUES (null, ?, curdate()) ");
Connection conn = null;
PreparedStatement stmt = null;
// SampleVO sampleVo = null; create문에선 쓰이지 않는다.
int idx = 0;
try {
// DB연결
conn = dbConn();
stmt = conn.prepareStatement(sql.toString());
// 값설정
stmt.setString(++idx, vo.getStrData());
// 실행*****
int res = stmt.executeUpdate();
// stmt.setDate(++idx, new Date(vo.getSampleDate().getTime()));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
dbClose(conn, stmt, null);
}
}
public List<SampleVO> read() {
StringBuffer sql = new StringBuffer();
sql.append(" SELECT * FROM sample ");
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
//개념다시 잡을 것 <>: 제네릭? 이해 못함.
List<SampleVO> list = new ArrayList<SampleVO>();
//코드작성
try {
//DB연결
conn = dbConn();
//prepareStatement(SQL작성 실행)
stmt = conn.prepareStatement(sql.toString());
rs = stmt.executeQuery();
//결과처리(Select문만 ResultSet 객체 리턴)
while(rs.next()) {
SampleVO vo = new SampleVO(
rs.getInt("num"),
rs.getString("strData"),
rs.getDate("sampleDate")
);
list.add(vo);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
dbClose(conn, stmt, null);
}
//닫기
return list;
}
public SampleVO read(SampleVO vo) {
StringBuffer sql = new StringBuffer();
sql.append(" SELECT * FROM sample" );
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
SampleVO sampleVo = null;
try {
//드라이버로드
conn = dbConn();
stmt = conn.prepareStatement(sql.toString());
//idx
stmt.setInt(1, vo.getNum());
//쿼리실행
rs = stmt.executeQuery();
//next()사용법
if (rs.next()) {
sampleVo = new SampleVO(
rs.getInt("num"),
rs.getString("strData"),
rs.getDate("sampleDate")
);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
dbClose(conn, stmt, rs);
}
return sampleVo;
}
public void update(SampleVO vo) {
StringBuffer sql = new StringBuffer();
sql.append(" UPDATE sample SET strData = ?, sampleDate = curdate() WHERE num = ? ");
Connection conn = null;
PreparedStatement stmt = null;
int idx = 0;
// ResultSet rs = null; read()문만 쓰이나?
try {
//
conn = dbConn();
//
stmt = conn.prepareStatement(sql.toString());
//
stmt.setString(++idx, vo.getStrData());
stmt.setInt(++idx, vo.getNum());
int res = stmt.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
dbClose(conn, stmt, null);
}
}
public void delete(SampleVO vo) {
StringBuffer sql = new StringBuffer();
sql.append(" DELETE FROM sample WHERE num = ? ");
Connection conn = null;
PreparedStatement stmt = null;
try {
//DB연결
conn = dbConn();
//prepareStatement(SQL작성 실행)
stmt = conn.prepareStatement(sql.toString());
stmt.setInt(1, vo.getNum());
int res = stmt.executeUpdate();
//결과처리(Select문만 ResultSet 객체 리턴)
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//DB해제
dbClose(conn, stmt, null);
}
}
}
[후기 및 느낀 점]
1. read()문 하면서 제네릭에 대한 이해가 없다는 것을 알게 됨.
(+) while문 돌리는 이유와 어떻게 작성했는지 기억할 것
2. 구문 작성 시 순서 기억할 것
(드라이버로드, DB연결, SQL문 작성, Statement 만들기, SQL문 실행, SELECT문 실행 및 반환, DB 닫기)
3. Date 사용법
4. DB 연결하고 해제하는 함수 사용 후 기존에 존재하는 중복구문 제대로 삭제하기
5. SQL 구문 적용 시 어떻게 MySQL에서 찍어내고 결과값 조회하게 할지 생각하고 적용하기