Java 정리 35
04 Jan 2019
Reading time ~2 minutes
Java 정리 35 - JDBC(2), Statement
JDBC 복습
- Class : JVM 외부의 클래스(Driver)를 객체로 만들어 JVM에 올려 놓는 일
- DriverManager : 로딩된 드라이버를 사용하여 DB와 연결한 후 연결객체를 반환하는 일
- Connection : 연결관리, Transaction 처리, 쿼리문 생성 객체 얻는일
-
Statement, PreparedStatement, CallableStatement : 쿼리문을 실행하여 결과를 얻는 일
- Statement, PreparedStatement : 쿼리 실행
- CallableStatement : Procedure 실행
- ResultSet : cursor의 제어권을 받아 여러행을 조회
- 드라이버 로딩
Class.forName("oracle.jdbc.OracleDriver");
- 로딩된 드라이버를 사용 Connection 얻기 (세가지의 정보 필요, DB url, 계정정보)
String url = "jdbc:oracle:thin:@ip:1521:orcl"; // oracle port : 1521, sid : orcl
String id = "scott";
String pw = "tiger";
// Connection는 autocommit이 기본설정되어 있음, setAutoCommit()로 설정가능
Connection con = DriverManager.getConnection(url, id, pw);
- 쿼리문 생성객체 얻기
Statement stmt = con.createStatement();
- 쿼리문 수행 후 결과 얻기
int deptno = 90;
String dname = "댄스부";
String loc = "구로구";
String sql = "insert into dept(deptno, dname, loc) values("+deptno+",'"+dname+"','"+loc+"')";
// oracle에서 문자열은 작은따옴표로 묶음
int cnt = stmt.executeUpdate(sql);
- 연결 끊기 (뒤에서부터 연결을 끊는다)
stmt.close();
con.close();
CRUD (CREATE, READ, UPDATE, DELETE)
- C - CREATE, INSERT
- R - SELECT
- U - ALTER, GRANT, REVOKE, UPDATE
- D - DROP, DELETE, TRUNCATE
쿼리문 실행객체
-
Statement
-
쿼리문을 모른다.
- 쿼리문이 실행될 때 쿼리문을 알게된다.
- 실행할 때 마다 쿼리문이 매번 생성되어 실행된다.
-
bind변수 없다.
- (비유)총을 조립해서 쏘는 것
- SQL Injection이 발생할 수 있다.
- 쿼리문이 적은 횟수(한번)로 실행될 때 적합
-
쿼리문을 모른다.
-
PreparedStatement
-
쿼리문을 안다.
- 객체가 얻어질 때부터 쿼리문을 앎
- 쿼리문은 미리 생성되어있고 값만 넣어 실행한다.
-
bind변수 존재
- (비유)조립된 총에서 탄창넣어 쏘는 것
- SQL Injection이 발생할 수 없다.
- 쿼리문이 반복실행될 때 적합
-
쿼리문을 안다.
- CallableStatement
Statement 사용법
- Statement 얻기
Statement stmt = con.createStatement();
-
insert, update, delete
- insert는 1행 추가 또는 Exception
- update, delete는 0~n개의 행이 변경되거나 삭제 또는 Exception
int cnt = stmt.executeUpdate("sql");
- select
String sql = "select deptno, dname, loc from cp_dept";
// SELECT를 실행하면 커서를 가진 incline View 생성 후 커서의 제어권을 ResultSet으로 반환
ResultSet rs = stmt.executeQuery(sql);
// ResultSet은 DB와 Java간 데이터 변환도 한다!(NUMBER(oracle) -> int(Java))
int deptno = 0;
String dname = "";
String loc = "";
while(rs.next) {
// 컬럼인덱스로 조회(비권장)
// 0번은 커서 컬럼, 1번부터 시작
// System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));
// 컬럼명으로 조회(권장)
deptno = rs.getInt("deptno");
dname = rs.getString("dname");
loc = rs.getString("loc");
}
cp_dept에 CRUD작업하는 예제
- method별 JDBC사용 반복 연습
- 효율성보단 연습을 위한 예제
- Quantum DB를 이용 dept를 컬럼 복사하여 cp_dept 테이블 생성
- pk_cp_dept PRIMARY KEY 설정
CREATE TABLE cp_dept AS (SELECT * FROM dept WHERE 1=0);
ALTER TABLE cp_dept ADD CONSTRAINT pk_cp_dept PRIMARY KEY(deptno);
-
CpDeptVO, OneCpDeptVO
- 차이는 deptno 유무 차이
-
저장되는 값이 하나라도 다르면 새로운 VO를 만든다.
- 개발자의 실수로 다른 값을 입력할 수도 있음(휴먼에러 방지용)
-
UseStatementCRUD클래스는 DAO클래스
- DAO(Data Access Object)
- DB에 관련된 업무를 처리하는 클래스
- 실행시키는 RunUseStatementCRUD 클래스