디자인 패턴 중 하나로, 매번 드라이버를 로드하지 않고 프로세스에서 객체를 단 하나만 만들어 재활용할 수 있도록 공유 자원을 생성하는 방법
public class Dbconn {
private static Connection conn;
public static Connection getConnection() throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://127.0.0.1/aidev?useSSL=false";
String uid = "root";
String upw = "1234";
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, uid, upw);
return conn;
}
}
Statement와 PreparedStatement의 차이는 캐시 사용 유무
객체를 캐시에 담아 사용
반복적으로 쿼리를 수행한다면 statement에 비해 성능이 많이 좋음
statement는 보안상 취약점이 발견되었기 때문에 PreparedStatement 를 사용하는 것을 권장하고 있음
코드가 길어질 수 있음
# Statement
StringBuilder sql = new StringBuilder();
sql.append("delete from tb_member")
.append("where mem_userid = '" + mem_userid + "' ");
# PreparedStatement
StringBuilder sql = new StringBuilder();
sql.append("delete from tb_member")
.append("where mem_userid = '" + mem_userid + "' ");
PreparedStatement pstmt = conn.preparedStatement(sql.toString());
pstmt.setString(1, mem_userid);
pstmt.executedUpdate();
결과를 저장할 수 있는 객체
저장된 값을 로우 단위로 불러올 수 있음
로우 단위로 데이터를 가져올 경우 타입을 지정하여 불러올 수 있음
StringBuilder sql = new StringBuilder();
sql.append("select * from tb_member where mem_userid=? and mem_pw =? ");
Connection conn = Dbconn.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, mem_userid);
pstmt.setString(2, mem_userpw);
pstmt.executeQuery();