Coding Planet

[JDBC] executeQuery와 executeUpdate()의 차이는?, 실제 사용 예제 포함 본문

Server

[JDBC] executeQuery와 executeUpdate()의 차이는?, 실제 사용 예제 포함

jhj.sharon 2023. 4. 2. 17:28
반응형

 

 

executeQuery()와 executeUpdate() 메서드는 JDBC API에서 제공하는 메서드로,
데이터베이스와 상호작용하는 데 사용된다. 회원 가입, 회원 정보 수정, 비밀번호 변경, 회횐 탈퇴등 DB와 연결하여
기능을 만들경우 DAO에서 사용하는데 그 차이점에 대해서 공부하고자 한다.

 

 

1. executeQuery()

  • SELECT 문과 같은 쿼리문을 실행할 때 사용한다.
  • 쿼리를 실행하고, 결과를 ResultSet 객체로 반환한다. 반환된 ResultSet 객체를 통해 결과를 가져올 수 있다.
  • SELECT는 하나 이상의 레코드를 조회하게 되는데 이 때 결과 집합을 반환한다. ResultSet은 결과 세트에 대한 커서를 포함하므로 사용자가 쿼리 결과를 반복적으로 가져올 수 있다.
  • 커서는 데이터베이스에서 조회된 결과 집합에서 현재 위치를 나태내는 포인터로 이를 이용해 하나의 행을 읽어오고, 디음 행으로 이동하여 원하는 레코드를 순차적으로 탐색할 수 있다.

 

 

 

** executeQuery()의 사용

  • 회원의 이메일을 입력해서 해당 회원의 정보를 가져오는 기능을 구현했다.
  • DAO에서는 sql을 실행하고 해당 결과를 DB로 반환받는다.
  • 이 때 SELECT문은 여러 레코드를 조회하면서 결과 집합을 반환하기 때문에 executeQuery()사용해 실행하고  if(rs.next()) 를 통해 다음 결과가 있을 경우 커서를 열(column)을 따라 하나하나 이동해가며 member 객체에 저장하고 반환하게 된다.
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import edu.kh.community.model.vo.Member;

import static edu.kh.community.common.JDBCTemplate.*;

public class MemberDAO {
	
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	private Properties prop;
	
	public MemberDAO() {
		try {
			prop = new Properties();
			
			String filePath = MemberDAO.class.getResource("/edu/kh/community/sql/member-sql.xml").getPath();
			
			prop.loadFromXML(new FileInputStream(filePath));
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	public Member selectOne(Connection conn, String memberEmail) throws Exception {

		Member member = null;
		
		try {
			
			String sql = 'SELECT MEMBER_EMAIL, MEMBER_NICK , MEMBER_TEL , MEMBER_ADDR,
						  TO_CHAR(ENROLL_DT, 'YYYY"년" MM"월" DD"일"') AS ENROLL_DATE
						  FROM "MEMBER" 
						  WHERE MEMBER_EMAIL = ?
						  AND SECESSION_FL = 'N'';
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memberEmail);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				member = new Member();
				member.setMemberEmail(rs.getString(1));
				member.setMemberNickname(rs.getString(2));
				member.setMemberTel(rs.getString(3));
				member.setMemberAddress(rs.getString(4));
				member.setEnrollDate(rs.getString(5));
			}
			
			
		}finally {
			
			close(rs);
			close(pstmt);
			
			
		}
		
		return member;
	}

 

 

 

2.executeUpdate()

  • executeUpdate()는 INSERT, UPDATE, DELETE와 같은 DML(Data Manipulation Language)에서 실행 결과로 영향을 받은 레코드 수를 반환한다.
  • executeUpdate()는 반환 타입이 int이므로, 쿼리 실행 결과로 반환되는 값을 int로 받아와야 한다.
  • executeUpdate()는 행의 개수를 반환하기 때문에  rs를 사용할 필요 없다.

 

 

** executeUpdate()의 사용

  • 이 코드는 비밀번호를 변경하는 기능을 구현하기 위한 DAO이다.
  • 회원이 입력한 새로운 비밀번호를 DB에 저장한다. 이 때 로그인 세션에 기록된 회원번호를 조건으로 DB를 업데이트 하는 UPDATE문을 실행하게 된다.
  • (패스워드는 UNIQUE하지 않아 회원간 중복 될 수 있기 때문에 UNIQUE한 회원 번호로 조건문을 만들어야 한다.)
  • UPDATE문의 경우 UPDATE가 성공할 경우 1, 실패할 경우 0을 반환하기 때문에 exeuteUpdate()메서드를 사용했고 ResultSet을 거치치 않고 그 결과값을 바로 int  result에 저장했다.
/**비밀번호 변경 DAO
	 * @param conn
	 * @param currentPw
	 * @param newPw
	 * @param memberNo
	 * @return
	 * @throws Exception
	 */
	public int changePw(Connection conn, String currentPw, String newPw, int memberNo) throws Exception {

		int result = 0;
		
		try {
			
			String sql = prop.getProperty("changePw");
			
			//UPDATE MEMBER SET  MEMBER_PW=? WHERE MEMBER_NO=? AND MEMBER_PW=?
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, newPw);
			pstmt.setInt(2, memberNo);
			pstmt.setString(3, currentPw);

			result = pstmt.executeUpdate();
		
		}finally{
			
		close(pstmt);
			
		}
		System.out.println("DAO : " + result);
		
		return result;
		
	}

 

 

반응형
Comments