이번 주제에서 알아볼 것은 Java에서 동적으로 SQL을 처리하는 방법을 알아보겠습니다.
일단 PreparedStatement(java.sql.PreparedStatement)는 Statement 보다 향상된 기능을 가지고 있습니다.
주요 특징
- 인자값으로 전달이 가능하다.
- 가독성이 높다.
- 기존 Statement 보다 성능이 좋다.
이전 Statement가 궁금하시면 https://aricode.tistory.com/10를 참고해주세요!
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBConnection {
private Connection con;
private ResultSet rs;
private PreparedStatement pstmt;
public DBConnection() {
try {
//url 수정했습니다.
String url = "jdbc:mysql://localhost/coffee?characterEncoding=UTF-8&serverTimezone=UTC";
String user = "root";
String passwd = "1234";
con = DriverManager.getConnection(url, user, passwd);
System.out.println("DB연결 성공");
pstmt = con.prepareStatement("select * from Example");
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1) + "\t" + rs.getString(2));
}
rs.close();
pstmt.close();
con.close();
} catch (SQLException e) {
System.out.println("DB연결 실패하거나, SQL문이 틀렸습니다.");
System.out.print("사유 : " + e.getMessage());
}
}
public static void main(String[] args) {
new DBConnection();
}
}
위 코드를 보시면 url을 수정했습니다. 유의해 주시기 바랍니다.
이렇게만 보면 PrepareStatement와 기존 Statement차이가 거의 나지 않는다. (약간의 성능은 좋아질 수 있습니다.)
하지만 PrepareStatement는 데이터 값을 추가해야 할 때 차이가 확연히 드러난다.
예시를 보여 드리겠습니다.
int number = 1;
String name = "라떼";
stmt = con.createStatement();
stmt.executeQuery("select * from Example where c_no = "+ number +" and c_name = '"+ name +"'");
pstmt = con.prepareStatement("select * from Example where c_no = ? and c_name = ?");
pstmt.setInt(1, number);
pstmt.setString(2, name);
기존 Statement를 이용해서 데이터를 넣어줄려면 값을 직접 작성해야 했다.
하지만, PrepareStatement는 메서드와, "?" 이것을 이용해서 데이터를 전달할 수 있다.
만약 집어 넣어야 할 데이터가 많아진다면 Statement의 쿼리는 정말 지저분하게 될것이다.
그렇기에 PrepareStatement 클래스를 통해 가독성과, 효율성을 둘다 챙길 수 있는 좋은 방법을 사용한다.
set타입은 작성한 SQL문에 있는 ? 라는 값을 바꿔주는 역할이다 *중요*
예시) 첫 번째 ?를 숫자형 100으로 변경하고 싶으면 setInt(1, 100) 형식으로 작성하면 된다.
마지막으로 해야하는것은 Statement때와 다르게 PrepareStatement는 execute를 따로 해야한다.
여기서도 executeQuery, executeUpdate 메소드를 사용해야 한다.
(두 메소드의 대한 설명은 https://aricode.tistory.com/9에 나와있으니 참고 부탁드립니다!)
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBConnection {
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
private Statement stmt;
public DBConnection() {
try {
String url = "jdbc:mysql://localhost/coffee?characterEncoding=UTF-8&serverTimezone=UTC";
String user = "root";
String passwd = "1234";
con = DriverManager.getConnection(url, user, passwd);
System.out.println("DB연결 성공");
int number = 1;
String name = "라떼";
// stmt = con.createStatement();
// stmt.executeQuery("select * from Example where c_no = "+ number +" and c_name = '"+ name +"'");
pstmt = con.prepareStatement("select * from Example where c_no = ? and c_name = ?");
pstmt.setInt(1, number);
pstmt.setString(2, name);
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt(1) + "\t" + rs.getString(2));
}
rs.close();
pstmt.close();
con.close();
} catch (SQLException e) {
System.out.println("DB연결 실패하거나, SQL문이 틀렸습니다.");
System.out.println("사유 : " + e.getMessage());
}
}
public static void main(String[] args) {
new DBConnection();
}
}
쿼리문이 성공하면 결과값으로 "1 라떼" 데이터가 출력된걸 확인할 수 있다.
JDBC 부분은 이걸로 끝이 났습니다.
이 외에도 많은 내용지 있지만, 제가 충분히 내용을 숙지하고 작성하기 위해서 시간은 오래 걸릴거 같습니다.
그래서 가끔은 일상 관련해서 글을 작성해 볼려고 합니다.
저번에 1달 1이상 글작성을 목표로 했는데 건강 문제도 있고해서, 취소하겠습니다 죄송합니다.
그래도 제 글을 보기 위해서 들어와 주신 모든 분들께 너무 감사드립니다.
'Java' 카테고리의 다른 글
[JDBC] ResultSet을 통해 결과값을 불러오기 - (Mysql 8.0 버전) (0) | 2020.08.16 |
---|---|
[JDBC] ResultSet을 통해 결과값을 불러오기 (6) | 2020.06.20 |
[JDBC] 자바에서 sql문 처리하기 (Statement) (3) | 2020.05.01 |
[JDBC] 자바로 mysql 8 버전 연결하기 (0) | 2020.03.06 |
자바 메모장 파일 작성하기 (FileOutputStream) (0) | 2020.03.05 |