Statement (PreparedStatement가 표준 statement는 insert 같은 경우에 오류가있슴 사용하면안됨)
Statement 의 PreparedStatement 차이점
1. *Statement : 객체가 생성될때 SQL을 넘기는게 아니라 메소드에서 SQL을 넘겨줌
//JDBC 수행3단계 : Statement 객체생성
stmt=conn.createStatement();
//JDBC 수행4단계 : SQL문 실행
//JDBC 수행5단계 : SQL문 실행으로 얻어진 모든 레코드를 담은 ResultSet 객체생성
rs=stmt.executeQuery(sql);
*PreparedStatement : 객체가 생성될때 SQL 문장을 넘겨줌
//JDBC 수행3단계 : PrepareStatement 객체생성
pstmt=conn.prepareStatement(sql);
//JDBC 수행4단계 : SQL문 실행
//JDBC 수행5단계 : SQL문 실행으로 얻어진 모든 레코드를 담은 ResultSet 객체생성
rs=pstmt.executeQuery();
2. PreparedStatement 가 속도도 더빠르다.
3. Statement 가 코드는 짧아보인다. 허나 웹서비스 or 속도 면에서 사용하면 안된다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>테이블의 레코드를 화면에 표시하는 예제</title> </head> <body> <h2>member1 테이블의 레코드를 화면에 표시하는 예제</h2> <table width="550" border="1"> <tr> <td width="100">아이디</td> <td width="100">패스워드</td> <td width="100">이름</td> <td width="100">가입일자</td> </tr> <% Connection conn = null; PreparedStatement pstmt=null; ResultSet rs = null; try{ String jdbcUrl ="jdbc:oracle:thin:@localhost:1521:orcl"; String dbId="hr"; String dbPass="hr"; //JDBC 수행 1 단계 : jdbc driver 로드 Class.forName("oracle.jdbc.driver.OracleDriver"); //JDBC 수행 2단계: Connection 객체 생성 conn=DriverManager.getConnection(jdbcUrl,dbId,dbPass); String sql ="select * from member1"; //JDBC 수행 3단계 : PreparedStatement 객체 생성 pstmt=conn.prepareStatement(sql); //JDBC 수행 4단계 : sql문 실행 //JDBC 수행 5단계 : sql문의 실행으로 얻어진 레코드를 담는 ResultSet 객체 생성 //ResultSet은 커서의 개념이 있어서 next()메소드 사용시 데이터가 있는곳까지만 데이터 뽑아냄 rs=pstmt.executeQuery(); while(rs.next()){ String id = rs.getString("id"); String passwd = rs.getString("passwd"); String name = rs.getString("name"); Timestamp register = rs.getTimestamp("register"); %> <tr> <td width="100"><%=id %></td> <td width="100"><%=passwd %></td> <td width="100"><%=name %></td> <td width="100"><%=register.toString() %></td> </tr> <% } }catch(Exception e){ e.printStackTrace(); }finally{ if(rs != null) try{rs.close();}catch(SQLException sqle){} if(pstmt != null) try{rs.close();}catch(SQLException sqle){} if(conn != null) try{rs.close();}catch(SQLException sqle){} } %> </table> </body> </html>Statement
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>테이블의 레코드를 화면에 표시하는 예제</title> </head> <body> <h2>member1 테이블의 레코드를 화면에 표시하는 예제</h2> <table width="550" border="1"> <tr> <td width="100">아이디</td> <td width="100">패스워드</td> <td width="100">이름</td> <td width="100">가입일자</td> </tr> <% //PreparedStatement -> Statement 차이점 Connection conn = null; Statement stmt=null; //PreparedStatement pstmt=null; ResultSet rs = null; try{ String jdbcUrl ="jdbc:oracle:thin:@localhost:1521:orcl"; String dbId="hr"; String dbPass="hr"; //JDBC 수행 1 단계 : jdbc driver 로드 Class.forName("oracle.jdbc.driver.OracleDriver"); //JDBC 수행 2단계: Connection 객체 생성 conn=DriverManager.getConnection(jdbcUrl,dbId,dbPass); String sql ="select * from member1"; //JDBC 수행 3단계 : Statement 객체 생성 //pstmt=conn.prepareStatement(sql); stmt = conn.createStatement(); //JDBC 수행 4단계 : sql문 실행 //JDBC 수행 5단계 : sql문의 실행으로 얻어진 레코드를 담는 ResultSet 객체 생성 //ResultSet은 커서의 개념이 있어서 next()메소드 사용시 데이터가 있는곳까지만 데이터 뽑아냄 //rs=pstmt.executeQuery(); rs=stmt.executeQuery(sql); //차이점은 sql문장 실행시킬때 sql을 넘김 while(rs.next()){ String id = rs.getString("id"); String passwd = rs.getString("passwd"); String name = rs.getString("name"); Timestamp register = rs.getTimestamp("register"); %> <tr> <td width="100"><%=id %></td> <td width="100"><%=passwd %></td> <td width="100"><%=name %></td> <td width="100"><%=register.toString() %></td> </tr> <% } }catch(Exception e){ e.printStackTrace(); }finally{ if(rs != null) try{rs.close();}catch(SQLException sqle){} if(stmt != null) try{rs.close();}catch(SQLException sqle){} if(conn != null) try{rs.close();}catch(SQLException sqle){} } %> </table> </body> </html>
PreparedStatement 가 더 나은 방법이라 함
더 나은 방법이란것을 뒷받침 하기 위한 예제
PreparedStatement
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <% request.setCharacterEncoding("utf-8"); //전송된 데이터 처리 String id= request.getParameter("id"); String passwd= request.getParameter("passwd"); String name= request.getParameter("name"); //전송되지 않은 데이터를 jsp에서 생성함(날짜/시간) Timestamp register= new Timestamp(System.currentTimeMillis()); Connection conn = null; PreparedStatement pstmt = null; try{ String jdbcUrl ="jdbc:oracle:thin:@localhost:1521:orcl"; String dbId="hr"; String dbPass="hr"; //JDBC 수행 1단계 : jdbc driver 로드 Class.forName("oracle.jdbc.driver.OracleDriver"); //JDBC 수행 2 단계 : Connection 객체 생성 conn =DriverManager.getConnection(jdbcUrl,dbId,dbPass); //sql 수행문 테이블명 뒤에 부분적으로 수정할경우에는 컬럼명을 입력해야됨 //member1 (id,passwd,name,register) 모든 데이터를 추가할경우는 생략가능 String sql = "insert into member1 values(?,?,?,?)"; //JDBC 수행 3단계 : PreparedStatement 객체 생성 //위에 sql문장을 저장시키고 각물음표에 매칭시키기 pstmt = conn.prepareStatement(sql); pstmt.setString(1,id); pstmt.setString(2,passwd); pstmt.setString(3,name); pstmt.setTimestamp(4,register); //JDBC 수행 4단계 : SQL 문 실행 pstmt.executeUpdate(); }catch(Exception e){ e.printStackTrace(); }finally{ //자원 정리 if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){} if(conn != null) try{pstmt.close();}catch(SQLException sqle){} } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>레코드 삽입 (추가) 예제</title> </head> <body> member 1 테이블에 새로운 레코드를 삽입(추가) 했습니다. </body> </html>
Statement
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <% request.setCharacterEncoding("utf-8"); //전송된 데이터 처리 String id= request.getParameter("id"); String passwd= request.getParameter("passwd"); String name= request.getParameter("name"); //전송되지 않은 데이터를 jsp에서 생성함(날짜/시간) Timestamp register= new Timestamp(System.currentTimeMillis()); Connection conn = null; Statement stmt = null; try{ String jdbcUrl ="jdbc:oracle:thin:@localhost:1521:orcl"; String dbId="hr"; String dbPass="hr"; //JDBC 수행 1단계 : jdbc driver 로드 Class.forName("oracle.jdbc.driver.OracleDriver"); //JDBC 수행 2 단계 : Connection 객체 생성 conn =DriverManager.getConnection(jdbcUrl,dbId,dbPass); //sql 수행문 테이블명 뒤에 부분적으로 수정할경우에는 컬럼명을 입력해야됨 //member1 (id,passwd,name,register) 모든 데이터를 추가할경우는 생략가능 //직접 매칭시킴 String sql = "insert into member1 values('"+id+"','"+passwd+"','"+name+"',sysdate)"; //JDBC 수행 3단계 : Statement 객체 생성 stmt = conn.createStatement(); //JDBC 수행 4단계 : SQL 문 실행 stmt.executeUpdate(sql); }catch(Exception e){ e.printStackTrace(); }finally{ //자원 정리 if(stmt != null) try{stmt.close();}catch(SQLException sqle){} if(conn != null) try{stmt.close();}catch(SQLException sqle){} } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>레코드 삽입 (추가) 예제</title> </head> <body> member 1 테이블에 새로운 레코드를 삽입(추가) 했습니다. </body> </html>
Statement가 코드량이 적은건 사실이지만
기능적인 문제가 있는것도 사실이다
Statement보단 PreparedStatement를 사용하는것이 낫지 않을까?
Statement 사용시 ' 사용시 에러가 났음
'' 두개 사용시 '하나만 표시가 됨
어느 사용자가 '를 사용하기 위해''를 두번 넣는 수고를 할까?
PreparedStatement 실행
잘들어감...
'JSP > 기본(Oracle)' 카테고리의 다른 글
데이터베이스 프로그래밍 기초 DB 연동 (0) | 2012.06.20 |
---|---|
JSP DB연동 Oracle sqldeveloper setting (0) | 2012.06.20 |
JSP 자바빈 사용하기(자동 생성방법) , 액션태그,getProperty,setProperty 사용 (0) | 2012.06.10 |
회원가입 입력 폼 (0) | 2012.05.31 |
Jsp를 이용한 달력 (0) | 2012.05.31 |