본문 바로가기

web/JSP

JSP Statement PreparedStatement

1 . statement
  statement 객체는 statement 인터페이스를 구현한 객체로 항상 인수가 없는 Connection 클래스의 createStatement() 메소드를 호출함으로써 얻어진다.

일단 statement 객체를 생성하면 statement 객체의 executeQuery() 메소드를 호출하여 sql 질의를 실행시킬수 있다. 메소드의 인수로는 sql 질의의 문장을 담은 String 객체를 전달한다. statement 객체는 단순한 질의문을 사용할 경우에 좋다.

 private Connection con;
 private Statement stmt;

 public Vector connetctionStatement() throws ClassNotFoundException, SQLException{        
             
        ResultSet rset;
        Class.forName("oracle.jdbc.driver.OracleDriver");
        con = DriverManager.getConnection("jdbc:oracle:thin:@DB가 있는 IP:포트번호:DB이름", "ID","Password");

        stmt = con.createStatement();
        
        Vector vDBconnection = new Vector();
        try {
            String query = "select id, pw from userinfo";

            rset = stmt.executeQuery(query);
            while (rset.next()) {
                Hashtable htdbconnection = new Hashtable();                
                
                htdbconnection.put("id", rset.getString("id"));
                htdbconnection.put("pw", rset.getString("pw"));  
                
                vDBconnection.add(htdbconnection);
            }
            rset.close();
        } catch (java.lang.Exception ex) {
            System.out.println("에라 발생 = " + ex.getMessage());
            ex.printStackTrace();
        } 
        stmt.close();
        con.close();
        
        return vDBconnection;
    }

- 인수가 없다고 했지만 질의문으로 넘기는 String 에 인수를 담아서 넘길수 있습니다. 

2. PreparedStatement

PreparedStatement 객체는 Connection 객체의 PreparedStatement() 메소드를 사용하여 생성한다.
PreparedStatement 객체는 sql 문장이 미리 컴파일 되고, 실행시간 동안 인수값을 위한 공간을 확보할수 있다는 점에서 Statement 객체와 다르다.
PreparedStatement  객체는 동일한 질의문을 특정 값만 바꾸어서 여러번 실행해야 할때, 많은 데이터를 다루기 때문에 질의문을 정리해야 할 필요가 있을때, 인수가 많아서 질의문을 정리해야 될 필요가 있을때 사용하면 유용하다.

또한 Statement 객체의 sql은 실행될때 매번 서버에서 분석되어야 하는 반면, PreparedStatement  객체는 한번 분석되면 재사용이 용이하다는 장점을 가지고 있다.

PreparedStatement 인터페이스는 각각의 인수에 대해 위치홀더(placeholder)를 사용하여 sql문장을 정의할 수 있게 해준다.  위치 홀더는 물음표(?)로 표현된다. sql문장이 실행되기 전에 실제 값으로 대체되어 문자열을 연결하는 방법보다 훨씬 쉽게 sql을 만들수 있다.

동일한 질의문을 특정 값만 바꾸어서 여러번 실행해야 할때, 많은 데이터를 다루기 때문에 질의문을 정리해야 할 필요가 있을때, 인수가 많아서 질의문을 정리해야 될 필요가 있을때 좋다.
미리 컴파일되기 때문에 쿼리의 수행 속도가 statement 객체에 비해 빠르다.


   private Connection con;
   private PreparedStatement prep;

 public Vector connetctionPreparedStatement() throws ClassNotFoundException, SQLException{        
        
        ResultSet rset;
        Class.forName("oracle.jdbc.driver.OracleDriver");
        con = DriverManager.getConnection("jdbc:oracle:thin:@DB가 있는 IP:포트번호:DB이름", "ID","Password");
        
        
        Vector vDBconnection = new Vector();
        try {
            String query = "select id, pw from userinfo";
             prep = con.prepareStatement(query);
            rset = prep.executeQuery();
            while (rset.next()) {
                Hashtable htdbconnection = new Hashtable();                
                
                htdbconnection.put("id", rset.getString("id"));
                htdbconnection.put("pw", rset.getString("pw"));  
                
                vDBconnection.add(htdbconnection);
            }
            rset.close();
        } catch (java.lang.Exception ex) {
            System.out.println("에라 발생 = " + ex.getMessage());
            ex.printStackTrace();
        } 
        stmt.close();
        con.close();
        
        return vDBconnection;
    }



DBconnectiontest.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="DBC.*"%>
<%@page import="java.util.*" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<link type="text/css" rel="stylesheet" href="css/tableCss.css">

<title>DBtest</title>
</head>
<body>


<!-- UI Object -->
<table cellspacing="0" border="1" summary="DBtest" class="tbl_type">
<caption>DBtest</caption>
<colgroup>
<col width="12%"><col><col width="12%" span="2">
</colgroup>
<thead>
<tr>
<th scope="col">id</th>
<th scope="col">pw</th>


</tr>
</thead>

<tbody>

<%
DBconnection dbc = new DBconnection();
Vector vUserinfo = dbc.connetctionStatement();
for(int i = 0; i<vUserinfo.size(); i++){
   Hashtable htdbconnection = (Hashtable)vUserinfo.get(i);
%>

<tr>

<td><%= htdbconnection.get("id")%></td>
<td><%= htdbconnection.get("pw")%></td>

</tr>
<%
}
%>

</tbody>
</table>


<!-- UI Object -->
<table cellspacing="0" border="1" summary="DBtest" class="tbl_type">
<caption>DBtest</caption>
<colgroup>
<col width="12%"><col><col width="12%" span="2">
</colgroup>
<thead>
<tr>
<th scope="col">id</th>
<th scope="col">pw</th>


</tr>
</thead>

<tbody>

<%
DBconnection dbc1 = new DBconnection();
Vector vUserinfo1 = dbc.connetctionPreparedStatement();
for(int i = 0; i<vUserinfo.size(); i++){
   Hashtable htdbconnection = (Hashtable)vUserinfo1.get(i);
%>

<tr>

<td><%= htdbconnection.get("id")%></td>
<td><%= htdbconnection.get("pw")%></td>

</tr>
<%
}
%>

</tbody>
</table>
</body>
</html>



CSS는 http://html.nhndesign.com/ui_pattern_table 의 보더테이블3 으로 만들었습니다.