* JDBC(Java Database Connectivity)란?
자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API.
자바 언어로 데이터베이스 데이터 조작 가능하도록한다.
JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트 하는 방법을 제공한다.
by 위키백과
* 자바 API
JDBC는 JAVA 애플리케이션에서 데이터베이스에 접근하기 위해 자바 API 사용, 데이터 베이스에 연동한다.
Oracle, MS SQL, MySQL 등 각각의 데이터베이스 관리 시스템(DBMS)에 맞춘 JDBC 드라이버를 구현해 제공한다.
* JDBC 동작 흐름
JAVA 애플리케이션 → JDBC API → JDBC 드라이버 → 데이터베이스
* JDBC API 동작 흐름
JDBC 드라이버 로딩 → Connection 객체 생성 → Statement 객체 생성 → SQL문 수행(Query 실행)
→ ResultSet 객체에 결과 받아, 데이터 조회 → 객체 Close : 객체 생성할 때와 역순 (ResultSet, Statement, Connection 객체 순서)
JAVA와 SQL을 연결하기 위한 환경 세팅
1. ojdbc6.jar 파일 복사
DBMS 실습을 위한 작업환경을 구성할 때 설치했던 Oracle XE 파일에 위치한 ojdbc6.jar 파일을 복사한다.
나의 경우에는 아래와 같은 주소에 위치해 있었다.
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
2. ojdbc6.jar 파일 java 설치파일에 붙여넣기
다운로드받은 자바 설치파일에 넣어준다.
내 경우 경로는 아래와 같았으나
C:\dev_tool
구글 검색을하면 주로 jre폴더의 lib에 넣어주는 듯 하다.
C:\dev_tool\java-1.8.0\jre\lib
3. 이클립스에서 Libararies에 추가
마우스 우클릭 후 properties에서 Java Build Path → Add Exterbak JARs → ojdbc6.jar 파일 위치 추가
연동을 위한 자바 코드
1) JDBC Driver 등록
해당 DBMS(오라클)가 제공하는 클래스 등록
2) Connection 생성
연결하고자하는 db정보를 입력해서 해당 db와 연결할 수 있는 객체 생성
3) Statement 생성
Connection 객체를 이용해서 생성(sql문 실행 및 결과 받는 객체)
자바에서 SQL로 보내고 받기 위한 통로
4) sql문 전달하며 실행
Statement 객체를 이용해서 sql문 실행
5) 결과받기 :
> DML문 실행(INSERT, UPDATE, DELETE)(6-1) => int(행 수가 반환되기 때문에 int 로 받는다.)
> SELECT 문 실행(6-2) => ResultSet 객체 (조회된 결과를 담아준다.)
6-1) 트랜잭션 처리(성공했다면 commit, 실패했다면 rollback 실행)
6-2) ResultSet 객체에 담겨있는 데이터를 하나씩 추출해서 옮겨 담기[+ ArrayList에 담기]
7) 사용 끝난 JDBC용 객체를 반드시 자원 반납 (close) => 생성 역순으로
코드 예시 1 )
내가 실행할 sql문이 DML(insert, update, delete)문 : Statement만 이용, ResultSet 노필요,
(Test용 Table 이용 : TNO, TNAME, TDATE 컬럼 유)
- result 에 결과값(처리된 행 수) int로 받아줌(ResultSet 없음) : result = stmt.executeUpdate(sql);
// 1. 각자의 pc(localhost)에 jdbc 계정 연결 후 test 테이블에 insert 하기
// insert => 처리된 행 수 (int) => 트랜잭션 처리
// 변수 세팅
int result = 0; // 결과(처리된 행 수)를 받아줄 변수
Connection conn = null; // DB 연결정보 보관 객체
Statement stmt = null; // sql문 전달, 실행 후 결과를 받는 객체
Scanner sc = new Scanner(System.in);
System.out.print("번호 : ");
int num = sc.nextInt();
sc.nextLine();
System.out.print("이름 : ");
String name = sc.next();
sc.nextLine();
// 실행할 sql문 만들기
String sql = "INSERT INTO TEST VALUES(" + num + ", '" + name + "', SYSDATE)";
try {
// 1) JDBC Driver 등록
Class.forName("oracle.jdbc.driver.OracleDriver"); // 오류나면? ojdbc6.jar 파일 추가하지 않았을까 확인 또는 오타
System.out.println("OracleDriver 등록성공");
// 2) Connection 생성("url", "계정명", "비밀번호")
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
// 3) Statement 생성
stmt = conn.createStatement();
// 4, 5) sql문 전달하며 실행 후 결과 받기(처리된 행 수)
// 내가 실행할 sql문이 DML(insert, update, delete)문 일 때 -> stmt.executeUpdate(sql문)
// 내가 실행할 sql문이 select문 -> stmt.executeQuery(select문) : ResultSet
result = stmt.executeUpdate(sql);
// 6) 트랜잭션 처리
if(result > 0) { // 요청한 sql문 성공
conn.commit();
} else {
conn.rollback(); // 요청한 sql문 실패
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
// 7) 다 쓴 jdbc용 객체 자원반납(생성과 역순으로)
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 요청한 sql문 성공여부: 행 수가 반환되기 때문에 int 로 받는다
if(result > 0) { // 요청한 sql문 성공
System.out.println("데이터 삽입 성공");
} else {
System.out.println("데이터 삽입 실패");
}
코드 예시 2)
내가 실행할 sql문이 SELECT문 : ResultSet 필요
(Test용 Table 이용 : TNO, TNAME, TDATE 컬럼 유)
- ResultSet 객체에 실행 결과값 받기 (int result 없음) : rset = stmt.executeQuery(sql);
// 2. 내 pc db상의 jdbc계정에 TEST 테이블 데이터 전체 조회
// select문으로 데이터 가져옴 => ResultSet(조회된 데이터가 담김) => ResultSet에서 데이터 추출
// 필요 변수 세팅
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
// 실행할 sql문 작성
String sql = "SELECT * FROM TEST";
try {
// 1) JDBC Driver 등록 - 드라이버 불러와라
Class.forName("Oracle.jdbc.driver.OracleDriver");
System.out.println("OracleDriver 등록성공");
// 2) Connection 생성("url", "계정명", "비밀번호") - sql 계정에 로그인해라
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521Lxe", "JDBC", "JDBC");
// 3) Statement 생성
stmt = stmt.executeQuery(sql);
// 4, 5) sql문 전달해서 실행 수 결과 받기(ResultSet)
rset = stmt.executeQuery(sql);
while (rset.next()) {
// rset.next() => rset의 다음행이 들어있는지 없는지 확인 후 결과반환 + 한 행 내려가서 다시 확인
// 첫 시작은 제목줄 : 결과 유무는 true, false
// 현재 참조하는 rset으로부터 어떤 컬럼에 해당하는 값을 어떤 타입으로 추출할건지 제시해줘야
// db의 컬럼명 제시(대소문자 구별 x)
int tno = rset.getInt("TNO");
String tname = rset.getString("TNAME");
Date tdate = rset.getDate("TDATE");
System.out.println(tno + ", " + tname + ", " + tdate);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
// 7) 다 쓴 jdbc용 객체 자원반납(생성과 역순으로)
rset.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
'JAVA' 카테고리의 다른 글
JAVA 자꾸 혼자 헷갈리는 내용 정리 1 (+ 계속 추가중) (0) | 2024.03.05 |
---|---|
MVC(model-view-controller) : 과제를 위한 정리 (0) | 2024.03.04 |
JAVA Collection Framework 4: Iterator(반복자)을 이용한 데이터 출력 (1) | 2024.02.26 |
JAVA 생성자(Constructor), this() / this, super() / super (0) | 2024.02.15 |
JAVA Collection Framework 3: HashSet을 통한 Hash 탐구 (0) | 2024.02.13 |