앞선 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 : 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를 사용할 때와 차이점이 보이는가??
다른 점을 하나씩 비교해보자
우선 메서드를 선언할 때 stmt의 경우 매개변수가 없이 선언되지만, stmt는 매개변수를 테이블에 맞게 선언해준다.
String sql
변수 선언에서 초기화 할때, value
값을 ?
로 설정했다.
?
로 설정해준다.메서드 변경
Statement stmt = con.createStatement(sql)
에서PreparedStatement pstmt = con.prepareStatement(sql)
로 변경setString()
, setInt()
사용
set자료형(? 순서, 입력할 값)
이제 위 코드를 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은 한번 사용한 쿼리가 저장되기 때문에 반복해서 사용할 경우에 아주 유용하다