프로그래밍/JDBC

jsp에서 jdbc 프로그래밍하기

Jay Tech 2017. 1. 13. 16:16
반응형


자바에서 데이터베이스를 사용할 때에는 JDBC API를 이용해서 프로그래밍을 한다. JDBC는 Java Database Connectivity의 약자로서 자바에서 데이터베이스 관련 프로그래밍을 해주는 api이다.


각 데이터베이스별 (mysql ,oracle 등) 사이트에서 JDBC드라이버를 다운받자.


이 파일을 웹 어플리케이션 디렉터리인 WEB-INF/lib 디렉터리에 복사한다. 


실행순서


1. JDBC드라이버 로딩을 한다.

2. 데이터베이스 커넥션을 구한다.

3. 쿼리 실행을 위한 statement 객체를 구한다.

4. 쿼리를 실행한다.

5. 쿼리 실행 결과를 사용한다.

6. statement를 종료한다.

7. 데이터베이스 커넥션을 종료한다.



- 예제


다음은 테이블로 부터 정보를 읽어와 출력해주는 jsp페이지 예제이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<%@ 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.ResultSet" %>
<%@ page import = "java.sql.SQLException" %>
 
<html>
<head><title>회원 목록</title></head>
<body>
 
MEMBMER 테이블의 내용
<table width="100%" border="1">
<tr>
    <td>이름</td><td>아이디</td><td>이메일</td>
</tr>
<%
    // 1. JDBC 드라이버 로딩
    Class.forName("com.mysql.jdbc.Driver");
    
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try {
        String jdbcDriver = "jdbc:mysql://localhost:3306/test?" +
                            "useUnicode=true&characterEncoding=euckr";
        String dbUser = "id";
        String dbPass = "pw";
        
        String query = "select * from MEMBER order by MEMBERID";
        
        // 2. 데이터베이스 커넥션 생성
        conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
        
        // 3. Statement 생성
        stmt = conn.createStatement();
        
        // 4. 쿼리 실행
        rs = stmt.executeQuery(query);
        
        // 5. 쿼리 실행 결과 출력
        while(rs.next()) {
%>
<tr>
    <td><%= rs.getString("NAME"%></td>
    <td><%= rs.getString("MEMBERID"%></td>
    <td><%= rs.getString("EMAIL"%></td>
</tr>
<%
        }
    } catch(SQLException ex) {
        out.println(ex.getMessage());
        ex.printStackTrace();
    } finally {
        // 6. 사용한 Statement 종료
        if (rs != nulltry { rs.close(); } catch(SQLException ex) {}
        if (stmt != nulltry { stmt.close(); } catch(SQLException ex) {}
        
        // 7. 커넥션 종료
        if (conn != nulltry { conn.close(); } catch(SQLException ex) {}
    }
%>
</table>
 
</body>
</html>
 
cs


line 19에서 드라이버를 로딩한다.


line 34에서 디비 커넥션을 생성한다.


line 37에서 statement를 생성한다.


line 40에서 쿼리를 실행한다.


그리고 try문안에서 사용한 statement를 종료하고 커넥션까지 종료한다.



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


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




- line 34의 디비 커넥션


DriverManager클래스는 getConnection() 메소드를 제공하는데 결과적으로 Connection객체를 리턴하게 된다. 



- line 37의 statement


executeQuery는 select 쿼리문을 실행하는 메소드이다. 그리고 ResultSet객체에 담아서 리턴한다. Resultset은 next()를 제공하는데 커서를 통해 각 행의 데이터에 접근한다. 안드로이드 sqlite의 디비 참조형태와 비슷하다. 




cf> PreparedStatement


이것은 Statement와 동일한 기능을 제공한다. 차이점이 있다면 PreparedStatement는 SQL쿼리의 틀을 미리 생성해 놓고 값을 나중에 저장한다.


예를들어


1
2
3
4
5
6
7
8
9
10
11
<%
    
        pstmt = conn.prepareStatement(
            "insert into MEMBER values (?, ?, ?, ?)");
        pstmt.setString(1, memberID);
        pstmt.setString(2, password);
        pstmt.setString(3, name);
        pstmt.setString(4, email);
    
 
%>
cs



PreparedStatement를 사용하는 이유


-반복해서 실행되는 동일 쿼리의 속도를 증가시키기 위해 사용한다.

-값 자동변환을 위해서 사용한다.

-간결한 코드를 위해서 사용한다.


stmt = conn.createStatement();

stmt.executeQuery("쿼리1");

stmt.executeQuery("쿼리2");

stmt.executeQuery("쿼리3");


pstmt = conn.prepareStatement("쿼리 .. ?");

pstmt.setString(1."dd");

pstmt.executeQmery();

pstmt.setString(2,"cc");

계속 반복...




* CLOB 타입


오라클의 경우 대량의 텍스트 데이터를 저장할 때 LONG타입 보다는 CLOB타입을 이용해서 대량의 텍스트 데이터를 처리하는것을 권하고 있다. 양이 많아진다면 스트림을 사용해서 순간적으로 발생할 수 있는 메모리 부족 현상을 방지할 수 있다.



* JDBC 로딩 타임


JDBC드라이버는 한번만 로딩하면 이후로 계속해서 사용할 수 있기 때문에 모든 jsp페이지에서 매 번 로딩할 필요가 없다. 가장 좋은 시점은 웹 어플리케이션이 시작할 때이다. 즉 web.xml에서 로딩되도록 설정할 수 있다.



반응형