본문 바로가기

JSP, Servlet, MySQL/JSP - webmarket

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

728x90
반응형

04 쿼리문 실행 결과 값 가져오기

앞에서 select 쿼리문 실행 시 executeQuery() 메소드를 사용하고 실행 결과가 java.sql.ResultSet 형으로 반환된 것을 보았다. ResultSet 또는 PreparedStatement 객체로 SELECT 문을 사용하여 얻어온 레코드 값을 테이블 형태로 가진 객체이다. SELECT 쿼리문의 실행 결과 값을 가져오는 ResultSet 객체의 형식은 다음과 같다. 

 

[Statement 객체를 사용하는 경우]

 

ResultSet executeQuery(String sql) throws SQLException

 

[PreparedStatement 객체를 사용하는 경우]

 

ResultSet executeQuery() throws SQLException

 

ResultSet 객체는 SELECT 문으로 필드 값을 가져오기 위해 getXxx() 메소드를 사용하고  Xxx는 필드의 데이터형과 관련이 있다. 즉 해당 필드의 데이터형이 문자열이면 getString() 이 되고 int 이면 getInt() 가 된다. 이때 한가지 주의할 점은 ResultSet 객체의 getXxx() 메소드를 사용하여 필드 순번으로 필드 값을 가져온다면 첫 번째는 1부터 시작한다는 것이다. 

 

ResultSet 객체의 메소드 종류

메소드 반환 유형 설명
getXxx(int ColumnIndex) XXX 설정한 ColumnIndex(필드 순번)의 필드 값을 설정한 XXX형으로 가져온다.
getXxx(String ColumnName) XXX 설정한 ColumnName(필드 순번)의 필드 값을 설정한 XXX형으로 가져온다.
absolute(int row) boolean 설정한 row 행으로 커서를 이동한다. 
beforeFirst() void 첫번째 행의 이전으로 커서를 이동한다. 
afterLast() void 마지막 행의 다음으로 커서를 이동한다. 
first() void 첫번쨰 행으로 커서를 이동한다. 
last() void 마지막 행으로 커서를 이동한다. 
next() boolean 다음 행으로 커서를 이동한다. 
previous() boolean  현재 행의 이전 행으로 커서를 이동한다. 
close(): void ResultSet 객체를 반환할 때 사용한다. 

 

NOTE_ 다양한 ResultSet 객체의 메소드 종류는 https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html을 을 참고한다. 

 

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

 

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

<%
	Connection conn = null;
    ..(생략)..
    Statement stmt = conn.createStatement();
    String sql = "SELECT * FROM member WHERE id = '1";
    ResultSet rs = stmt.executeQuery(sql);
    
    while(rs.next()) {
    	out.println(rs.getString(2) + "," + rs.getString(3) + "<br/>");
    }
    rs.colse();
    stmt.close();
%

 

예제- Statement 객체를 이용하여  SELECT 쿼리문 실행 결과 값 가져오기 

 

JSPBook/WebContent/ch16/select01.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>Datebase SQL</title>
</head>
<body>
	<%@ include file="dbconn.jsp" %>
	<table width="300" border="1">
		<tr>
			<th>아아디</th>
			<th>비밀번호</th>
			<th>이름</th>
		</tr>
		<%
		
			//ResultSet, Statement 객체를 null 로 초기화하도록 작성한다. 
			ResultSet rs = null;
			Statement stmt = null;
			
			try{
				String sql = "select * from member";// member 테이블의 모든 필드 값을 가져오도록 SELECT 문을 작성한다. 
				stmt = conn.createStatement();//Statement 객체를 생성하도록 작성한다. 
				rs = stmt.executeQuery(sql);//SELECT 문을 실행하도록 Statement 객체의 executeQuery() 메소드를 작성한다. 
				
				while (rs.next()) {// SELECT 문으로 가져온 레코드가 있을 떄까지 id, passwd, name 필드 값을 가져와 출력 하도록 반복해서 실행한다. 
					String id = rs.getString("id");
					String pw = rs.getString("passwd");
					String name = rs.getString("name");
		%>
		<tr>
			<td><%=id %></td>
			<td><%=pw %></td>
			<td><%=name %></td>
		</tr>
		<%
				}
			}catch (SQLException ex){
				out.println("Member 테이블 호출이 실패했습니다. <br>");
				out.println("SQLException : " + ex.getMessage());
			} finally { // 생성한 객체를 해제한다. 
				if (rs != null)
					rs.close();
				if(stmt != null)
					stmt.close();
				if (conn != null)
					conn.close();
				
			}
		%>
	</table>
</body>
</html>

 

예제-PreparedStatement 객체를 이용해서 SELECT 쿼리문 실행 결과 값 가져오기

 

JSPBook/WebContent/ch16/select02.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>Datebase SQL</title>
</head>
<body>
	<%@ include file="dbconn.jsp" %>
	<table width="300" border="1">
		<tr>
			<th>아아디</th>
			<th>비밀번호</th>
			<th>이름</th>
		</tr>
		<%
		
			//ResultSet, Statement 객체를 null 로 초기화하도록 작성한다. 
			ResultSet rs = null;
			PreparedStatement pstmt = null;
			
			try{
				String sql = "select * from member";// member 테이블의 모든 필드 값을 가져오도록 SELECT 문을 작성한다. 
				pstmt = conn.prepareStatement(sql);
				rs = pstmt.executeQuery();
				
				while (rs.next()) {// SELECT 문으로 가져온 레코드가 있을 떄까지 id, passwd, name 필드 값을 가져와 출력 하도록 반복해서 실행한다. 
					String id = rs.getString("id");
					String pw = rs.getString("passwd");
					String name = rs.getString("name");
		%>
		<tr>
			<td><%=id %></td>
			<td><%=pw %></td>
			<td><%=name %></td>
		</tr>
		<%
				}
			}catch (SQLException ex){
				out.println("Member 테이블 호출이 실패했습니다. <br>");
				out.println("SQLException : " + ex.getMessage());
			} finally { // 생성한 객체를 해제한다. 
				if (rs != null)
					rs.close();
				if(pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
				
			}
		%>
	</table>
</body>
</html>

 

예제 - Statement 객체를 이용하여 UPDATE 쿼리문 실행 결과 값 가져오기

 

JSPBook/SebContent/ch16/update01.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="update01_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/SebContent/ch16/update01_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");
		
		//ResultSet, Statement 객체를 null 로 초기화하도록 작성한다. 
		ResultSet rs = null;
		Statement stmt = null;
		
		try{
			String sql = "select id, passwd, name from member where id = '"+id +"'";//member 테이블에서 폼 페이지로부터 전송된 id 와 일치하는 레코드를 찾아 해당 id, passwd 필드 값을 가져오도록 SELECT 문을 작성한다. 
			stmt = conn.createStatement();//statement 객체를 생성하도록 createStatement() 메소드를 작성한다. 
			rs = stmt.executeQuery(sql);//SELECT 문을 실행하도록 Statement 객체의 executeQuery() 메소드를 작성한다. 
			
			if(rs.next()){//select 문으로 가져온 레코드가 있으면 실행한다. 
				String rId = rs.getString("id");
				String rPasswd = rs.getString("passwd");
				
				if(id.equals(rId) && passwd.equals(rPasswd)){
					sql = "update member set name = '" + name + "'where id = '" + id + "'";//member테이블에서 폼 페이지로부터 전송된 id와 일치하는 레코드를 찾아 name 필드 값을 변경하도록 UPDATE문을 작성한다. 
					stmt = conn.createStatement();//statement 객체를 생성하도록 createStatement()메소드를 작성한다. 
					stmt.executeUpdate(sql);//select 문을 실행하도록 Statement 객체의 executeUpdate() 메소드를 작성한다. 
					out.println("Member 테이블을 수정했습니다. ");
				}else
					out.println("일치하는 비밀번호가 아닙니다. ");
			}else
				out.println("Member 테이블에 일치하는 아이디가 없습니다. ");
		}catch (SQLException ex){
			out.println("SQLException : " + ex.getMessage());
		}finally{//생성한 객체를 해제한다. 
			if (rs != null)
				rs.close();
			if (stmt != null)
				stmt.close();
			if(conn != null)
				conn.close();
		}
	%>	
</body>
</html>

 

 

예제- PreparedStatement 객체를 이용하여 UPDATE 쿼리문 실행 결과 값 가져오기 

 

JSPBook/SebContent/ch16/update02.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="update02_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/SebContent/ch16/update02_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");
		
		//ResultSet, PreparedStatement 객체를 null 로 초기화하도록 작성한다. 
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		
		try{
			//member 테이블에서 폼 페이지로부터 전송된 id와 일치하는 레코드를 찾아 해당 id, passwd 필드 값을 가져오도록 SELECT 문을 작성한다. 
			String sql = "select id, passwd from member where id = ? ";
			
			//PreparedStatement 객체를 생성하도록 prepareStatement() 메소드를 작성한다. 
			pstmt = conn.prepareStatement(sql);
			
			//위 21행의 물음표에 해당하는 값을 설정하도록 setString() 메소드를 작성한다. 
			pstmt.setString(1,id);
			
			//SELECT 문을 실행하도록 PreparedStatement 객체의 executeQuery() 메소드를 작성한다. 
			rs = pstmt.executeQuery();
			
			//SELECT 문으로 가져온 레코드가 있으면 실행한다. 
			if(rs.next()){
				String rId = rs.getString("id");
				String rPasswd = rs.getString("passwd");
				
				if(id.equals(rId) && passwd.equals(rPasswd)){
					//member 테이블에서 폼 페이지로부터 전송된 id와 일치하는 레코드를 찾아 name 필드 값을 변경하도록 UPDATE 문을 작성한다. 
					sql = "update member set name = ? where id = ?";
					//PreparedStatement 객체를 생성하도록 prepareStatement() 메소드를 작성한다. 
					pstmt = conn.prepareStatement(sql);
					
					//39 행의 물음표에 해당하는 값을 설정하도록 setString() 메소드를 작성한다. 
					pstmt.setString(1, name);
					pstmt.setString(2, id);
					//SELECT 문을 실행하도록 PreparedStatement 객체의 executeUpdate() 메소드를 작성한다. 
					pstmt.executeUpdate();
					out.println("Member 테이블을 수정했습니다. ");
				}else
					out.println("일치하는 비밀번호가 아닙니다. ");
			}else
				out.println("Member 테이블에 일치하는 아이디가 없습니다. ");
		}catch (SQLException ex){
			out.println("SQLException : " + ex.getMessage());
		}finally{//생성한 객체를 해제한다. 
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			if(conn != null)
				conn.close();
		}
	%>	
</body>
</html>

 

 

예제 - Statement 객체를 이용하여 DELETE 쿼리문 실행 결과 값 가져오기 

 

JSPBook/WebContent/ch16/delete01.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="delete01_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/delete01_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");
		
		//ResultSet, Statement 객체를 null 로 초기화 하도록 작성한다. 
		ResultSet rs = null;
		Statement stmt = null;
		
		try{
			String sql = "select id, passwd from member where id = '"+id+"'";//member 테이블에서 폼 페이지로부터 전송된 id 와 일치하는 레코드를 찾아 해당 id, passwd 필드 값을 가져오도록 SELECT 문을 작성. 
			stmt = conn.createStatement();//Statement 객체를 생성하도록 createStatement() 메소드를 작성한다. 
			rs = stmt.executeQuery(sql);// SELECT 문을 실행하도록 Statement 객체의 executeQuery() 메소드를 작성한다. 
			
			
			//SELECT 문으로 가져온 레코드가 잇으면 실행한다. 
			if(rs.next()){
				String rId = rs.getString("id");
				String rPasswd = rs.getString("passwd");
				
				if(id.equals(rId) && passwd.equals(rPasswd)){
					
					//member 테이블에서 폼 페이지로부터 전송된 id 와 일치하는 레코드를 찾아 삭제하도록 DELETE 문을 작성한다. 
					sql = "delete from member where id = '"+id+"' and passwd = '"+passwd+"'";
					//Statement 객체를 생성하도록 createStatement() 메소드를 작성한ㄴ다. 
					stmt = conn.createStatement();
					//SELECT 문을 실행하도록 Statement 객체의 executeUpdate() 메소드를 작성한다. 
					stmt.executeUpdate(sql);
					out.println("Member 테이블을 삭제했습니다. ");
					
				}else 
					out.println("일치하는 비밀번호가 아닙니다. ");
			}else
				out.println("Member 테이블에 일치하는 아이디가 없습니다. ");
		} catch (SQLException ex){
			out.println("SQLException : " + ex.getMessage());
		}finally { //생성한 객체를 해제한다. 
			if(rs!= null)
				rs.close();
			if(stmt != null)
				stmt.close();
			if(conn!= null)
				conn.close();
		}
	%>	
</body>
</html>

 

JSPBook/WebContent/ch16/delete02.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="delete02_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/delete02_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");
		
		//ResultSet, Statement 객체를 null 로 초기화 하도록 작성한다. 
		ResultSet rs = null;
		PreparedStatement pstmt = null;
		
		try{
			String sql = "select id, passwd from member where id = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			rs = pstmt.executeQuery();
			
			
			//SELECT 문으로 가져온 레코드가 잇으면 실행한다. 
			if(rs.next()){
				String rId = rs.getString("id");
				String rPasswd = rs.getString("passwd");
				
				if(id.equals(rId) && passwd.equals(rPasswd)){
					sql = "delete from member where id = ? and passwd = ? ";
					pstmt = conn.prepareStatement(sql);
					pstmt.setString(1, id);
					pstmt.setString(2 , passwd);
					pstmt.executeUpdate();
					out.println("Member 테이블을 삭제했습니다. ");
					
				}else 
					out.println("일치하는 비밀번호가 아닙니다. ");
			}else
				out.println("Member 테이블에 일치하는 아이디가 없습니다. ");
		} catch (SQLException ex){
			out.println("SQLException : " + ex.getMessage());
		}finally { //생성한 객체를 해제한다. 
			if(rs!= null)
				rs.close();
			if(pstmt != null)
				pstmt.close();
			if(conn!= null)
				conn.close();
		}
	%>	
</body>
</html>
728x90
반응형