note

PreparedStatement Statement 의 차이점(SELECT),(INSERT) 본문

JSP/기본

PreparedStatement Statement 의 차이점(SELECT),(INSERT)

투한 2012. 2. 9. 10:49


파일위치

 

PreparedStatement
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>




테이블의 레코드를 화면에 표시하는 예제


member1 테이블의 레코드를 화면에 표시하는 예제

<% 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"); %> <% } }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){} } %>
아이디 패스워드 이름 가입일자
<%=id %> <%=passwd %> <%=name %> <%=register.toString() %>


Statement
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>




테이블의 레코드를 화면에 표시하는 예제


member1 테이블의 레코드를 화면에 표시하는 예제

<% //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"); %> <% } }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){} } %>
아이디 패스워드 이름 가입일자
<%=id %> <%=passwd %> <%=name %> <%=register.toString() %>
 

PreparedStatement  가 더 나은 방법이라 함

더 나은 방법이란것을 뒷받침 하기 위한 예제 




INSERT


Statement 사용시 ' 사용시 에러가 났음
 




'' 두개 사용시 '하나만 표시가 됨

 

어느 사용자가 '를 사용하기 위해''를 두번 넣는 수고를 할까?

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){}
	}
	
%>






레코드 삽입 (추가) 예제


member 1 테이블에 새로운 레코드를 삽입(추가) 했습니다.




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){}
	}
	
%>






레코드 삽입 (추가) 예제


member 1 테이블에 새로운 레코드를 삽입(추가) 했습니다.




Statement가 코드량이 적은건 사실이지만
기능적인 문제가 있는것도 사실이다 

Statement보단 PreparedStatement를 사용하는것이 낫지 않을까?