JDBC를 위한 utility
- 5가지 단계에서 코드를 간결하게 하는 방식을 알아보자
- 먼저 특정 DB로부터 Connection을 획득하고 종료하는 JDBCUtil class를 작성한다.
public class JDBCUtil {
public static Connection getConnection() {
try {
DriverManager.registerDriver(new 드라이버 이름());
String jdbcUrl = "JDBC URL 입력";
Connection con = DriverManager.getConnection(jdbcUrl, "ID", "Password");
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
public static void close(PreparedStatement sta, Connection con) {
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- JDBCUtil 클래스를 만들면 1단계와 2단계를 간결하게 할 수 있다.
(Collection을 획득하는 코드를 JDBCUtil.getConnection() 메서드로 대체)
- finally 블록 안의 try ~ catch문을 JDBCUtil.close() 메서드로 대체한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class 클래스이름 {
public static void main(String[] args) {
try {
con = JDBCUtil.getConnection();
String sql = "insert into 테이블이름 values(?, ?, ?, ?)";
sta = con.prepareStatement(sql);
sta.set데이터타입(1, 값);
sta.set데이터타입(2, 값);
sta.set데이터타입(3, 값);
sta.set데이터타입(4, 값);
int count = sta.executeUpdate();
System.out.println(count + "건 데이터 처리 성공!");
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(sta, con);
}
}
}
Select를 이용하여 결과 받기
- DB가 조회한 Select 결과를 받으려면 ResultSet 인터페이스를 이용한다.
- select 결과 처리를 위해 ResualtSet 객체 구조를 알아야 한다.
- ResultSet
- 문서 작업 시 사용하는 커서의 개념이 있다.
- ResualtSet 객체에는 Before first, After Last라는 데이터가 없는 영역 존재
- ResultSet객체가 반환되면 커서는 BeforeFirst에 자동으로 위치한다.
- ResultSet 객체에 next() 메서드를 사용해야 데이터를 읽을 수 있다.
- JDBCUtil 클래스 하부에 아래와 같은 코드를 추가한다.
public static void close(ResultSet rs, PreparedStatement sta,
Connection con) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
- JDBCUtil 클래스에 추가한 뒤 5단계까지 마무리 지은 클래스를 수정한다.
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class 클래스 이름 {
public static void main(String[] args) {
Connection con = null;
PreparedStatement sta = null;
ResultSet rs = null;
try {
con = JDBCUtil.getConnection();
String sql = "select * from 테이블 이름";
sta = con.prepareStatement(sql);
rs = sta.executeQuery();
while(rs.next()) {
System.out.print(rs.get데이터타입("칼럼이름");
System.out.print(rs.get데이터타입("칼럼이름");
System.out.print(rs.get데이터타입("칼럼이름");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, sta, con);
}
}
}
DAO 패턴 (Data Access Object)
- 지금까지 배운 단계별과정을 사용하면 너무 복잡하다.
문서를 읽어 들일 때 간결성을 얻기 위해 DAO패턴을 많이 사용한다.
- 먼저 자료가 들어갈 DAO 클래스를 만든다.
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DAO {
private Connection con = null;
private PreparedStatement sta = null;
private ResultSet rs = null;
private String 테이블이름\_LIST = "select 칼럼이름, 칼럼이름, 칼럼이름, from 테이블이름";
public void getStudentList() {
try {
con = JDBCUtil.getConnection();
sta = con.prepareStatement(테이블이름\_LIST);
rs = sta.executeQuery();
while(rs.next()) {
System.out.print(rs.get데이터타입("칼럼이름");
System.out.print(rs.get데이터타입("칼럼이름");
System.out.print(rs.get데이터타입("칼럼이름");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, sta, con);
}
}
}
- 작성된 DAO 클래스를 이용해 목록을 작성할 수 있다.
public class 클래스이름 {
public static void main(String\[\] args) {
DAO dao = new DAO();
dao.get클래스이름List();
}
}
- 이제 CRUD를 이용할 수 있다.
- INSERT 이용해 보기
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
private String 테이블이름\_LIST = "select 칼럼이름, 칼럼이름, 칼럼이름, from 테이블이름";
private String 테이블이름\_INSERT = "insert into 테이블이름 values(?, ?, ?, ?)";
public void insertStudent(데이터타입 칼럼이름, 데이터타입 칼럼이름, 데이터타입 칼럼이름) {
try {
con = JDBCUtil.getConnection();
sta = con.prepareStatement(테이블이름\_INSERT);
sta.set데이터타입(1, 값);
sta.set데이터타입(2, 값);
sta.set데이터타입(3, 값);
sta.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(sta, con);
}
}
public void get테이블이름List() {
출력내용
}
public class 클래스이름 {
public static void main(String\[\] args) {
DAO dao = new DAO();
dao.insert테이블이름(들어갈 칼럼의 값들 입력);
dao.get테이블이름List();
}
}
- INSERT의 예시만 들었지만 위와 같은 방법으로 Update, Delete를 전부 사용한다.
- Update 같은 경우 아래 코드를 추가
INSERT에 이어서
private String 테이블이름\_UPDATE = "update 테이블이름 set 칼럼 = ?, 칼럼 = ? where 기본키 칼럼 = ?";
public void update테이블이름(데이터타입 칼럼, 데이터타입 칼럼, 데이터타입 칼럼) {
try {
con = JDBCUtil.getConnection();
sta = con.prepareStatement(테이블이름\_INSERT);
sta.set데이터타입(1, 값);
sta.set데이터타입(2, 값);
sta.set데이터타입(3, 값);
sta.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(sta, con);
}
}
public class 클래스이름 {
public static void main(String\[\] args) {
DAO dao = new DAO();
dao.update테이블이름(들어갈 칼럼의 값들 입력);
dao.get테이블이름List();
}
}
Update에 이어서
private String 테이블이름\_DELETE = "delete 테이블이름 where 칼럼 = ?";
public void delete테이블이름(테이터타입 칼럼이름) {
try {
con = JDBCUtil.getConnection();
sta = con.prepareStatement(테이블이름\_DELETE);
sta.set데이터타입(1, 값);
sta.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(sta, con);
}
}
public class 클래스이름 {
public static void main(String\[\] args) {
DAO dao = new DAO();
dao.delete테이블이름(들어갈 칼럼의 값들 입력);
dao.get테이블이름List();
}
}