[JSP/Servlet]JDBC-2/2

 JDBC에서 SQL구문을 사용할 때 SQL 실행 객체로 Statement 객체를 사용했다.

Statement 메소드 중 executeQuery(String sql) 인수로 들어가는 문자열은 실행할 sql 을 의미한다.

select 를 이용한 전체 조회를 제외한 where 절 혹은 특정 컬럼 값을 가져오는 경우

String name = "name 값";

String phone = "phone 값";

String sql = "select * from member where phone = "+phone+" and name="+phone;

. . .

rs = stmt.executeQuery(sql);


실행되는 sql 구분의 구성이 지저분해진다.

만약 조회하고자 하는 컬럼 또한 값을 받아 설정하는 경우 더욱 복잡해지며, 

insert, update 의 경우, 더 복잡하고, 코드가 지저분해진다.

이에 대한 해결책으로 Statement의 서브 인터페이스 PreparedStatement를 이용한다.


※예제 코드

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 import="java.sql.PreparedStatement"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.sql.DriverManager" %>
<%@page import="java.sql.ResultSet" %>
<%@page import="java.sql.Statement" %>
<%@page import="java.sql.Connection" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%!
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
 
String url = "jdbc:oracle:thin:@localhost:1521:hr";
String uid = "c##scott";
String pass= "1234";
 
String sql = "insert into member values(?,?,?,?,?,?)"//insert 문에 대한 '바인드' 변수 사용
 
%>
<body>
<% 
    request.setCharacterEncoding("UTF-8");
    String name = request.getParameter("name");
    String userid = request.getParameter("userid");
    String pwd = request.getParameter("pwd");
    String email = request.getParameter("email");
    String ph = request.getParameter("ph");
    String admin = request.getParameter("rank");
    
    try{
        Class.forName("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection(url,uid,pass);
        pstmt = conn.prepareStatement(sql);
        /*
        insert into member values(name,userid,pwd,email,ph,admin)
        insert into member values(  1 ,   2  , 3 ,  4  ,5 ,  6  )
        setString, setInt로 바인드 변수 설정
        */
        pstmt.setString(1, name);
        pstmt.setString(2, userid);
        pstmt.setString(3, pwd);
        pstmt.setString(4, email);
        pstmt.setString(5, ph);
        pstmt.setInt(6, Integer.parseInt(admin));
        
        pstmt.executeUpdate();
    }catch(Exception  e){
        e.printStackTrace();
    }finally{
        try{
            if(pstmt != null) pstmt.close();
            if(conn != null) conn.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }
%>
<h3>회원 가입 성공</h3>
<a href="01_allMember.jsp">회원 전체 목록 보기</a>
</body>
</html>
cs


PreparedStatement 의 바인드 변수 설정(setString, setInt)시, 각 바인드 변수의 설정값은 데이터베이스의 해당 테이블과 동일한 컬럼과 순서로 설정되어야 한다.



댓글