JDBC(Java Database Connectivity) - Oracle을 활용한 JSP와 DB연동
오라클 설치
http://www.oracle.com를 방문하고 Downloads 메뉴에서 Oracle Database 11g Express Edition1을 선택한다.
JDBC 드라이버 설치
오라클 JDBC드라이버 경로
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
디렉토리에 있는 파일 중 ojdbc6.jar 가 우리가 사용할 JDBC 드라이버이다.
[작업할 프로젝트 마우스 우클릭]
[Build Path] -> [Configure Build Path...]
[Libraries 탭] -> [Add External JARs]
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar
JSP와 데이터베이스 연동
JDBC 프로그램의 작성 단계
- JDBC 드라이버 Load
- Connection 객체 생성
- Statement/PreparedStatement/CallableStatement 객체 생성
- Query 수행
- ResultSet 처리
- 연결 해제
1. JDBC 드라이버 Load
1 | Class.forName ("oracle.jdbc.driver.OracleDriver"); |
1단계(JDBC 드라이버 Load) : 인터페이스 드라이버(interface driver)를 구현(implements)하는 작업으로, Class 클래스의 forName() 메소드를 사용해서 드라이버를 로드.
2. Connection 객체 생성
1 | Connection conn= DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger"); | cs |
JDBC API는 대부분 인터페이스이다. DriverManager는 우리 예제에서 유일하게 온전한 클래스다. DriverManager는 이름 그대로 데이터베이스 벤더들이 선의 JDBC API를 구현한 드라이버를 관리한다. DriverManager.getConnection(,,) 메서드는 인자로 들어오는 값에 따라서 특정 데이터베이스 벤더가 구현한 Connection 타입의 객체를 반환한다. Connection 객체가 생성은 데이터베이스와 연결이 확립되었음을 의미한다.
3. Statement/PrepardStatement/CallableStatement 객체 생성
1 2 | // Statement 객체 생성 Statement stmt = conn.createStatement(); | cs |
Statement 객체 생성을 하면서 Statement 객체의 메소드를 사용할수 있다.
4. Query 수행
1 2 | // SQL문을 실행한다. ResultSet rs = stmt.executeQuery(query); | cs |
: 하나의 ResultSet을 만드는 SQL문에서 사용(executeQyery 메소드는 ResultSet 객체를 리턴한다.)
: 주로 SELECT문을 이용하는 조회에서 사용됨.
1 2 | // sql문 실행과 성공한 row수 반환 => Insert 문, Update 문, Delete 문에서 사용 int aftcnt = stmt.executeUpdate(sql); |
② executeUpdate 메소드
: INSERT, UPDATE, DELETE 등 (DML), CREATE, DROP 등(DDL)문들을 실행하는데 사용
└ DML을 사용할 경우 리턴값 : 작용한 열의 개수(갱신 카운트로 간주되는)를 나타내는 정수
└ DDL을 사용할 경우 리턴값 : 0을 리턴(DML을 실행 후 아무런 영향을 주지 않은 경우에도 '0'을 리턴한다.)
5. ResultSet 처리
1 2 3 4 5 6 7 8 | while( rs.next() ) { Emp emp = new Emp( rs.getInt("empno"), rs.getString("ename"), rs.getString("job"), rs.getInt("mgr"), rs.getString("hiredate"), rs.getDouble("sal"),rs.getDouble("comm"), rs.getInt("deptno")); empList.add(emp); } | cs |
5단계(ResultSet 처리) : executeQuery()메소드는 수행 결과로 ResultSet을 반환.
ResultSet 객체로부터 원하는 데이터를 추출.
데이터를 추출하는 방법은 ResultSet 객체에서 next()메소드를 사용해
한 행씩 이동하면서 getXxx()를 이용해서 원하는 필드 값을 추출.
문자열 데이터를 갖는 필드는 rs.getString("name") 혹은 rs.getString(1) 로 사용.
ResultSet의 첫 번째 필드는 1부터 시작.
rs.getString("name")과 같이 필드명을 사용하는 것이 권장 형태.
6. 연결 해제 - Close
1 2 3 4 5 6 | // ResultSet를 닫는다. rs.close(); // Statement를 닫는다. stmt.close(); // Connection를 닫는다. conn.close(); | cs |
JDBC 프로그래밍에 사용되는 객체
① DriverManager 클래스
1 2 3 4 5 6 7 8 9 | try { // 드라이버를 로딩한다. Class.forName("oracle.jdbc.driver.OracleDriver"); // 한번에 예외처리할때 Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); } catch (ClassNotFoundException e ) { e.printStackTrace(); } | cs |
② Connection 클래스
1 2 3 | // getConnection() 메소드를 사용해 Connection 객체 conn을 생성 Connection conn = DriverManager.getConnection( DB_URL, DB_USER, DB_PASSWORD); | cs |
③ Statement 인터페이스
1 2 3 4 5 | try { // Statement 객체는 Connection 클래스의 createStatement() 메소드로 생성 Statement stmt = conn.createStatement(); } catch (Exception e) { e.printStackTrace(); } | cs |
④ PreparedStatement 인터페이스
1 2 3 4 5 6 7 8 9 10 11 | try { String sql="insert into emp values(?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,101); pstmt.setString(2,"Ratan"); int i=stmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } | cs |
⑤ CallableStatement 인터페이스
1 2 3 4 5 | try { // Connection 객체의 prepareCall() 메소드로 CallableStatement 객체 생성 CallableStatement cstmt = conn.prepareCall(); } catch (Exception e) { e.printStackTrace(); } | cs |
⑥ ResultSet 인터페이스
SQL문이 select 문이면 반환한 레코드를 저장할 객체가 필요하다. 이때 레코드를 담는 그릇이 ResultSet이다
1 2 3 4 5 6 7 8 9 10 | // Select문을 반환 데이터를 저장할 객체가 ResultSet이다. ResultSet rs = stmt.executeQuery(sql); System.out.println("----"+input_name+"님 글 검색 결과-------"); while(rs.next()){ int idx=rs.getInt(1); String name=rs.getString(2); String msg=rs.getString(3); Date wdate=rs.getDate(4); System.out.println(idx+"\t"+name+"\t"+msg+"\t"+wdate); } | cs |
1) ResultSet.next() : Cursor를 다음 Row로 이동
2) ResultSet.previous() : Cursor를 이전 Row로 이동
3) ResultSet.first() : Cursor를 ResulSet의 처음으로 이동
4) ResultSet.last() : Cursor를 ResulSet의 마지막으로 이동
5) ResultSet.isFirst() : 현재 Cursor가 첫 Row인지를 확인
6) ResultSet.isLast() : 현재 Cursor가 마지막 Row인지를 확인
7) ResultSet.getType() : ResultSet의 Type을 Return (Type은 아래 참조 (A))
8) ResultSet.getCucurrency() : Concurrency의 Type을 Return (Type은 아래 참조 (B))
9) ResultSet.getRow() : 현재 Cursor가 가리키고 있는 Row Number
참고자료
자바스쿨 JDBC 학습자료 - http://java-school.net/jdbc/JDBC-Intro
'Datebase' 카테고리의 다른 글
MySQL 한글 깨짐 현상 해결하기(UTF8 기본값 설정하기) (0) | 2018.01.30 |
---|---|
JDBC(Java Database Connectivity) - MySQL, Oracle DB 연동 (0) | 2018.01.30 |
MySQL 무설치 버전 설치하기 - Window (0) | 2018.01.26 |
SQL문 - DDL(Data Definition Language) (1) | 2018.01.25 |
SQL 문법 - SELECT 문 (0) | 2018.01.24 |