JDBC : PreparedStatement

ROK·2022년 8월 10일
0

JDBC

목록 보기
3/4
post-custom-banner

앞선 JDBC Statement를 통해 쿼리를 전달하는 방법을 배웠다.

코드를 다시 확인하면 다음과 같다

	public boolean createTable() throws SQLException {
		boolean flag = false;
		
		String sql = "create table toys (";
				sql += "No int primary key not null, ";
				sql += "name varchar(20) not null, ";
				sql += "manufacturing varchar(20) not null, ";
				sql += "price int not null ";
				sql += ")";
		
		Connection con = ConnectionManager.getConnection();
		Statement stmt = con.createStatement();
		int affectedCount = stmt.executeUpdate(sql);
		
		System.out.println("쿼리의 반환값은 : " + affectedCount);
		
		if (affectedCount == 0) {
			flag = true;
		}
		stmt.close();
        con.close();
        
		return flag;
	}

위 코드는 DB에 table을 생성하는 코드로 만약 다른 table을 만들려고 한다면 String sql에 들어가는 쿼리의 값들을 계속해서 변경해줘야 한다.

계속 똑같은 코드를 작성하는 것은 매우 비효율적이고 보기에도 좋지않다.

이러한 문제를 해결하기 위해서 사용하는 것이 PreparedStatement이다.

PreparedStatement

PreparedStatement : pstmt는 사용법에 있어서 statement : stmt와 크게 다르지 않다.
(보통 stmt와 크게 차이가 없지만 pstmt는 한번 사용한 쿼리가 저장되기 때문에 반복해서 사용할 경우에는 pstmt를 사용한다)

차이가 있다면 PreparedStatement는 쿼리를 수행할 때, 원하는 부분만 매개변수로 하여 코드를 재사용할 수 있게 해준다.

사용 예제

앞에서 생성한 toys 테이블에 insert하는 구문

public boolean insertToy(String name, String manufacturing, int price) throws SQLExeption {
	boolean flag = false;
    
    String sql = "insert into toys (name, manufacturing, price) values (?, ?, ?)";
    
    Connection con = ConnectionManager.getConnection();
    PreparedStatement pstmt = con.preparedStatement(sql);
    
    pstmt.setString(1, name);
    pstmt.setString(2, manufacturing);
    pstmt.setInt(3, price);
    
    int affectedCount = pstmt.executeUpdate();
    
    if(affectedCount > 0) {
    	flag = true;
	}
    
    pstmt.close();
    con.close();
    
    return flag;

앞의 Statement를 사용할 때와 차이점이 보이는가??

다른 점을 하나씩 비교해보자

  1. 우선 메서드를 선언할 때 stmt의 경우 매개변수가 없이 선언되지만, stmt는 매개변수를 테이블에 맞게 선언해준다.

  2. String sql 변수 선언에서 초기화 할때, value 값을 ?로 설정했다.

    • 코드를 보면 짐작할 수 있겠지만, 매개변수로 전달할 값을 ?로 설정해준다.
  3. 메서드 변경

    • Statement stmt = con.createStatement(sql)에서
    • PreparedStatement pstmt = con.prepareStatement(sql)로 변경
  4. setString(), setInt() 사용

    • 메서드의 형식은 set자료형(? 순서, 입력할 값)
    • 순서는 1부터 시작한다.

Main 실행

이제 위 코드를 main에서 실행하고 결과를 확인해본다

package test;

import java.sql.SQLException;

public class DAOMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DAOMain main = new DAOMain();
//		main.MakeTable();
		main.InsertTable("Iphone 13", "Apple", 720);
		
	}
	
	public void MakeTable() {
		DAO dao = new DAO();
		
		try {
			dao.createTable();
			System.out.println("테이블 생성 성공");
		} catch (SQLException e) {
			System.out.println("테이블 생성 실패");
			e.printStackTrace();
		}
	}
	
	public void InsertTable(String name, String manufacturing, int price) {
		pstmtDAO dao = new pstmtDAO();
		
		try {
			dao.insertToy(name, manufacturing, price);
			System.out.println("레코드 삽입 성공");
		} catch(SQLException e) {
			System.out.println("레코드 삽입 실패");
			e.printStackTrace();
		}
	}
}

앞의 Main 코드에 InsertTable(~,~,~)과 같이 메서드를 정의해주고, 예외처리한 이후 Main에서 실행했다.

그럼 아래와 같은 성공 메시지를 확인할 수 있고,

MySQL에서 확인한 결과 값들이 잘 들어온 것을 알 수 있다.

앞에서 설명했지만,
PreparedStatement한번 사용한 쿼리가 저장되기 때문에 반복해서 사용할 경우에 아주 유용하다

profile
하루에 집중하자
post-custom-banner

0개의 댓글