[Java] DB 데이터 검색하기

programmeaow·2022년 6월 9일
0

Java

목록 보기
9/13

DB 연결 코드를 통해 MYSQL의 테이블에서 정보를 검색해보자.

검색하기 전, 연결 코드의 중복되는 부분을 util packageDBUtil class 를 생성하여 static으로 사용할 수 있게 했다.


- DB 드라이버 로딩 code

: 로딩시에 최초로 한번만 실행하면 되기 때문에, static을 사용하여 로딩시에 실행되게 작성한다.

public class DBUtil {
	static { 
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("해당 MYSQL DB의 driver가 존재하지 않습니다.");
		}
	}

- 자원 반환용 Close method

: 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에서 학습용으로 제공한 empdept 테이블을 이용하였다.
dept 테이블의 데이터를 복사하여 dept01 테이블을 생성해보자.

CREATE TABLE DEPT01 AS SELECT * FROM DEPT

☑️ 데이터 조회하기(Read 문장 실행)

새롭게 생성한 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);
		}
	}

✔️ sqlplus로 해당 쿼리문을 실행하여 비교해가며 정상적으로 출력 되었는지 확인하며 진행할 것

dept01 테이블의 모든 정보가 출력된 것을 확인할 수 있다.


☑️ 데이터 변경하기(DML 문장 실행)

이번에는 조회가 아닌 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);
		}
	}

부서번호가 50인 부서의 모든 데이터를 삭제해보자.
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);
		}
	}
profile
개발이란 뭘까

0개의 댓글