선처리 방식으로 미리 컴파일된 SQL문을 가지고 있다가 동적으로 칼럼값을 채워 질의문을 수행할 수 있어 효율적인 SQL문을 구사할 수 있다.
웹 개발에서는 보안문제(SQL injection) 때문에 PreparedStatement를 사용한다.
PreparedStatement 이용해서 DB데이터 수정 해보자
먼저 MariaDB CMD창을 열어 테이블을 조회하자.
자바로 돌아와서 데이터베이스와의 연결 및 데이터 처리를 위해 사용되는 변수들을 선언해주자.
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
메인 메서드에 생성자명과 동일하게 객체를 생성하고 class에 생성자를 호출하자.
public 생성자명() {
dbLoading();
accessdb();
}
생성자 안에 dbLoading(); accessdb(); 메서드를 호출하는 식으로 코드를 작성하였다.
먼저 dbLoading() 메서드를 호출하여 DB와 드라이버를 로드하는 코드를 작성하자.
private void dbLoading() {
try {
Class.forName("org.mariadb.jdbc.Driver");
} catch (Exception e) {
System.out.println("로딩 실패: " + e);
System.exit(0);
}
}
try ~ catch문을 사용하고 jdbc 드라이버를 통해 MariaDB와 로드하였고 예외상황의 발생을 대비해서 catch구절에 메세지 출력하는것도 추가하였다.
private void accessdb() {
try {
conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:포트번호/test", "root", "DB비밀번호");
// 자료 수정
String updatesql = "update sangdata set sang = ?, su = ?, dan = ? where code = ?";
pstmt = conn.prepareStatement(updatesql);
pstmt.setString(1, "아디다스");
pstmt.setString(2, "5");
pstmt.setInt(3, 1100);
pstmt.setString(4, "4");
pstmt.executeUpdate()
} catch (Exception e) {
System.out.println("연결 실패 : " + e);
System.exit(0);
} finally {
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
} catch (Exception e2) {
}
}
}
자료 수정을 위해 문자열의 updatesql 참조명을 주었고, update sangdata set sang = ?, su = ?, dan = ? where code = ? 이라는 조건을 부여하였다.
여기서 ?라는 매개변수를 사용한 이유는
SQL 쿼리 문자열 안에 파라미터를 직접 포함하지 않고, 대신 ?를 사용하여 파라미터를 나타낸다. 이로 인해 쿼리 문자열이 더 간결해지며, 쿼리를 이해하고 유지보수하기가 더 쉬워지기 때문이다.
pstmt.setString(1, "나이키");
pstmt.setString(2, "4");
pstmt.setInt(3, 1200);
pstmt.setString(4, "4");
pstmt.executeUpdate()
sangdata 테이블에 저장되어 있는 데이터 타입에 따라 알맞게 수정해주면 된다.
데이터값이 아디다스
에서 나이키
로 바뀐걸 확인할 수 있다.