728x90
- JDBC순서
- 드라이버 클래스 로딩
- driver클래스로 connection요청(url, user, pw)
- conn으로부터 stmt생성
- sql수행 (Query = select, Update = 그외)
- 결과 처리
- 자원 정리
package test;
import java.sql.*;
import util.JDBCUtil;
public class Test01 {
public static void main(String[] args) {
//oracle
String driver = "oracle.jdbc.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String user = "scott";
String pw = "TIGER";
String sql = "select * from dept";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1. 드라이버 클래스 로딩
Class.forName(driver);
//2. driver클래스로 connection요청(url, user, pw)
conn = DriverManager.getConnection(url, user, pw);
//3. conn으로부터 stmt생성
stmt = conn.createStatement();
//4. sql수행 (Query = select, Update = 그외)
rs = stmt.executeQuery(sql);
//5. 결과 처리
while(rs.next()) {
System.out.print(rs.getString("deptno") + "\t");
System.out.print(rs.getString("dname") + "\t");
System.out.println(rs.getString("loc"));
}
}catch(Exception e) {
System.out.println(e.getMessage());
}finally {
//6. 자원 정리
try {
if(conn != null) conn.close();
if(stmt != null) stmt.close();
if(rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
System.out.println("JDBC App END ... ");
}
}
본 코드는 JDBCUtil사용없이 db에 연결을 해준 코드이다.
그러나 이러한 코드는 효율성이 떨어지고 statement에도 위험이 존재한다.
우선, 1,2,6에 해당하는 코드를 JDBCUtil 클래스를 이용해 메소드로 만들어준다.
getConnection과 close에 1,2와 6의 코드를 넣어준다.
따라서 같은 코드를 중복해 쓰지 않고 JDBCUtil 클래스를 활용하면 된다.
-> 코드가 더 간결해짐
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtil {
public static Connection getConnection() {
String driver = "oracle.jdbc.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String user = "scott";
String pw = "TIGER";
Connection conn = null;
try {
//1. 드라이버 클래스 로딩
Class.forName(driver);
//2. driver클래스로 connection요청(url, user, pw)
conn = DriverManager.getConnection(url, user, pw);
} catch (ClassNotFoundException e) {
System.out.println("jdbc driver 확인");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println(e);
}
return conn;
}
public static void close(Connection conn, Statement stmt, ResultSet rs) {
//6. 자원 정리(반납)
try {
if(conn != null) conn.close();
if(stmt != null) stmt.close();
if(rs != null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
또한,
sql쿼리가 "select avg(salary) \"평균 급여\" from employees where department_id = " + DEPARTMENT_ID; 의 형태로 나타나는 Statement는 해킹위험이 있다.
따라서 PreparedStatement를 사용하여 쿼리의 where절이 ?로 나타나게 한다.
private static void show(int DEPARTMENT_ID) {
String sql = "select avg(salary) \"평균 급여\" from employees where department_id = ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, DEPARTMENT_ID);
rs = pstmt.executeQuery();
while(rs.next()) {
System.out.print(rs.getString("평균 급여") + "\t");
}
}catch(Exception e) {
System.out.println(e.getMessage());
}finally {
JDBCUtil.close(conn, pstmt, rs);
}
}
이런식으로 변경해준다.
statement의 경우
rs = stmt.executeQuery(sql);
로 바로 sql문을 넣지만
PreparedStatement는 이러한 형태로 코드를 짜준다.
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, DEPARTMENT_ID);
rs = pstmt.executeQuery();
'programming > java' 카테고리의 다른 글
StringBuilder 메소드 (append/deleteCharAt/lastIndexOf/insert/setCharAt) (0) | 2021.06.29 |
---|---|
[java] 비트쉬프트연산자로 부분집합 출력, 갯수세기 (0) | 2021.01.19 |
[java] 자료구조 스택 코드 구현 (0) | 2021.01.05 |
[java] 선택정렬 (0) | 2021.01.01 |
[java] Cipher암호화하여 문자열 출력하기 (0) | 2021.01.01 |
댓글