본문 바로가기

JSP, Servlet, MySQL/JSP - webmarket

JSP Servlet JDBC로 데이터베이스와 JSP 연동 : 상품 조회 , 등록, 수정, 삭제하기 2

728x90
반응형

 

03 데이터베이스 쿼리 실행

Connection 객체를 생성하여 데이터베이스가 연결되었다면 쿼리 실행 객체를 이용하여 쿼리를 실행한다. 쿼리 실행 객체는 Statement, PreparedStatement, CallableStatement 이다. 쿼리의 실행 성공이나 실패 여부와 상관없이 쿼리 실행 객체와 Connection 객체의 리소스를 해제해야 한다. 

 

3.1 Statement 객체로 데이터 접근하기 

Statement 객체는 정적인 쿼리에 사용하며 형식은 다음과 같다. 이 객체는 하나의 쿼리를 사용하고 나면 더는 사용할 수 없다. 하나의 쿼리를 끝내면 close() 를 사용하여 객체를 즉시 해제해야 한다. close() 를 사용하여 객체를 즉시 해제하지 않으면 무시할 수 없는 공간이 필욯하며 페이지가 다른 작업을 수행하는 동안 멈추지 않기 때문이다. Statement 객체는 복잡하지 않은 간단한 쿼리문을 사용하는 경우에 좋다. 

 

Statement createStatement() throws SQLException

 

일단 Statement 객체를 생성하면 Statement 객체의 executeQuery() 나 executeUpdate() 메소드를 호출하여 쿼리문을 실행한다. 이러한 메소드는 쿼리문 대부분의 요구 사항을 처리할 수 있다. 

 

Statement 객체 메소드 종류

메소드 반환 유형 설명
executeQuery(String sql) ResultSet SELECT 문을 실행할 떄 사용한다(ResultSet 객체 반환)
executeUpdate(String sql) int 삽입, 수정, 삭제와 관련된 SQL 문 실행에 사용한다. 
close() void Statement 객체를 반환할 때 사용한다.

 

 

executeQuery()메소드로 데이터 조회하기

executeQuery() 메소드는 정적인 SELECT 쿼리문을 통해 데이터를 검색하는데 사용하며 형식은 다음과 같다. 

ResultSet executeQuery(String sql) throws SQLException

 

여기서 매개변수 sql 은 데이터베이스에 보낼 쿼리문이다. 

다음은 executeQuery() 메소드를 사용하여 SELECT 문을 실행하는 예로, 쿼리문이 Member 테이블에서 id가 1 인 레코드를 검색하여 ResultSet 객체의 rs 에 모든 필드 값을 반환한다. 

 

[executeQuery() 메소드 사용 예 : SELECT 쿼리문]

<%
	Connection conn = null;
    ..(생략)..
    Statement stmt = conn.createStatement();
    String sql = "SELECT * FROM Member WHERE id = '1'";
    ResultSet rs = stmt.executeQuery(sql);
    stmt.close();
%>

 

executeUpdate()메소드로 데이터 삽입, 수정 , 삭제하기

executeUpdate() 메소드는 INSERT, UPDATE, DELETE 쿼리문을 통해 데이터를 삽입, 수정, 삭제하는 데 사용하며 형식은 다음과 같다. 

int executeUpdate(String sql) throws SQLException

 

여기서 매개변수 sql은 데이터베이스에 보낼 쿼리문이다. 

다음은 executeUpdate() 메소드로 INSERT 쿼리문을 실행하여 데이터베이스에 새로운 데이터를 삽입하는 예로, Member 테이블의 id, name, passwd 필드에 각각 '1', '홍길순','1234' 를 삽입한다. 

 

[executeUpdate() 메소드 사용 예(삽입) : UPDATE 쿼리문]

<%
	Connection conn = null;
    ..(생략)..
    Statement stmt = conn.createStatement();
    String sql = "INSERT INTO Member(id, name, passwd) VALUES ('1','홍길순','1234')";
    int rs = stmt.executeUpdate(sql);
%>

 

다음은 executeUpdate() 메소드로 UPDATE 쿼리문을 실행하여 데이터베이스에 저장된 데이터를 수정하는 예로, Member 테이블의 id 필드 값이 '1'인 것을 찾아 name 필드 값을 '관리자'로 변경한다. 

 

[executeUpdate() 메소드 사용 예 (수정 ): UPDATE 쿼리문]

<%
	Connection conn = null;
    ..(생략)..
    Statement stmt = conn.createStatement();
    String sql = "UPDATE Member SET name = '관리자' WHERE id = '1'";
    int rs = stmt.executeUpdate(sql);
%>

 

다음은 executeUpdate() 메소드로 DELETE 쿼리문을 실행하여 데이터베이스에 저장된 데이터를 삭제하는 예로, Member 테이블의 id 필드 값이 '1' 인 것을 찾아 레코드를 삭제한다. 

 

[executeUpdate() 메소드 사용 예(삭제) : DELETE 쿼리문]

<%
	Connection conn = null;
    ..(생략)..
    Statement stmt = conn.createStatement();
    String sql = "DELETE FROM Member WHERE id = '1'";
    int rs = stmt.executeUpdate(sql);
%>

 

예제 - Statement 객체로 INSERT 쿼리문 실행하기 

 

/JSPBook/WebContent/ch16/member.sql

CREATE TABLE MEMBER(ID VARCHAR(20) NOT NULL, PASSWD VARCHAR(20), NAME VARCHAR(30), PRIMARY KEY(ID));
SELECT * from MEMBER;

 

 

JSPBook/WebContent/ch16/insert01.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<title>Datebase SQL</title>
</head>
<body>
	<form method="post" action="insert01_process.jsp">
		<p> ID : <input type="text" name="id">
		<p> PW : <input type="password" name="passwd">
		<p> NAME : <input type="text" name="name">
		<p> <input type="submit" value="submit">
	</form>
	
</body>
</html>

 

JSPBook/WebContent/ch16/dbconn.jsp

<%@ page import="java.sql.*"%>
<%
	Connection conn = null;
	
	String url = "jdbc:mysql://localhost:3306/JSPBookDB";
	String user = "root";
	String password = "177100";
	
	Class.forName("com.mysql.jdbc.Driver");
	conn = DriverManager.getConnection(url, user, password);
	
%>

 

JSPBook/WebContent/ch16/insert01_process.jsp

<%@page import="com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute"%>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>Database SQL</title>
</head>
<body>
	<%@ include file="dbconn.jsp" %>
	<%
		request.setCharacterEncoding("utf-8");
	
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
		String name = request.getParameter("name");
		
		//Statement 객체를 null 로 초기화하도록 작성한다. 
		Statement stmt = null;
		
		try{//member 테이블의 각 필드에 폼 페이지에서 전송된 아이디, 비밀번호, 이름을 삽입하도록 INSERT 문을 작성.
			String sql = "INSERT INTO member(id, passwd, name) VALUES('" + id + "','" + passwd + "','" + name + "')";
			stmt = conn.createStatement();// Statement 객체를 생성하도록 작성.
			stmt.executeUpdate(sql);//INSERT 문을 실행하도록 Statement 객체의 executeUpdate()메소드를 작성. 
			out.println("Member 테이블 삽입이 성공했습니다. ");//INSERT 문의 실행이 성공하면 메시지를 출력하도록 out.println() 메소드를 작성. 
		}catch (SQLException ex){
			out.println("Member 테이블 삽입이 실패했습니다. <br>");
			out.println("SQLException :" + ex.getMessage());
		} finally { // 생성한 Statement 객체와 Connection 객체를 해제. 
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		}
	%>	
</body>
</html>

 

3.2PreparedStatement 객체로 데이터 접근하기

PreparedStatement 객체는 동적인 쿼리에 사용하며 형식은 다음과 같다. PreparedStatement 객체는 하나의 객체로 여러 번의 쿼리를 실행 할 수 있으며, 동일한 쿼리문을 특정 값만 바꾸어서 여러 번 실행해야 할 때 , 매개변수가 많아서 쿼리문을 정리해야 할 때 유용하다. 

PreparedStatement prepareStatement(String sql) throws SQLException

 

여기서 매개변수 sql 은 데이터베이스에 보낼 쿼리문이며, 쿼리문에 정해지지 않은 값을 물음표(?)로 표시하여 사용한다. 이 물음표에 값을 할당하기 위해 setXxx()메소드를 사용하는데 이 메소드는 2개의 매개변수로 설정한 물음표 위치 값(1부터 시작함) 과 실제 할당될 값을 가진다. 이때 Xxx는 필드의 데이터형으로, 해당 필드의 데이터형이 문자열이면 setString()이 되고 int 이면 setInt() 가 된다. 

 

setXxx()메소드의 종류

메소드 반환 유형 설명
setString(int parameterIndex, String x) void 필드 유형이 문자열인 경우
setInt(int parameterIndex, int x) void 필드 유형이 정수형인 경우
setLong(int parameterIndex, long x) void  필드 유형이 정수형인 경우
setDouble(int parameterIndex, double x) void 필드 유형이 실수형인 경우
setFloat(int parameterIndex, float x) void  필드 유형이 실수형인 경우
setObject(int parameterIndex, Object x) void 필드 유형이 객체형인 경우
setDate(int parameterIndex, Date x) void  필드 유형이 날짜형인 경우
setTimestamp(int parameterIndex, Timestamp x) void 필드 유형이 시간형인 경우

 

PreparedStatement 객체의 메소드 종류

메소드 반환 유형 설명
executeQuery() ResultSet SELECT 문을 실행할 때 사용한다 (ResultSet 객체반환)
executeUpdate() int 삽입, 수정, 삭제와 관련된 SQL 문 실행에 사용한다,
close() void ProparedStatement 객체를 반환할 때 사용한다. 

 

executeQuery() 메소드로 데이터 조회하기

 

executeQuery() 메소드는 동적인 SELECT 쿼리문을 통해 데이터를 검색하는 데 사용하며 형식은 다음과 같다. 

int executeQuery() throws SQLException

 

여기서 매개변수 sql 은 데이터베이스에 보낼 쿼리문이다. 

 

다음은 executeQuery() 메소드를 사용하여 SELECT 문을 실행하는 예로, 쿼리문이 Member테이블에서 id가 1 인 레코드를 검색하여 ResultSet 객체의 rs 에 모든 필드 값을 반환한다. 이예의 실행 결과는 앞서 Statement 객체가 제공하는 메소드로 SELECT 문을 실행한 예의 실행결과와 동일하다. 

 

[executeQuery() 메소드 사용 예 : SELECT 쿼리문]

<%
	Connection conn = null;
    ..(생략)..
    String sql = "SELECT * FROM member WHERE id =?";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1,"1");
    ResultSet rs = pstmt.executeQuery(sql);
    ...(생략)..
    pstmt.close();
%>

 

executeUpdate() 메소드로 데이터 삽입 , 수정, 삭제하기

executeUpdate() 메소드는 INSERT, UPDATE, DELETE 쿼리문을 통해 데이터를 삽입, 수정, 삭제하는 데 사용하며 형식은 다음과 같다. 

int executeUpdate() throws SQLException

 

여기서 매개변수 sql 은 데이터베이스에 보낼 쿼리문이다. 

다음은 executeUpdate() 메소드로 INSERT 쿼리문을 실행하여 데이터베이스에 새로운 데이터를 삽입하는 예로, member 테이블의 id, name, passwd 필드에 각각 '1', '홍길순' ,'1234'를 삽잆하낟. 이 예의 실행 결과는 앞서 Statement 객체가 제공하는 메소드로 INSERT 문을 실행한 예의 실행 결과와 동일하다. 

 

[executeUpdate() 메소드 사용 예 (삽입) : INSERT 쿼리문]

<%

	Connection conn = null;
    ..(생략)..
    String sql = "INSERT INTO member(id, name, passwd) VALUES (?,?,?)";
    pstmt.setString(1, "1");
    pstmt.setString(2, "홍길순");
    pstmt.setString(3, "1234");
    pstmt.executeUpdate();
    ...(생략)..
    pstmt.close();

%>

 

다음은 executeUpdate() 메소드로 UPDATE 쿼리문을 실행하여 데이터베이스에 저장된 데이터를 수정하는 예로, member 테이블의 id 필드값이 1인것을 찾아 name 필드 값을 '관리자'로 변경한다.

 

[executeUpdate() 메소드 사용 예 (수정) : UPDATE 쿼리문]

 

<%
	Connection conn = null;
    ..(생략)..
    String sql = "UPDATE member SET name = ? 'WHERE id = ?";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, "1");
    pstmt.setString(2,"관리자");
    pstmt.executeUpdate();
    ..(생략)..
    pstmt.close();
%>

 

예제 - PreparedStatement 객체로 INSERT 쿼리문 실행하기

 

JSPBook/WebContent/ch16/insert02.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Datebase SQL</title>
</head>
<body>
	<form method="post" action="insert02_process.jsp">
		<p> ID : <input type="text" name="id">
		<p> PW : <input type="password" name="passwd">
		<p> NAME : <input type="text" name="name">
		<p> <input type="submit" value="submit">
	</form>
	
</body>
</html>

 

JSPBook/WebContent/ch16/insert02_process.jsp

<%@page import="com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute"%>
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>Database SQL</title>
</head>
<body>
	<%@ include file="dbconn.jsp" %>
	<%
		request.setCharacterEncoding("utf-8");
	
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
		String name = request.getParameter("name");
		
		//PreparedStatement 객체를 null 로 초기화하도록 작성한다. 
		PreparedStatement pstmt = null;
		
		try{//member 테이블의 id, passwd, name 필드에 정해지지 않은 값을 삽입하도록 INSERT 문을 작성한다.
			String sql = "INSERT INTO member(id, passwd, name) VALUES(?,?,?)";
			pstmt = conn.prepareStatement(sql);// PreparedStatement 객체를 생성하도록 작성.
			//폼 페이지에서 전송된 아이디, 비밀번호, 이름을 위 행에 물음표? 에 설정하도록 setString() 메소드를 작성. 
			pstmt.setString(1, id);
			pstmt.setString(2, passwd);
			pstmt.setString(3, name);
			pstmt.executeUpdate();//INSERT 문을 실행하도록 PreparedStatement 객체의 executeUpdate() 메소드를 작성. 
			out.println("Member 테이블 삽입이 성공했습니다. ");//INSERT 문의 실행이 성공하면 메시지를 출력하도록 out.println() 메소드를 작성. 
		}catch (SQLException ex){
			out.println("Member 테이블 삽입이 실패했습니다. <br>");
			out.println("SQLException :" + ex.getMessage());
		} finally { // 생성한 PreparedStatement 객체와 Connection 객체를 해제. 
			if (pstmt != null)
				pstmt.close();
			if (conn != null)
				conn.close();
		}
	%>	
</body>
</html>

 

 

728x90
반응형