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 가 더 나은 방법이라 함
더 나은 방법이란것을 뒷받침 하기 위한 예제
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 실행
잘들어감...