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)시, 각 바인드 변수의 설정값은 데이터베이스의 해당 테이블과 동일한 컬럼과 순서로 설정되어야 한다.
댓글
댓글 쓰기