1. JDBC(Java Database Connectivity) 개요
1.1 JDBC(Java Database Connectivity) 개념
특정 DBMS와 독립적 인 데이터베이스 연합 프로그램 개발을 위해 제공되는 Java 표준 API
-> 간단히 말하면 데이터베이스가 변경되어도 Java 프로그램을 변경할 필요가 없다는 것.
1.2 JDBC의 구조와 프로그램 절차
수업 | 기능 |
DriverManager | DBMS에서 제공하는 드라이버를 관리합니다. DriverManger를 통해 Connection 개체를 검색할 수 있습니다. |
연결 | Connection은 특정 DBMS와 연관된 오브젝트입니다. |
Statement | 작성된 SQL 명령을 DBMS에 전달하는 오브젝트로서, Connection에서 가져옵니다. |
ResultSet | SELECT 명령의 실행 결과인 검색 결과가 저장되는 객체이며, Statement의 executeQuery() 메서드를 통해 가져옵니다. |
JDBC 프로그램
JDBC 프로그램 절차
JDBC 프로그램은
JDBC 드라이버 메모리에로드 -> Connection 얻기 -> DB 연동 -> Connection 해제 순서대로 진행한다.
JDBC 드라이버 로드
JDBC 프로그램에서 처음 작성하는 코드는 JDBC 드라이버의 로드입니다.
JDBC 드라이버를 메모리에로드하는 방법
Class.forName(“oracle.jdbc.driver.OracleDriver”)
DB Connection 연결
특정 DBMS에서 Connection을 가져오려면 DriverManager 클래스의 getConnection() 메소드를 사용하기 위해 JDBC URL 및 DBMS에서 매개변수로 부여된 계정 정보가 필요합니다.
Connection 연결 방법
try{
문자열 url = “jdbc:오라클:thin:@localhost:1521년:xe“;
연결 conn = DriverManager.getConnection(url, “hr”, “hr”);
} catch(SQLException e){
e.printStackTace();
}
여기에서 “jdbc:오라클:thin:@localhost:1521년:xe“해석해주세요어서.
jdbc 프로토콜사용
오라클 라는 DBMS에
thin 운전자통해
localhost 라는 서버에
1521년 시간 포트로우
xe 라는 데이터베이스연결을 요청합니다.
물론 위의 url의 경우는 oracle DBMS이므로 그렇게 해석한 것으로,
다른 DBMS를 작성하면 url 규칙이 변경됩니다.
DBMS를 통한 JDBC URL 정보
운전자 | URL |
JDBC-ODBC 브리지 | jdbc:odbc:(;=) |
오라클 | jdbc:oracle:thin: |
MySQL | jdbc:mysql:// |
SyBase | jdbc:sybase:Tds: |
Informix | jdbc:informix-sqli:// |
Postgres | jdbc:postgresql:// |
Statement 작성 및 실행
Statement 객체는 Connection의 createStatement() 메서드에서 가져올 수 있으며,
문자열 형식의 SQL 명령어를 DBMS로 보내는 다양한 방법을 제공합니다.
Statement 객체를 사용하여 INSERT 명령을 DB로 전송하는 샘플 코드의 일부를 살펴보겠습니다.
Statement stmt = conn.createStatement();
String sql = “insert into board(seq, title, writer, content) values(1, ‘첫 번째 게시물’, ‘홍길동’, ‘안녕하세요?’)”;
int count=stmt.executeUpdate(sql);
System.out.println(count+”건 등록 성공”);
명령문을 사용하여 SQL 명령어를 DBMS로 전송하는 데 사용하는 메소드
방법 | 기능 |
executeQuery(String sql) | SELECT 명령을 보내고 ResultSet 객체를 반환합니다. |
executeUpdate (String sql) | INSERT, UPDATE, DELETE 명령을 보냅니다. |
execute(String sql) | SELECT, INSERT, UPDATE, DELETE 명령을 보냅니다. 실행된 명령이 SELECT이면 true, INSERT, UPDATE, DELETE이면 false를 반환합니다. |
PreparedStatement 작성 및 실행
PreparedStatement – Statement보다 효율적이고 신속하게 SQL 명령을 처리하기위한 것
- 동적 SQL 문을 실행하는 방법 제공 -> 동일 SQL 문의 반복 사용시 Statement보다 편리
예제 코드
String sql = "insert into board(seq, title, writer, content) values(?, ?, ?, ?)";
// values(?,?,?,?)로 미리 값들을 할당하였기 때문에
// 기존 Statement를 사용할 때보다 sql 셋팅이 빠르다.
PreparedStatement stmt = conn.prepareStatement(sql)
stmt.setInt(1, 17);
stmt.setString(2, "열 일곱 번째 제목");
stmt.setString(3, "채규태");
stmt.setString(4, "두 번째 내용");
int count = stmt.executeUpdate();
System.out.println(count + "건 등록 성공");
즉, 실행 절차는 Connection -> PreparedStatement -> sql 문 -> execute 순서로 구성됩니다.
결과 값(ResultSet) 얻기
ResultSet
- 데이터베이스에 JDBC 드라이버를 사용하여 SQL 실행을 요청하고 SQL 실행에서 얻은 결과를 반환하고 저장합니다.
- SELECT SQL문의 경우, 조회될 테이블의 결과가 리턴됩니다.
- Statement 오브젝트의 executeQuery() 메소드의 실행 결과로서 생성할 수 있습니다.
PreparedStatement의 executeQuery() 메서드를 사용하여 ResultSet을 얻는 코드
PreparedStatement stmt = conn.prepareStatement("select * from board order by seq desc");
ResultSet rs = stmt.executeQuery();
while(rs.next()){
int seq = rs.getInt("SEQ");
String title = rs.getString("TITLE");
String writer = rs.getString("WRITER");
String content = rs.getString("CONTENT");
System.out.println(seq + "\t" + title + "\t" + writer + "\t" + content);
}
연결 자원 해제
DBMS와의 연결 후에 필요한 모든 작업을 처리한 후에는 사용된 자원을 모두 해제해야 합니다.
why? – 제한된 리소스인 Connection 객체는 반드시 해제하지 않으면 Connection 부족으로 인한 문제를 방지할 수 있다.
try {
// 생략
}finally{
try{
if(rs!
=null) rs.close();
} catch(Exception e){
rs = null;
}
try{
if(stmt!
=null) stmt.close();
} catch(Exception e){
stmt = null;
}
try{
if(conn!
=null && !
conn.isClose()) conn.close();
} catch(Exception e){
conn = null;
}
}