Coding Planet
[JDBC] executeQuery와 executeUpdate()의 차이는?, 실제 사용 예제 포함 본문
반응형
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;
}
반응형
'Server' 카테고리의 다른 글
[JDBC] Oracle DB 연동 JDBC : INSERT 예제 (0) | 2023.04.05 |
---|---|
[JDBC] Oracle DB 연동 JDBC : SELECT 예제 (0) | 2023.04.04 |
[Servlet] 암호화 필터 예제 (0) | 2023.03.27 |
[JDBC] MVC 패턴으로 JDBC 구현하기 (0) | 2023.03.23 |
[Servlet/JSP] 내장 객체와 범위(scope), 내장 객체의 우선순위 (0) | 2023.03.21 |
Comments