insert를 위해서는 executeUpdate()
의 매개변수로 insert문을 문자열 형태로 주어야 한다.
PreparedStatement 객체를 생성하면 보다 편하게 sql문을 작성할 수 있다.
Connection 인터페이스의 preparedStatement() 메소드를 호출한다.
PreparedStatement pstmt = con.prepareStatement(sql);
메소드의 인자로 사용할 sql문은 ?기호를 사용해 각 컬럼에 추가할 값을 지정하지 않은 상태로 넣을 수 있다 - 이를 바인드 변수라고 한다.
String sql = "insert into member values(?, ?, ?, ?, ?, ?)";
바인드 변수로 지정된 인자에 setXXX(int 순서, 실제 데이터나 변수)
메소드를 사용해 값을 할당해 준다.
pstmt.setString(1, name);
쿼리문 실행을 위해 executeXXX() 메소드를 호출한다. Statement 객체는 실행시 executeXXX(sql) 형태로 쿼리문을 전달해주었지만 PreparedStatement는 이미 쿼리문을 전달해주었기에 그냥 메소드만 호출하면 된다.
select문이면 executeQuery()
,
delete, update, insert는 executeUpdate()
를 실행한다.
pstmt.executeUpdate();
사용이 끝나면 close.
pstmt.close();
addMemberForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
<h2>회원의 정보 입력 폼</h2>
<form method="post" action="addMember.jsp">
<table>
<tr>
<td>이름</td>
<td><input type="text" name="name" size="20"></td>
</tr>
<tr>
<td>아이디</td>
<td><input type="text" name="userid" size="20"></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="pwd" size="20"></td>
</tr>
<tr>
<td>이메일</td>
<td><input type="text" name="email" size="20"></td>
</tr>
<tr>
<td>전화번호</td>
<td><input type="text" name="phone" size="11"></td>
</tr>
<tr>
<td>등급</td>
<td><input type="radio" name="admin" value="1"
checked="checked"> 관리자 <input type="radio" name="admin"
value="0"> 일반회원</td>
</tr>
<tr>
<td><input type="submit" value="전송"></td>
<td><input type="reset" value="취소"></td>
</tr>
</table>
</form>
</body>
</html>
addMember.jsp
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%!
Connection conn = null;
PreparedStatement pstmt = null;
String sql = "insert into member values(?, ?, ?, ?, ?, ?)";
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>DB 연결</title>
</head>
<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 phone = request.getParameter("phone");
String admin = request.getParameter("admin");
int updateCount = 0;
try {
//책과 다른 부분
//괄호부분에 context.xml에 설정한 name을 추가함으로써 디비 정보 노출 없이 초기화할수 있다고 하였읍니다
Context init = new InitialContext();
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
conn = ds.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, userid);
pstmt.setString(3, pwd);
pstmt.setString(4, email);
pstmt.setString(5, phone);
pstmt.setInt(6, Integer.parseInt(admin));
updateCount = pstmt.executeUpdate();
if (updateCount != 0) {
System.out.println("회원가입 성공");
} else {
System.out.println("회원가입 실패");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}//finally의 끝
%>
<h3>회원 가입 성공</h3>
<a href="01_allMember.jsp"> 회원 전체 목록 보기 </a>
</body>
</html>