DB 연결 코드를 통해 MYSQL의 테이블에서 정보를 검색해보자.
검색하기 전, 연결 코드의 중복되는 부분을 util package
에 DBUtil class
를 생성하여 static으로 사용할 수 있게 했다.
: 로딩시에 최초로 한번만 실행하면 되기 때문에, static을 사용하여 로딩시에 실행되게 작성한다.
public class DBUtil {
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("해당 MYSQL DB의 driver가 존재하지 않습니다.");
}
}
: if문과 try문 등 같은 코드를 여러번 사용해야 하는 번거로움이 있어서 메서드로 따로 작성하고, static을 이용해 따로 선언 없이 이용할 수 있게 했다.
public static void close(Connection conn, Statement stmt, ResultSet rset) {
try {
if (rset != null) {
rset.close();
rset = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
System.out.println("자원 반환에 실패하였습니다.");
}
}
Oracle에서 학습용으로 제공한 emp
와 dept
테이블을 이용하였다.
dept
테이블의 데이터를 복사하여 dept01
테이블을 생성해보자.
CREATE TABLE DEPT01 AS SELECT * FROM DEPT
새롭게 생성한 dept01
테이블에서 부서 번호가 10번인 사람들의 데이터만 출력해보자.
public void selectOne() {
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
try {
conn = DBUtil.getConnection();
stmt = conn.createStatement();
rset = stmt.executeQuery("select * from dept01 where deptno=10");
if(rset.next()) {
System.out.println(rset.getInt("deptno") + " " + rset.getString("dname") + " " + rset.getString("loc"));
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("DB 접속시 문제가 발생하였습니다.");
} finally {
DBUtil.close(conn, stmt, rset);
}
}
부서번호가 10번인 사람들의 데이터가 출력된 것을 확인할 수 있다.
드라이버 로딩 코드와 close( ) 를 DBUtil
클래스에 작성한 뒤 메서드를 호출하였다.
stmt = conn.createStatement();
: 접속된 'DB접속객체'로부터 생성되며 해당 DB와만 소통하는 문장 객체!
이번에는 dept01
테이블의 모든 정보를 출력해보자.
public void selectAll() {
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
try {
conn = DBUtil.getConnection();
stmt = conn.createStatement();
rset = stmt.executeQuery("select * from dept");
while (rset.next()) {
System.out.println(rset.getInt("deptno") + " " + rset.getString("dname") + " " + rset.getString("loc"));
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("DB 접속 문제 발생");
} finally {
DBUtil.close(conn, stmt, rset);
}
}
dept01
테이블의 모든 정보가 출력된 것을 확인할 수 있다.
이번에는 조회가 아닌 DML ( INSERT / UPDATE / DELETE ) 문장을 실행하는 코드를 작성해보자. DML 문장 실행시에는 executeQuery
대신, executeUpdate
를 사용해야 한다.
dept01
에 [ deptno : 50 / dname : Education / loc : LA ] 데이터를 추가해보자.
public void insert() {
Connection conn = null;
Statement stmt = null;
int count = 0;
try {
conn = DBUtil.getConnection();
stmt = conn.createStatement();
count = stmt.executeUpdate( "insert into dept01 values (50, 'Education ', 'LA')" );
if(count == 1) {
System.out.println("데이터 저장에 성공하였습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("DB 접속시 문제가 발생하였습니다.");
} finally {
DBUtil.close(conn, stmt, null);
}
}
기존에 작성한 close( ) 메서드는 conn, stmt, rset을 자원 반환 해주는데 executeUpdate는 int 타입을 반환하므로 rset 자리에 count라는 새 변수를 선언하여 사용했다.
rset 자리에 null을 넣는 것 보다 메서드를 새로 선언하는 것이 더욱 바람직하다.
따라서 자원 반환 메서드를 새로 작성하여 해당 부분의 코드를 변경했다.
} finally {
DBUtil.close(conn, stmt);
}
코드 실행 후 명령 프롬포트에서 dept01
정보를 조회하면 부서번호 50에 관련된 데이터가 존재하는 것을 볼 수 있다.
이번에는 부서번호가 50인 부서의 loc
를 모두 korea로 변경해보았다.
public void update() {
Connection conn = null;
Statement stmt = null;
int count = 0;
try {
conn = DBUtil.getConnection();
stmt = conn.createStatement();
count = stmt.executeUpdate("update dept01 set loc='korea' where deptno=50");
if(count == 1) {
System.out.println("수정에 성공하였습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("DB 접속시 문제가 발생하였습니다.");
} finally {
DBUtil.close(conn, stmt);
}
}
public void delete() {
Connection conn = null;
Statement stmt = null;
int count = 0;
try {
conn = DBUtil.getConnection();
stmt = conn.createStatement();
count = stmt.executeUpdate("delete from dept01 where deptno=50");
if(count == 1) {
System.out.println("삭제에 성공하였습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("DB 접속시 문제가 발생하였습니다.");
} finally {
DBUtil.close(conn, stmt);
}
}