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 속도 면에서 사용하면 안된다. 





PreparedStatement
<%@ 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  가 더 나은 방법이라 함

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





INSERT


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 실행






잘들어감...


+ Recent posts