YJ의 새벽
SQL응용 JDBC (PreparedStatement) 본문
- JDBC 프로그래밍 단계
JDBC 드라이버 로드 --> JDBC driver class / Class.forName()
데이터베이스 연결 --> Java.sql.Connection / getConnection()
Statement 생성 --> Java.sql.Statement / createStatement()
Java.sql.PreparedStatement / prepareStatment()
SQL 문 전송 --> Java.sql.Statement / executeQuery() , excuteUpdate()
결과받기 --> Java.sql.ResultSet / resultSet()
연결해제 --> Java.sql.Connection / close()
**PreparedStatement
-- DBMS 에서 동일하거나 비슷한 SQL 문을 높은 효율성으로 반복적 실행할때 사용.
--작동원리
--1. 준비 (Prepare) :
--SQL문의 틀(Template)을 만들고 이를 DBMS 로 보냄.
-- 특정값은 지정하지 않음 .
ex ) INSERT INTO products (name , age ) VALUES ( ?,? ) ;
--물음표 기호를 사용하여 SET+자료형() 의 메소드 호출시에 전달받을 값의 자리를 지정.
--2. 컴파일 (Compile) :
--DBMS는 SQL문의 틀을 컴파일하여(최적화및 변환) 실행하지않고 결과만 저장.
--캐시(Cache) 에 저장 . 임시메모리.
ex ) PreparedStatement ps = conn.prepareStatement(sql);
ps.setString ( 1,"홍길동" );
ps.setInt ( 2 , 20 ) ;
--> 실행하고 나면
INSERT INTO products (name , age ) VALUES ( '홍길동', 20 ) ;
--3. 실행 ( Execute ) :
--SQL 문을 실행
ex ) int res = ps.executeUpdate();
--UPDATE,DELETE SQL문 실행가능.
--SELECT SQL문은 executeQuery() 메소드를 호출해야함.
**Statement 와 PreparedStatement 의 차이 .
--Statement 사용하면 매번 쿼리수행시 4단계를 거치고 ,
PreparedStatement 는 처음한번만 세단계 거친후 캐시에 담아 재사용.
--동일한 쿼리를 반복적으로 수행한다면 , PreparedStatement 가 DB에 적은 부하를주며, 성능도 좋다.
--Statement 는 executeQuery() , executeUpdate() 를 실행하는시점에 파라미터로 SQL문을 전달하는데,
이때 전달되는 SQL문은 완성된형태로 한눈에 SQL문을 파악하기 쉽다.
하지만, 매번 컴파일하기때문에 효율성이 떨어진다 .
EX ))) PreparedStatement 인터페이스를 사용하여 emp_tbl 새로운데이터 저장하기.
1. 실행할 SQL 문 작성하기.
--INSERT INTO emp_tbl (empno , ename) VALUES (? , ? ) ; -- 기본키, NOT NULL 제약조건 확인 .
public class TestJDBC {
// PreparedStatement 인터페이스 사용하여 INSERT INTO SQL문 실행
// 연결객체 : Connection pcon
// 사원번호 : int pempno
// 사원이름 : String pename
public void insert(Connection pcon, int pempno, String pename) {
//실행할 SQL 문장 문자열로 정의
String sql = "INSERT INTO emp_tbl (empno,ename) VALUES (?,?)";
//PreparedStatement 참조변수 선언
PreparedStatement ps = null;
try {
//SQL문 임시로 보관할 객체 생성
ps = pcon.prepareStatement(sql);
//SQL문 ?,? 자리에 값을 대입.
ps.setInt(1, pempno);
ps.setString(2, pename);
//SQL문 실행
int res = ps.executeUpdate();
//데이터베이스에 저장된 데이터 갯수(행) 을 출력
System.out.println("INSERT INTO SQL문 실행한 결과는 "+res);
}catch(SQLException e) {
e.printStackTrace();
}finally {
try {
if(ps !=null) ps.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
EX ))) SELECT MAX(empno)+1 FROM emp_tbl 실행하는 메소드
--EMPNO + 1 씩 증가 .
//SELECT MAX(empno)+1 FROM emp_tbl SQL 문 실행하는 메소드
//외부로부터 입력받을 값의 목록
// 1) 오라클 연결객체
//반환값 : MAX(empno)+1 , MAX(NVL(empno,0))+1
public int getNextEmpno(Connection pcon) {
//반환값 보관할 변수를 선언
int res = 0 ;
String sql = "SELECT MAX(empno)+1 FROM emp_tbl";
Statement s = null;
//SELECT 문의 결과를 ResultSet 타입으로 보관할 참조변수선언
ResultSet rs = null;
try {
//SELECT문 저장할 객체생성
s = pcon.createStatement();
//SELECT문 실행
rs = s.executeQuery(sql);
// next() 메소드 호출하여 값을 전달했는지 확인하기.
if(rs.next()==true) {
//get() 호출, 값을 가져와서 변수에 대입
res = rs.getInt(1);
System.out.println("오라클데이터베이스로부터 받은 값은 "+res);
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
try {
if( rs != null) rs.close();
if( s != null) s.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
return res;
}
EX ))) 예제문들 실행.
public static void main(String[] args) {
Connection con = null;
Statement st = null;
ResultSet rs = null;
// 메소드 호출
TestJDBC test = new TestJDBC();
try {
java.lang.Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("오라클 데이터베이스 연결 , 드라이버객체 생성");
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "user1", "1234");
System.out.println("오라클 DBMS에 연결되었습니다");
//getNextEmpno() 호출
int nextEmpNo = test.getNextEmpno(con);
System.out.println("getNextEmpno() 메소드 반환값: "+nextEmpNo);
//insert (Connection, int, String) 메소드 호출
test.insert(con,nextEmpNo,"홍길동");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(con !=null) con.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
'SelfStudy > Oracle (SQL)' 카테고리의 다른 글
SQL응용 JDBC (SELECT, INSERT, UPDATE) (2) | 2023.01.26 |
---|---|
SQL응용 JDBC (인덱스),throws (0) | 2023.01.25 |
SQL응용 JDBC (시퀀스 수정,확인) (0) | 2023.01.25 |
PL/SQL 트리거(Trigger) (0) | 2023.01.20 |
PL/SQL 커서(CURSOR) ,프로시저(PROCEDURE),저장함수(FUNCTION) (0) | 2023.01.19 |