JDBC

awarduuu·2023년 4월 3일
0
post-thumbnail

230423

JDBC API

java와 DB를 연동해주는 API

단계

1. 로드

연동하려는 DB제품(벤더)을 선택하는 것, 제품별 Driver가 필요하다.(~.jar)
만약 Driver를 못찾으면 ClassNotFoundException 발생

Class.forName("연결하려든 드라이버 명");

/**
* Oracle : oracle.jdbc.driver.OracleDriver
* Ms_Sql : sun.jdbc.odbc.JdbcOdbcDriver
* My_Sql : org.git.mm.mysql.Driver
*/

2. 연결

로드된 DB에 접속하는 것으로 URL, ID, Password를 이용해서 연결객체를 얻어오는 과정이다.

Connection con = DriverManager.getConnection(String url, String id, String pass);

/**
* <url>
* Oracle : jdbc:oracle:thin:@localhost:1521:XE
* Ms_Sql : jdbc:odbc:odbc설정을 통해 만든 db 원본명
* My_Sql : jdbc:mysql://localhost:3306/db명
*/

3. 실행

CRUD 작업을 실행한다.

1. Statement 방식

Statement st = con.createStatement();

// DDL or DML인 경우
// result == 0 이면 적용된 레코드 없음 - 실패
// result == 1 이면 적용된 레코드 있음 - 성공
int result = st.executeUpdate(String sql); // 인수 sql은 쿼리문장(insert, update, delete, create)

// DQL인 경우 - select 전용
ResultSet rs = st.executeQuery(String sql); // 인수 sql은 select문장
// rs.next(); // 아래로 한 행 내린다.(만약 있으면 true, 없으면 false)
while(rs.next()){
	// Type 변수이름 = rs.getType(컬럼명 or 컬럼인덱스);
	int empNo = rs.getInt("empno");
    String ename = rs.getString(2);
    String job = rs.getString(3);
    
    //DTO에 저장
    EmpDTO emp = new EmpDTO(empNo, ename, job);
    
    //list에 추가한다.
    list.add(emp);
}

2. PreparedStatement 방식 : Statement를 상속받은 하위 클래스로, SQL_Injection공격을 방어할 수 있어 권장되는 방식이다.

- Statement 방식과 큰 차이점은 실행할 때 SQL문을 넣는 방식이 아니다!

PreparedStatement ps = con.prepareStatement(String sql); // DDL, DML, DQL 허용

// ex) emp테이블에 레코드 하나 추가한다. (insert)
String sql = "insert into emp(empno, ename, job, hiredate) values(?, ?, ?, sysdate)";
PreparedStatement ps = con.prepareStatement(String sql);
// sql문장에 ?가 있다면 ?의 순서대로 개수만큼 setType(?index, 값);
ps.setInt(1, empno);
ps.setString(2, ename);
ps.setString(3, job);

// 실행
// ps.executeUpdate()메소드는 쿼리가 DDL, DML인 경우
int result = ps.executeUpdate(); 
// result가 0이면 실패, 1이상이면 성공!

// PreparedStatement를 사용하는 select 문장인 경우

String sql = "select empno, ename, job from emp where deptno=20";
PreparedStatement ps = con.prepareStatement(String sql);

// 실행
ResultSet rs = ps.executeQuery();
while(rs.next()){
	// Type 변수이름 = rs.getType(컬럼명 or 컬럼인덱스);
	int empNo = rs.getInt("empno");
    String ename = rs.getString(2);
    String job = rs.getString(3);
    
    //DTO에 저장
    EmpDTO emp = new EmpDTO(empNo, ename, job);
    
    //list에 추가한다.
    list.add(emp);
}

4. 닫기

사용된 객체를 반납한다. ~.close()

/**
* 닫기(DML전용)
* */
public static void releaseConnection(Connection con, Statement st) {
	try {
		// NullPointException을 대비하기 위해 null check 진행!
		if(st!=null) st.close();
		if(con!=null) con.close();
	}catch (SQLException e) {
		e.printStackTrace();
	}
}
	
	
/**
* 닫기(select전용)
* */
public static void releaseConnection(Connection con, Statement st, ResultSet rs) {
	try {
		if(rs!=null) rs.close();
	}catch (SQLException e) {
		e.printStackTrace();
	}
	releaseConnection(con, st);
}
profile
선한 영향력을 만드는 개발자

0개의 댓글