Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발 일기

Statement 말고 PreparedStatement란??? (feat. 활용해보기) 본문

JAVA 공부

Statement 말고 PreparedStatement란??? (feat. 활용해보기)

개발 일기 2021. 7. 25. 22:34

안녕하세요.

 

오늘은 JDBC Flow의 단계 중 SQL 전송 객체인 Statement 객체를 생성할 때

Statement가 아닌 PreparedStatement를 활용하여 보다 간편하게 SQL문을 전송해보도록 하겠습니다.

 

 

PreparedStatement 활용 방법

 

1. sql문작성
    - ?(파라메타) 를 사용해서 나중에 외부에서 데이타(리터럴)를 받을수있게한다.
      ex> insert into emp(empno,ename,job,manager,hiredate,sal,comm,deptno) values(?,?,?,?,?,?,?,?)
    - 테이블이름,컬럼이름등은 ? 를 사용해서 외부에서 입력받을수없다.
      ex> select * from ? 

2. PreparedStatement 객체생성 후 인자로 sql문을 넣어서 생성한다
   ex> PreparedStatement pstmt = con.prepareStatement(sql);


3. 생성된 PreparedStatement 객체에 파라메타를 setting 한다.
    - sql 좌측 ? 부터 1,2,3...
 ex> pstmt.setInt(1,1234);
       pstmt.setString(2,"KIM");
       pstmt.setString(3,"MANAGER");
       pstmt.setInt(4,7839);
       pstmt.setDate(5,new Date());
       pstmt.setDouble(6,1000.12);
       pstmt.setInt(7,0);
       pstmt.setInt(8,10);


 4.  실행
    - 실행시 sql문을 인자로 넣지안는다.
    ex> pstmt.executeUpdate();
          pstmt.executeQuery();

 

 

PreparedStatement 코딩 연습

public class PreparedStatementMain {

	public static void main(String[] args) throws Exception {
		String driverClass = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@182.237.126.19:1521:xe";
		String user = "DB접속정보";
		String password = "DB접속정보";

		Class.forName(driverClass);
		Connection con = DriverManager.getConnection(url, user, password);

		String insertSql = "insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(?,?,?,?,sysdate,?,?,?)";

		PreparedStatement pstmt = con.prepareStatement(insertSql);
		pstmt.setInt(1, 7001);
		pstmt.setString(2, "ALICE");
		pstmt.setString(3, "CLERK");
		pstmt.setInt(4, 7369);
		pstmt.setDouble(5, 5000.34);
		pstmt.setInt(6, 400);
		pstmt.setInt(7, 30);

		pstmt.executeUpdate();

		String selectSql = "select * from emp where sal >= ? and sal<= ? and job = ?";
		PreparedStatement pstmt1 = con.prepareStatement(selectSql);
		pstmt.setInt(1, starSal);
		pstmt.setInt(2, endSal);
		pstmt.setString(3, job);

		ResultSet rs = pstmt1.executeQuery();
		while (rs.next()) {
			int empno = rs.getInt("empno");
			String ename = rs.getString("ename");
			String jobStr = rs.getString("job");
			double sal = rs.getDouble("sal");
			Date hireDate = rs.getDate("hiredate");
			String hireDateStr = new SimpleDateFormat("yyyy/MM/dd").format(hireDate);
		}

	}

}

 

ex)

Statement 객체 활용 시 SQL문에 파라메타(인자)를 포함 시

insertSql = "insert into address values(address_no_seq.nextval,'"+ id+"','"+ name +"','"+phone+"','"+address+"')"; 

 

PreparedStatement 활용 시

insertSql = "insert into address values(?,?,?,?,?)";

 

 

 

PreparedStatement 객체 사용 시 기존 Statement를 사용 할 때 SQL문을 인자로 받기 위해서는 번거로웠는데

?(파라메타)를 통해 SQL문 작성이 훨씬 활용이 쉬워졌습니다.

 

감사합니다.

 

Comments