Another Brain

22일차 (6월 16일)_ JDBC Programming - R = select 본문

P/SQL

22일차 (6월 16일)_ JDBC Programming - R = select

뉸누나ㄴ나 2021. 6. 17. 14:02

## JDBC (Java DataBase Connectivity)
-- JDBC = Java + Database(SQL) 연결 위한 표준 api
-- 회원관리시스템 : MEMBER 테이블
-- Pattern Programming
>> DTO Pattern
>> Dao Pattern
>> Singleton Pattern
>> Factory Pattern

-- 자바 : MemberService.java
>> 회원 관리를 위한 서비스 제공하는 기능
>> 사용할 SQL 구문
>> 내일 수업시에 완전 여유있게 수업참여가능


## 개발환경 환경설정
1. DBMS : oracle 설치

2. JDBC api : 
=> 자바에서 제공한 표준 api
=> java se 포함 (rt.jar => java.sql.*, javax.sql.*)

3. JDBC driver : 
=> db vendor가 구현해서 제공하는 구현물
=> oracle : ojdbc6.jar
=> 복사위치 : %java_home%\jre\lib\ext> ojdbc6.jar (공통 lib 위치)


## JDBC API
-- java.sql.*;
-- DriverManager
-- Connection
-- Statement / PreparedStatement / CallableStatement
-- ResultSet


## JDBC 프로그래밍 기본절차
1. 드라이버 로딩  
2. DB 서버연결 
3. SQL 통로개설
4. SQL수행요청
5. 결과처리
6. 자원해제


## JDBC Resource property
## Oracle
1. String driver = "oracle.jdbc.driver.OracleDriver";
2. String url = "jdbc:oracle:thin:@localhost:1521:XE";
3. String user = "scott";
4. String password = "tiger";


## JDBC 기본 예제

// 1. 드라이버 로딩 
Class.forName(driver);

// 2. DB 서버연결 
Connection conn = DriverManager.getConnection(url, user, password);

// 3-1. SQL 통로개설 : 동적 SQL 수행 
Statement stmt = conn.createStatement();

// 4-1. SQL수행요청
ResultSet rs = stmt.executeQuery("select * from dept");

// 3-2. SQL 통로개설 : 정적 SQL 수행 
PreparedStatement stmt = conn.preparetatement("select * from dept where dname=?");
stmt.setString(1, dname);

// 4-2. SQL수행요청
ResultSet rs = stmt.executeQuery();

// 5. 결과처리
while(rs.next()) {
int deptno = rs.getInt("deptno");
String dname = rs.getString("dname");
String loc = rs.getString("loc");
}

// 6. 자원해제
rs.close();
stmt.close();
conn.close();


## 예외처리
1. SQLException : dbms 
2. ClassNotFoundException : jdbc driver loading


## SQL 통로
-- Statement 
=> 동적 SQL 수행
=> sql 구문오류 실행시(runtime) 발생
=> sql '문자열' 변환 번거로움
=> "sql수행문" n/w traffic 증가

Statement stmt = conn.createStatement();
stmt.executeUpdate(sql);
stmt.executeQuery(sql); >>

-- PreparedStatement  ***
=> 전용통로 장점 : n/w 트래픽 감소, 
=> 정적 SQL 수행 : sql 전용통로 , sql문자열 자동변환, 보안(SQL INJECTION)
String sql = "insert into dept values(?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);

// ? 기호에 매핑되는 값을 설정해서 sql 통로 완성
// setXxx(index, 값) : index는 ?의 위치, 시작은 1번부터
// setString(1, 변수명) => 문자열 => 'sql문자열' 변환
pstmt.setInt(1, deptno);
pstmt.setString(2, dname);
pstmt.setString(3, loc);

// 전용통로이기때문에 실행시 sql 구문을 지정해서는 안됨(주의)
pstmt.executeUpdate();

-- CallableStatement
=> Stored function, Stored procedure 호출 사용 통로
=> PL/SQL


## SQL 수행요청 메서드
-- R : executeQuery(sql) : ResultSet
-- CUD : executeUpdate(sql) : int
-- 기타 : execute(sql) : boolean


## ResultSet API
-- select 수행결과 객체
-- select 결과 유무 및 해당레코드 커서 이동 : next()
-- 해당레코드 컬럼데이터 가져오기 : 
=> getXxx(select컬럼인덱스번호) : xxx타입
=> getXxx("select컬럼명") : xxx타입
=> xxx : getString(), getInt(), getDate() 등


TIP

 

## 기본 JAVA PROJECT 설정 >> 파일 "JAVA WorkSpace 환경설정" 에 저장

Comments