기타
[JDBC] JDBC란? / JDBC 사용객체 / JDBC 처리, 동작순서
무럭무럭새싹
2022. 10. 5. 20:45
JDBC (Java Database Connectivity)
-Java가 제공하는, Java프로그램 내에서 Database로 접근할 수 있도록 해주는 표준 인터페이스( 프로그래밍 API)
---> 자바프로그램 내에서 SQL문을 실행하기 위한 자바 API
- 자바를 이용한 데이터베이스 접속과 SQL문장의 실행, 그리고 실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약
-- > 자바 프로그래밍 언어로 관계형 데이터베이스에 접속하여 데이터를 주고받을 수 있도록 지원하는 자바 표준 API
- JDBC API는 자바 프로그래밍 언어로 작성된 인터페이스, 클래스, 및 예외 클래스들의 집합으로 구성
- SQL을 이용해 자바 프로그래밍 언어로 데이터베이스 응용 프로그래밍을 작성할 수 있도록 지원
- 벤더 독립적 : 서로 다른 데이터베이스일지라도 일관적인 방법으로 관계형 데이터베이스에 접근 가능함
(JVM이 설치된 모든 종류의 DBMS에서 실행 가능)
- 역할
1) Java코드를 통해 DB 서버 접속
2) SQL문을 구성하고 DB서버에서 실행
3) DB서버에서 처리한 결과 가져오기
* JDBC Driver
DBMS 회사들이 자신들의 데이터베이스 시스템에 접근할 수 있도록 표준 JDBC 인터페이스에 명시된 메소드들을 구현한 것
JDBC 사용객체
DriverManager | JDBC 드라이버를 통해서 커넥션을 만드는 역할 Class.forName() 메소드를 통해 생성, 예외처리 필수 getConnection()메소드를 호출하여 Connection객체를 반환받음 |
Connection | 특정 데이터 원본과 연결된 객체 DB의 연결정보를 담고 있는 객체 (ip주소, port번호, 계정명, 비밀번호) |
Statement | 해당 DB에 SQL문을 전달하고 실행한 후 결과를 받아내는 객체 --> 특징: 완성된 SQL문을 실행할 수 있는 객체임 Connection객체에 의해 프로그램에 구현되는 일종의 메소드 집합 Connection클래스의 createStatement()를 호출하여 객체 생성 Statement객체로 SQL문을 String객체로 담아 인자값으로 전달하여 질의 수행 |
Result Set | SELECT문을 사용한 질의 성공시 반환되는 객체 (만일 실행한 SQL문이 SELECT문일 경우 조회된 결과가 result set객체에 들어감) SQL 질의에 해당하는 결과를 담고 있으며 '커서(CURSOR)'를 이용하여 특정 행에 대한 참조를 조작 |
JDBC 처리 / 동작순서 (중요!)
SELECT문 | DML문 |
1. 변수 세팅 Conntection, Statement, ResultSet or int |
|
2. 실행할 SQL문 만들기(완성된 형태) String sql = ~~ |
|
3. JDBC Driver 등록: 해당 DBMS가 제공하는 클래스 등록 Class.forName() + 예외처리 (ClassNotFoundException: 드라이버 경로 오류 ojdbc6.jar가 누락되거나, 추가했지만 오타가 있을 경우) |
|
4. Connection객체 생성: 접속하고자 하는 DB정보를 입력하여 DB에 접속하면서 생성 DriverManager.getConnection(url, 계정명, 비밀번호) + 예외처리 (SQL Exception: url, 계정명, 비밀번호 오류) ---> 반환받은 connection 객체를 받아줌 |
|
5. Statement 객체생성: Connection객체를 이용하여 생성 stmt = connection객체.createStatement(); |
|
6. SQL문을 전달하면서 실행: Statement객체를 이용하여 SQL문 실행 (DB에 완성된 SQL문을 전달하고, 실행하고, 결과받기) stmt.execute~(); |
|
executeQuery() | executeUpdate() |
7. 결과받기 resultSet/int = stmt.execute~(); |
|
resultSet객체 (조회데이터가 담겨있음)으로 받음 (resultSet에 담겨있는 데이터를 한줄씩 추출 후 vo객체에 담음) |
int(처리된 행수)로 받음 ---> 트랜잭션처리 (성공시 commit, 실패시 rollback) |
8. 자원반납 close메소드를 이용하여 자원이 생성된 역순으로 반납 Finally 블럭 내 + 예외처리 (SQLException) |
|
9. 결과반환 (to Controller) | |
vo 객체 반환 | int(처리된 행수) 반환 |
<DML문> : statement의 execute 메소드 수행결과가 int형으로 반환, 트랜젝션 처리 필수
package com.cc.test;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestRun {
public static void main(String[] args) {
//1. 변수세팅
//--> jdbc 관련내용은 java.sql 패키지에서 import
int result = 0;
Connection conn = null; //import java.sql.Connection;
Statement stmt = null; // import java.sql.Statement;
// 2. 실행 sql문 만들기 ("완성형태"로 만들기)
String sql = "INSERT INTO TEST VALUES(1, 'JDBC', SYSDATE) ";
// 3. JDBC DRIVER등록 -- Class.forName(); , 예외처리필수
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("driver등록 성공!");
// 4. Connection 객체 생성
// -- DriverManager 클래스의 getConnection()호출 , DB 연결(url, 계정명, 비밀번호)
conn = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC"); // 반환형 => Connection
System.out.println("Connection 객체생성");
// 5. Statement객체 생성 -- Connection클래스 createStatement()호출
// 접속정보가 conn에 담겨 있으니, conn 객체를 가지고 객체를 만든다
stmt = conn.createStatement(); // 반환형 -> Statement(쿼리도 보내고 결과도 받아옴)
System.out.println("Statement 객체생성");
// 6. 쿼리문 전달 및 실행
// 7. 결과받기 executeUpdate();
// dml: 처리된 행수반환 (int 타입)
// select절: result set 반환 (Result set 타입)
result = stmt.executeUpdate(sql); // 결과가 정수로 옴 (행수)
// dml: 트랜젝션 처리
if (result >0) { // 성공했을 경우 commit (커밋,롤백담당은 conn)
conn.commit(); // commit() 호출
} else {
conn.rollback(); // rollback() 호출
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
// 8. 자원반납 : try-catch문 내, 객체 생성의 역순으로
} finally {
try {
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 9. 결과반환
if (result>0) {
System.out.println("insert 성공");
} else {
System.out.println("insert 실패");
}
}
}
<SELECT문> :statement의 execute메소드 수행결과가 ResultSet타입으로 반환
public ArrayList<Member> selectAll() {
// 1. 변수선언
ArrayList<Member> list = new ArrayList();
Connection conn = null;
Statement stmt = null;
ResultSet rset = null; // sql문의 결과(Result set)를 받아줄 변수
// 2. 실행에 필요한 완성된 SQL문
String sql ="SELECT * FROM MEMBER" ;
// 3. JDBC드라이버 등록
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe" ,
"JDBC","JDBC");
// 4. Statement객체 생성
stmt = conn.createStatement();
// 5. sql문 실행 후 결과 돌려받기
rset = stmt.executeQuery(sql);
// 6. rset으로 받은 resultset을한행씩 빼서 member형 객체에 저장하기
// ResultSet.next메소드: 커서를 한 줄 아래로 옮겨주고 해당 행이 존재할 경우 t, 아니면 f반환
while (rset.next()) {
// 현재 rset의 커서가 가리키고 있는 행의 데이터를 하나씩 추출한 후 담아줄 member 객체 생성
Member m = new Member();
// rest.getInt(컬럼명or 컬럼순번)
// rset.getString (컬럼명or 컬럼순번)
// rset.getDate(컬럼명or 컬럼순번)
// 컬럼명은 대소문자를 구분하지 않음
// 권장사항: 컬럼명을 대문자로 쓰는 것을 권장!
m.setUserNo(rset.getInt("USERNO")); //현재 커서가 가리키고 있는 행의 "USERNO"값 추출
m.setUserId(rset.getString("USERID"));
m.setUserPwd(rset.getString("USERPWD"));
m.setUserName(rset.getString("USERNAME"));
m.setGender(rset.getString("GENDER"));
m.setAge(rset.getInt("AGE"));
m.setEmail(rset.getString("EMAIL"));
m.setPhone(rset.getString("PHONE"));
m.setAddress(rset.getString("ADDRESS"));
m.setHobby(rset.getString("HOBBY"));
m.setEnrollDate(rset.getDate("ENROLLDATE"));
// 한 행에 대한 모든컬럼의 값을 Member객체에 옮겨담기 성공
//list에 해당 맴버객체를 담아주면 끝
list.add(m);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rset.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 결과반환(조회 결과를 추출한 후 담은 list 객체)
return list;
}
ojDBc6.jar
프로젝트 선택 후 마우스 우클릭 -> properties -> JavaBuildPath -> Libraries -> Add External JARs -> c:\dev\ojDBc6.jar 선택 -> apply -> apply and close References Libraries에 ojDBc6 추가여부 확인 ==> 해당 작업 미수행시 ClassNotFoundException 발생