[09-D16][JDBC] PreparedStatement
[01] PreparedStatement 클래스의 사용
- 자바에서 보낸 쿼리가 데이터베이스의 캐시 영역에 컴파일되어 저장되어 있음으로
같은 쿼리를 실행시 빠른 처리속도를 지원합니다.
- 10000개의 레코드 추가시 Statement 클래스 보다 처리속도 약 13초 빠름.
- 간결하고 구조적인 쿼리문 작성 가능.
- 반복해서 같은 쿼리를 보낼 경우 효과가 큼.
- SQL Injection등의 공격을 피할 수 있는 구조를 가지고 있음.
- 현재 Oracle만 이 기능을 지원합니다. 따라서 다른 데이터베이스는 내부적으로
Statement로 변경되어 실행됩니다. (MySQL은 5.0버전부터 지원)
- INSERT, UPDATE, DELETE SQL 실행
int cnt = pstmt.executeUpdate();
- SELECT SQL 실행
ResultSet rs = pstmt.executeQuery();
- 콘솔상에서의 실행, JDBC Driver 복사
H:
cd H:\dos4\workspace_java\day17\bin
java -classpath %CLASSPATH%;mysql-connector-java-5.1.12-bin.jar prep.SelectPrepDB
- 테이블 구조
. PRIMARY KEY: 컬럼의 값은 중복된 값이 올 수 없습니다.
. AUTO_INCREMENT: 레코드 추가시 일련번호를 순차적으로 자동으로
생성해 줍니다.
DROP TABLE predb;
CREATE TABLE predb(
no INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
language VARCHAR(20) NOT NULL,
db VARCHAR(20) NOT NULL,
os VARCHAR(30) NOT NULL
);
-- no컬럼은 AUTO_INCREMENT 속성이 선언되어 있음으로 레코드 추가시
-- 컬럼을 명시하지 않아도 자동으로 일련번호가 등록됩니다.
INSERT INTO predb(language, db, os)
VALUES('JSP', 'MySQL, Oracle', '모든 운영체제');
INSERT INTO predb(language, db, os)
VALUES('ASP', 'Access, MS-SQL', 'Windows Server');
INSERT INTO predb(language, db, os)
VALUES('ASP.NET', 'MS-SQL', 'Windows Server');
INSERT INTO predb(language, db, os)
VALUES('PHP', 'MySQL', '모든 운영체제');
SELECT no, language, db, os FROM predb;
+----+----------+----------------+----------------+
| no | language | db | os |
+----+----------+----------------+----------------+
| 1 | JSP | MySQL, Oracle | 모든 운영체제 |
| 2 | ASP | Access, MS-SQL | Windows Server |
| 3 | ASP.NET | MS-SQL | Windows Server |
| 4 | PHP | MySQL | 모든 운영체제 |
+----+----------+----------------+----------------+
Eclipse setting
Project type: Java Project
Project name: mysql_prep
1. INSERT의 이용
- statementd의 PreparedStatement로의 변경
>>>>> InsertPrepDB.java
package prep;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
//import java.sql.ResultSet;
import java.sql.SQLException;
public class InsertPrepDB {
public static void main(String args[]) {
Connection con=null;
PreparedStatement pstmt=null;
//ResultSet rs=null;
String url = "jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr";
String jdbc = "org.gjt.mm.mysql.Driver";
String user = "javauser";
String pass = "1234";
try {
Class.forName(jdbc);
//커넥션 연결
con = DriverManager.getConnection(url, user, pass);
String sql = " INSERT INTO predb(language, db, os) ";
sql = sql + " VALUES(?, ?, ?)";
//쿼리 지정
pstmt = con.prepareStatement(sql);
//(물음표의 순번, 적용할 값)
pstmt.setString(1, "MVC");
pstmt.setString(2, "oracle");
pstmt.setString(3, "모든 운영체제");
// 레코드 추가후 1을 ret에 저장
int cnt = pstmt.executeUpdate();
System.out.println("레코드 " + cnt + "개가 추가 되었습니다.");
} catch(Exception e) {
System.out.println("SQLException: " + e.getMessage());
} finally{
try{
if ( pstmt != null){ pstmt.close(); }
}catch(Exception e){}
try{
if ( con != null){ con.close(); }
}catch(Exception e){}
}
}
}
2. SELECT의 이용
>>>>> SelectPrepDB.java
package prep;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class SelectPrepDB {
public static void main(String args[]) {
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
String url = "jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr";
String jdbc = "org.gjt.mm.mysql.Driver";
String user = "javauser";
String pass = "1234";
try {
Class.forName(jdbc);
//커넥션 연결
con = DriverManager.getConnection(url,user, pass);
String sql = " SELECT no, language, db, os ";
sql = sql + " FROM predb ORDER BY no DESC";
// sql = sql + " FROM predb WHERE no = ?";
//쿼리 지정
pstmt = con.prepareStatement(sql);
//(물음표의 순번, 적용할 값)
//문자열 지정 pstmt.setString(....)
//첫번째 ?표에 값 1을 지정
//pstmt.setInt(1, 1);
rs = pstmt.executeQuery();
// 하나의 레코드 출력
// if (rs.next() == true){
// 여러개의 레코드 출력
while(rs.next()){
System.out.println("번호: " + rs.getInt("no"));
System.out.println("언어: " + rs.getString("language"));
System.out.println("DB : " + rs.getString("db"));
System.out.println("OS : " + rs.getString("os"));
System.out.println("-------------------------------------");
}
} catch(Exception e) {
System.out.println("SQLException: " + e.getMessage());
} finally{
try{
if ( rs != null){ rs.close(); }
}catch(Exception e){}
try{
if ( pstmt != null){ pstmt.close(); }
}catch(Exception e){}
try{
if ( con != null){ con.close(); }
}catch(Exception e){}
}
}
}
3. UPDATE의 이용
>>>>> UpdatePrepDB.java
package prep;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class UpdatePrepDB {
public static void main(String args[]) {
Connection con=null;
PreparedStatement pstmt=null;
//ResultSet rs=null;
String url = "jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr";
String jdbc = "org.gjt.mm.mysql.Driver";
String user = "javauser";
String pass = "1234";
try {
Class.forName(jdbc);
con = DriverManager.getConnection(url, user, pass);
String sql = " UPDATE predb SET language=?, db=?, os=? ";
sql = sql + " WHERE no=?";
//쿼리 지정
pstmt = con.prepareStatement(sql);
//(물음표의 순번, 적용할 값)
pstmt.setString(1, "java");
pstmt.setString(2, "oracle");
pstmt.setString(3, "모든 운영체제");
pstmt.setInt(4, 1);
// 레코드 추가후 1을 ret에 저장
int cnt = pstmt.executeUpdate();
System.out.println("레코드 " + cnt + "개가 수정 되었습니다.");
} catch(Exception e) {
System.out.println("SQLException: " + e.getMessage());
} finally{
try{
if ( pstmt != null){ pstmt.close(); }
}catch(Exception e){}
try{
if ( con != null){ con.close(); }
}catch(Exception e){}
}
}
}
4. Delete
>>>>> DeletePrepDB.java
package prep;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
//import java.sql.ResultSet;
import java.sql.SQLException;
public class DeletePrepDB {
public static void main(String args[]) {
Connection con = null;
PreparedStatement pstmt = null;
//ResultSet rs=null;
String url = "jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr";
String jdbc = "org.gjt.mm.mysql.Driver";
String user = "javauser";
String pass = "1234";
try {
Class.forName(jdbc);
//커넥션 연결
con = DriverManager.getConnection(url, user, pass);
String sql = " DELETE FROM predb";
sql = sql + " WHERE no = ?";
//쿼리 지정
pstmt = con.prepareStatement(sql);
//(물음표의 순번, 적용할 값)
pstmt.setInt(1, 4);
int cnt = pstmt.executeUpdate();
System.out.println("레코드 " + cnt + "개가 삭제 되었습니다.");
} catch(Exception e) {
System.out.println("SQLException: " + e.getMessage());
} finally{
try{
if ( pstmt != null){ pstmt.close(); }
}catch(Exception e){}
try{
if ( con != null){ con.close(); }
}catch(Exception e){}
}
}
}
5. JDBC 접속 및 해제 Utility Class의 제작
>>>>> DBConnect.java
package prep;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DBConnect {
public static Connection getConnection() {
Connection con = null;
String url = "jdbc:mysql://localhost:3306/javadb?useUnicode=true&characterEncoding=euckr";
String jdbc = "org.gjt.mm.mysql.Driver";
String user = "javauser";
String pass = "1234";
try {
Class.forName(jdbc);
//커넥션 연결
con = DriverManager.getConnection(url, user, pass);
} catch(Exception e) {
System.out.println("SQLException: " + e.getMessage());
} finally{
}
return con;
}
public static void close(Connection con, PreparedStatement pstmt){
try{
if ( pstmt != null){ pstmt.close(); }
}catch(Exception e){}
try{
if ( con != null){ con.close(); }
}catch(Exception e){}
}
public static void close(Connection con, PreparedStatement pstmt, ResultSet rs){
try{
if ( rs != null){ rs.close(); }
}catch(Exception e){}
try{
if ( pstmt != null){ pstmt.close(); }
}catch(Exception e){}
try{
if ( con != null){ con.close(); }
}catch(Exception e){}
}
}
>>>>> InsertPrepDB2.java
package prep;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
//import java.sql.ResultSet;
import java.sql.SQLException;
public class InsertPrepDB2 {
public static void main(String args[]) {
Connection con=null;
PreparedStatement pstmt=null;
//ResultSet rs=null;
try {
//커넥션 연결
con = DBConnect.getConnection();
String sql = " INSERT INTO predb(language, db, os) ";
sql = sql + " VALUES(?, ?, ?)";
//쿼리 지정
pstmt = con.prepareStatement(sql);
//(물음표의 순번, 적용할 값)
pstmt.setString(1, "iBATIS");
pstmt.setString(2, "oracle");
pstmt.setString(3, "모든 운영체제");
// 레코드 추가후 1을 ret에 저장
int cnt = pstmt.executeUpdate();
System.out.println("레코드 " + cnt + "개가 추가 되었습니다.");
} catch(Exception e) {
System.out.println("SQLException: " + e.getMessage());
} finally{
DBConnect.close(con, pstmt);
}
}
}