본문 바로가기
프로그래밍/JSP

JSP에서 JDBC 프로그래밍하기

by 가므자 2012. 4. 2.

JSP에서 JDBC 프로그래밍하기

 

JDBC API 를 사용할 경우 DBMS에 알맞는 JDBC 드라이버만 있으면 어떤 데이터베이스 라도 사용할 수 있게 된다.

현재 각 DBMS가 자신에 알맞는 JDBC 드라이버를 제공하고 있기 때문에 드라이버가 존재해야
데이터베이스 프로그래밍을 할 수 있다 (흔한 oracle , ms-sql, mysql 드라이버 널렸음)
jdbc 드라이버는 클래스 형태로 존재하며 일반적으로 jar 파일로 제공된다.

jdbc 프로그래밍의 코딩 스티일 / 순서

1. jdbc 드라이버로딩
2. 데이터베이스 커넥션 구함
3. 쿼리 실행을 위한 statement 객체 생성
4. 쿼리 실행
5. 쿼리 실행 결과 사용
6. statement 종료
7. 데이터베이스 커넥션 종료

 

 

chap12.zip

소스 파일 다운 받으세요!

위와 같이 DB 연결해서 테이블 정보를 읽어와 출력해주는 JSP 페이지 예제입니다.

DBMS와의 통신을 위한 JDBC 드라이버

JDBC 드라이버는 DBMS와의 통신을 담당하는 자바 클래스로서 DBMS 마다 별도의 JDBC 드라이버가 필요하다. 일반적으로 JDBC 드라이버는 jar 파일 형태로 제공된다.

JDBC 드라이버를 로딩해야 데이터베이스에 연결해서 원하는 작업을 수행 할 수 있으며, JDBC 드라이버를 로딩하는 방법은 다음과 같다.

 // 1. JDBC 드라이버 로딩
 Class.forName("com.mysql.jdbc.Driver");

MYSQL : com.mysql.jdbc.Driver

오라클 : oracle.jdbc.driver.OracleDriver

MS SQL  서버 : com.microsoft.sqlserver.jdbc.SQLserverDriver

Class.forName() 메서드는 지정한 클래스 정보를 담고 있는 Class 인스턴스를 구해 주는 기능만을 제공한다. 실제로 JDBC 드라이버에 해당하는 클래스들은 Class.forName() 메서드를 통해서 로딩될 때 자동으로 JDBC 드라이버로 등록해주기 때문에 Class.forName() 메서드를 사용해서 JDBC 드라이버를 등록하는 것이다.

데이터베이스 식별을 위한 JDBC URL

데이터베이스를 구분할 때에도 URL과 비슷한 형식을 취하는 JDBC URL을 사용한다.

jdbc:[DBMS]:[데이터베이스식별자]
jdbc:mysql://HOST[:PORT]/DBNAME[?param=value&param1=value2&...]

여기서 [HOST]는 MySQL 서버의 호스트 주소를 나타내며, [DBNAME]은 데이터베이스 이름을 나타낸다. [PORT]는 MySQL 서버가 사용하는 포트를 나타낸다.

"useUnicode=true&characterEncoding=utf-8" 한글 캐릭터 셋을 알맞게 지정해주기 위해

데이터베이스 커넥션

데이터 베이스 프로그래밍을 하기 위해서는 먼저 데이터베이스와 연결된 커넥션을 구해야한다. java.sql.Connection 클래스가 데이터 베이스 커넥션을 나타내며, 커넥션은 java.sql.DriverManager 클래스가 제공하는 getConnection() 메서드를 사용해서 구할 수 있다. DriverManager 클래스는 다음과 같은 두개의 getConnection()메서드를 제공하고 잇다.

DriverManager.getConnection(String jdbcURL)

DriverManager.getConnection(String jdbcURL,String user, String password)

JDBC URL과 데이터베이스 사용자 계정/아이디를 올바르게 지정했다면, DriverManager.getConnection() 메서드는 Connection 객체를 리턴한다. 이 Connection 객체를 사용해서 필요한 작업을 시작할 수 있다. DriverManager.getConnection() 메서드는 connection() 메서드를 사용할 때에 try-catch 블록을 사용해서 SQL Exception에 대한 예외 처리를 해주어야한다.

Connection 객체를 다 사용한 뒤에는 close() 메서드를 호출하여 connection 객체가 사용한 시스템 자원을 반환해주어야한다. 그렇지 않을 경우 자원이 불필요하게 소모 되어 커넥션을 구할 수 없는 상황이 발생할 수 잇다.

 Connection conn = null;
 
 try {
  String jdbcDriver = "jdbc:mysql://localhost:3306/chap12?" +
       "useUnicode=true&characterEncoding=utf-8";
  String dbUser = "root";
  String dbPass = "12146212";
 
  String query = "select * from MEMBER order by MEMBERID";
 
  // 2. 데이터베이스 커넥션 생성
  conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
...
} catch(SQLException ex) {
//에러발생
} finally {
if (conn != null) try { conn.close(); } catch(SQLException ex) {}
 }

위 코드를 보면 finally 블록에서 connection 객체의 close() 메서드를 호출해서 사용한 자원을 반환하고 있다. DriverManager.getConnection() 메서드가 예외를 발생시킬 경우 conn에는 connection 객체가 할당되지 않으므로, null인지의 여부를 판단한 후에 close() 메서드르 호출해주어야 한다.

statement를 사용한 쿼리 실행

Connection 객체를 생성한 후에는 Connection으로부터 Statement를 생성한 뒤에 쿼리를 실행수 있다.

 // 3. Statement 생성
  sstmt = conn.createStatement();

- ResultSet executeQuery(String qurery) : Select 쿼리를 실행한다.

- int executeUpdate(String query) : Insert, update, delete 쿼리를 실행한다.

executeQuery() 메서드는 SELECT 쿼리의 결과값을 java.sql.ReslutSet 객체에 저장해서 리턴하고, 그결과 변경된 레코드의 개수를 리턴한다.

<%@ page contentType = "text/html; charset=euc-kr" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.Statement" %>
<%@ page import = "java.sql.SQLException" %>
<%
 request.setCharacterEncoding("euc-kr");
 
 String memberID = request.getParameter("memberID");
 String name = request.getParameter("name");

 
 int updateCount = 0;
 
 Class.forName("com.mysql.jdbc.Driver");
 
 Connection conn = null;
 Statement stmt = null;

 
 try {
  String jdbcDriver = "jdbc:mysql://localhost:3306/chap12?" +
       "useUnicode=true&characterEncoding=euckr";
  String dbUser = "root";
  String dbPass = "12146212";
  
  String query = "update MEMBER set NAME = '"+name+"' "+    // MEBER 테이블의 NAME 칼럼을 UPDATE 쿼리 생성
                      "where MEMBERID = '"+memberID+"'";

  
  conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass); //데이터베이스와 연결된 Connection 생성
  stmt = conn.createStatement();  // Connection으로부터 Statement 생성
  updateCount = stmt.executeUpdate(query);  // Statement의 executeUpdate()메서드를 사용하여 쿼리 실행, 실행 결과로 변경된 레코드의 개수가 updateCount 변수에 저장된다.

// statement의 executeUPdate() 메서드는 변경된 레코드의 개수를 리턴한다고 했었다. update.jsp의 경우 UPDATE 쿼리를 통해서 변경된 레코드의 개수를 리턴하게 된다.
 } finally {
  if (stmt != null) try { stmt.close(); } catch(SQLException ex) {}
  if (conn != null) try { conn.close(); } catch(SQLException ex) {}
 }
%>
<html>
<head><title>이름 변경</title></head>
<body>
<%  if (updateCount > 0) { %>
<%= memberID %>의 이름을 <%= name %>(으)로 변경
<%  } else { %>
<%= memberID %> 아이디가 존재하지 않음
<%  } %>

</body>
</html>

ResultSet 클래스의 주요 데이터 읽기 메서드

메서드 리턴 타입 설 명
getString(String name)
getString(int index)
String 지정한 컬럼의 값을 String으로 읽어온다.
getCharacterStream(String name)
getCharacterStream(int index)
java.io.Reader 지정한 컬럼의 값을 스트림 형태로 읽어온다.
LONG VARCHAR 타입을 읽어올 떄 사용한다.
getInt(String name)
getInt(int index)
int 지정한 컬럼의 값을 int 타입으로 읽어온다.
getLong(String name)
getLong(int index)
long 지정한 컬럼의 값을 long 타입으로 읽어온다.
getDouble(String name)
getDouble(int index)
double 지정한 컬럼의 값을 double 타입으로 읽어온다.
getFloat(String name)
getFloat(int index)
float 지정한 컬럼의 값을 float 타입으로 읽어온다.
getTimestamp(String name)
getTimestamp(int index)
java.sql.Timestamp 지정한 컬럼의 값을 Timestamp 타입으로 읽어온다.
SQL TIMESTAMP 타입을 읽어올 떄 사용된다.
getDate(String name)
getDate(int index)
java.sql.Date 지정한 컬럼의 값을 Date 타입으로 읽어온다.
SQL DATE 타입을 읽어올 떄 사용된다.
getTime(String name)
getTime(int index)
java.sql.Time 지정한 컬럼의 값을 Time타입으로 읽어온다.
SQL TIME 타입을 읽어올 때 사용된다.

'프로그래밍 > JSP ' 카테고리의 다른 글

이클립스를 이용한 웹 개발  (0) 2012.04.02
jsp로 mysql 데이터 삭제  (0) 2012.03.20
웹어플리케이션 폴더 추가하기  (0) 2012.03.06
페이지 모듈화와 요청 흐름제어  (0) 2012.03.06
기본객체와 영역  (0) 2012.03.06

댓글