JDBC(Java Database Connectivity)
: Java에서 데이터베이스에 접근할 수 있게 해주는 Programming API이다.
- java.sql 패키지를 사용한다.
JDBC 사용 객체
(1) DriverManager
: 데이터 원본에 JDBC Driver를 통하여 Connection을 만드는 객체이다.
① Class.forName()을 통해 생성되며 반드시 예외 처리를 해야 한다.
② DriverManager 클래스의 getConnection()을 사용하여 객체를 생성한다.
이때, Connection 객체 생성 시에 직접 객체 생성이 불가능하다.
(2) Connection
: 데이터베이스의 연결 정보를 담고 있는 객체이다. (IP주소, PORT번호, 계정명, 비밀번호)
① Statement 객체를 생성할 때 Connection 객체를 사용하여 createStatement()를 호출하여 생성한다.
② SQL문을 실행시키기 전에 Connection 객체가 있어야 한다.
(3) (Prepared)Statement
: 해당 데이터베이스에 SQL문을 전달하고 실행한 후 결과를 받아내는 객체이다.
- Statement
① Connection 클래스의 createStatement()를 호출하여 얻어진다.
② 생성된 Statement 객체로 질의 문장을 String 객체에 담아 인자로 전달해서 executeQuery()를 호출하여
SQL 질의를 수행한다.
- PreparedStatement
① Connection 객체의 preparedStatement()를 사용하여 객체를 생성한다.
② 각 인수에 대해 위치홀더(?)를 사용해서 SQL문을 정의할 수 있게 한다.
③ Statement와 다른 점: SQL문이 미리 컴파일되고 실행할 동안 인수값을 위한 공간을 확보한다.
(4) ResultSet
: 실행한 SQL문이 SELECT문일 경우에 조회된 결과들이 담겨 있는 객체이다.
JDBC 처리 절차(Oracle SQL 기준)
(1) JDBC Driver 등록하기
: DriverManager에 해당 DBMS(Database Manager System) Driver를 등록한다.
이때, 반드시 ClassNotFoundException 처리를 해야 한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
(2) Connection 생성하기
: 접속할 데이터베이스에 정보를 입력하여 데이터베이스에 접속하면서 생성한다.
이때, 반드시 SQLException 처리를 해야 한다.
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
(3) Statement 생성하기
: Connection 객체를 사용하여 생성한다. 이때, 반드시 SQLException 처리를 해야 한다.
Statement stmt = conn.createStatement();
(4) SQL문을 전달하면서 실행하고 결과 받기
: Statement 객체를 사용하여 SQL문을 실행한다. SELECT문일 경우엔 executeQuery()를 사용해서 실행하고,
DML문일 경우엔 executeUpdate()를 사용해서 실행한다.
① SELECT문일 경우
: ResultSet 객체로 받아서 해당 객체에 담긴 데이터들을 하나씩 뽑아 VO 객체에 담는다.
ArrayList로 묶어서 관리한다.
② DML문일 경우
: int형 변수로 처리된 행들을 받아서 처리한다.
// SELECE문
String sql = "SELECT * FROM STUDENT";
ResultSet rset = stmt.executeQuery();
// DML문(UPDATE)
String sql2 = "UPDATE STUDENT SET ST_GRADE = 3 WHERE ST_NAME = '서동요'";
int result = stmt.executeUpdate();
③ SQL문을 트랜잭션 처리를 하는데, if문으로 성공이면 'COMMIT;'을, 실패면 'ROLLBACK;'을 한다.
(5) 사용 완료한 객체 반환하기
: 생성한 역순으로 객체를 반환한다.
rset.close(); // ResultSet 객체를 사용한 경우에 반환 처리한다.
stmt.close();
conn.close();
- SQL문
CREATE TABLE STUDENT(
ST_NO NUMBER,
ST_NAME VARCHAR2(20),
ST_DATE DATE
);
- SELECT문
package jdbc;
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 Select {
public static void main(String[] args) {
Connection conn = null; // DB에 연결 정보를 보관할 객체 Connection
Statement stmt = null; // SQL문을 전달해서 실행한 후 결과를 담을 객체 Statement
ResultSet rset = null; // SELECT문은 ResultSet으로 담는다.
String sql = "SELECT * FROM STUDENT";
try {
// JDBC Driver 등록
Class.forName("oracle.jdbc.driver.OracleDriver");
// Connection 객체 생성(DB에 연결(URL, 계정명, 비밀번호))
// localhost(ip주소), 1521(port번호), xe(버전)
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
// Statement 객체 생성
stmt = conn.createStatement();
// SQL문을 전달하면서 실행한 후 ResultSet결과 받기
// SELECT문은 executeQuery()
rset = stmt.executeQuery(sql);
// 참고하고 있는 rset으로부터 어떤 컬럼에 해당하는 값을 어떤 타입에 담을 것인지 제시한다.
// next(): 다음 위치로 커서 이동. 다음 위치가 있으면 true, 없으면 false
while(rset.next()) {
int stNo = rset.getInt("ST_NO"); // DB의 컬럼명 제시
String stName = rset.getString("ST_NAME");
Date sDate = rset.getDate("ST_DATE");
System.out.println(stNo + ", " + stName + ", " + sDate);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally { // 사용한 객체 반환하기(생성한 역순으로 반환)
try {
rset.close();
stmt.close();
conn.close();
}
}
if(result > 0) { // SQL문 삽입에 성공한 경우
System.out.println("삽입 성공");
} else { // SQL문 삽입에 실패한 경우
System.out.println("삽입 실패");
}
}
}
- DML문
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Dml {
public static void main(String[] args) {
Connection conn = null; // DB에 연결 정보를 보관할 객체 Connection
Statement stmt = null; // SQL문을 전달해서 실행한 후 결과를 담을 객체 Statement
int result = 0; // DML문은 int형 변수로 받아서 처리
// 번호, 이름, 등록일
String sql = "INSERT INTO STUDENT VALUES (15, '이순신', SYSDATE)";
try {
// JDBC Driver 등록
Class.forName("oracle.jdbc.driver.OracleDriver");
// Connection 객체 생성(DB에 연결(URL, 계정명, 비밀번호))
// localhost(ip주소), 1521(port번호), xe(버전)
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");
// Statement 객체 생성
stmt = conn.createStatement();
// SQL문을 전달하면서 실행한 후 결과 받기
result = stmt.executeUpdate(sql);
// 트랜잭션 처리
if(result > 0) { // 성공한 경우(처리된 행의 개수가 1 이상일 경우)
conn.commit();
} else { // 실패한 경우
conn.rollback();
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally { // 사용한 객체 반환하기(생성한 역순으로 반환)
try {
stmt.close();
conn.close();
}
}
if(result > 0) { // SQL문 삽입에 성공한 경우
System.out.println("삽입 성공");
} else { // SQL문 삽입에 실패한 경우
System.out.println("삽입 실패");
}
}
}