자바 어플리케이션에서도 직접 관계형 DBMS를 제어할 수 있다. 그러한 역할을 돕는 API가 JDBC(Java DataBase Connectivity) API이다.
1. JDBC 드라이버 로딩
Class.forName("JDBC드라이버 이름");
으로 JDBC 드라이버를 로딩한다.
2. Connection 객체 생성
로드한 JDBC 드라이버를 통해 관계형 DBMS와 연결하는 단계
getConncetion
메서드를 가짐
3. Statement 객체 생성
해당 객체는 쿼리를 생성 및 실행할 작업 영역을 제공
4. 쿼리수행
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionTest {
public static void main(String[] args) {
// java 표준인 java.sql.Connection 클래스를 import해야 한다.
Connection conn = null;
try{
// 1. 드라이버 로딩
// 드라이버 인터페이스를 구현한 클래스를 로딩
// mysql, oracle 등 각 벤더사 마다 클래스 이름이 다르다.
// mysql은 "com.mysql.jdbc.Driver"이며, 이는 외우는 것이 아니라 구글링하면 된다.
// 참고로 이전에 연동했던 jar 파일을 보면 com.mysql.jdbc 패키지에 Driver 라는 클래스가 있다.
Class.forName("com.mysql.jdbc.Driver");
// 2. 연결하기
// 드라이버 매니저에게 Connection 객체를 달라고 요청한다.
// Connection을 얻기 위해 필요한 url 역시, 벤더사마다 다르다.
// mysql은 "jdbc:mysql://localhost/사용할db이름" 이다.
String url = "jdbc:mysql://localhost/dev";
// @param getConnection(url, userName, password);
// @return Connection
conn = DriverManager.getConnection(url, "dev", "dev");
System.out.println("연결 성공");
}
catch(ClassNotFoundException e){
System.out.println("드라이버 로딩 실패");
}
catch(SQLException e){
System.out.println("에러: " + e);
}
finally{
try{
if( conn != null && !conn.isClosed()){
conn.close();
}
}
catch( SQLException e){
e.printStackTrace();
}
}
}
}
public class SelectTest {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
// 1. 드라이버 로딩
Class.forName("com.mysql.jdbc.Driver");
// 2. 연결하기
String url = "jdbc:mysql://localhost/dev";
conn = DriverManager.getConnection(url, "dev", "dev");
// 3. 쿼리 수행을 위한 Statement 객체 생성
stmt = conn.createStatement();
// 4. SQL 쿼리 작성
// 주의사항
// 1) JDBC에서 쿼리를 작성할 때는 세미콜론(;)을 빼고 작성한다.
// 2) SELECT 할 때 * 으로 모든 칼럼을 가져오는 것보다
// 가져와야 할 칼럼을 직접 명시해주는 것이 좋다.
// 3) 원하는 결과는 쿼리로써 마무리 짓고, java 코드로 후작업 하는 것은 권하지 않음
// 4) 쿼리를 한 줄로 쓰기 어려운 경우 들여쓰기를 사용해도 되지만 띄어쓰기에 유의 !!
String sql = "SELECT name, owner, date_format(birth, '%Y년%m월%d일' date FROM pet";
// 5. 쿼리 수행
// 레코드들은 ResultSet 객체에 추가된다.
rs = stmt.executeQuery(sql);
// 6. 실행결과 출력하기
while(rs.next()){
// 레코드의 칼럼은 배열과 달리 0부터 시작하지 않고 1부터 시작한다.
// 데이터베이스에서 가져오는 데이터의 타입에 맞게 getString 또는 getInt 등을 호출한다.
String name = rs.getString(1);
String owner = rs.getString(2);
String date = rs.getString(3);
System.out.println(name + " " + owner + " " + date);
}
}
catch( ClassNotFoundException e){
System.out.println("드라이버 로딩 실패");
}
catch( SQLException e){
System.out.println("에러 " + e);
}
finally{
try{
if( conn != null && !conn.isClosed()){
conn.close();
}
if( stmt != null && !stmt.isClosed()){
stmt.close();
}
if( rs != null && !rs.isClosed()){
rs.close();
}
}
catch( SQLException e){
e.printStackTrace();
}
}
}
}
public int insertBoard(Board board) {
Connection conn = null;
PreparedStatement pstmt = null;
//url, user, password
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String user = "kosta236";
String password = "1234";
String sql = "insert into board values(board_seq.nextval,?,?,?,sysdate,0)";
int re = -1;
try {
//1단계 : JDBC 드라이버 로딩 => 어떤 DB?
Class.forName("oracle.jdbc.driver.OracleDriver");
//2단계 : DB 연결 (Connenction 객체 생성)
conn = DriverManager.getConnection(url, user, password);
System.out.println("conn : " + conn);
//3단계 : PrepareStatement 객체 생성(SQL 질의)
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, board.getTitle());
pstmt.setString(2, board.getWriter());
pstmt.setString(3, board.getContents());
//4단계 : SQL문 실행(re => 실행된 row 갯수)
re = pstmt.executeUpdate(); //insert, update, delete
} catch (Exception e) {
e.printStackTrace();
}finally {
if(pstmt != null) {
try {
pstmt.close();
} catch (Exception e2) {}
}
if(conn != null) {
try {
conn.close();
} catch (Exception e2) {}
}
}//end finally
return re;
}//end insertBoard
}//end class
쿼리를 수행할 때 동적으로 할댕해야 하는 값이 있으면 PreparedStatement
객체를 사용하고, 동적으로 할당할 필요가 없으면 Statement
객체를 사용한다.
쿼리의 결과가 있으면 executeQuery()
메서드를 호출하여 ResultSet
객체에 담고, 쿼리의 결과가 없으면 executeUpdate()
메서드를 호출하여 int형 변수에 결과 값을 할당 한다.