학원/JDBC

10/24 27-6 (inserSQL.prepared)

도원결의 2022. 10. 24. 19:09

이제 preparedStatement 계열을 정리할 거

근데 왜 이걸 쓰남?

쿼리문을 statement객체 생성 할 때 미리 넣어줘서 더 빠름!!!

그리고 변수 넣을 때 '' 신경 쓸 필요가 없고,  에러 발생이 적어 좋다 !

 

[객체 생성 시]

 PreparedStatement객체는 객체 생성 시 미리 쿼리문을 준비해서 Connection객체의 prepareStatement(쿼리문)메소드의 인자로 전달해야 한다.    
 PreparedStatement객체 생성 시 전달된 쿼리문을 먼저 parsing하기 때문에 실행 시에는 바로 실행한다. 따라서 실행 시에는 쿼리문을 전달할 필요가 없다보니 속도가 빠르다는 장점 !!!

 

[쿼리 실행 시 쿼리문 전달 불필요]
1. 인파라미터가 없는 쿼리문
     -인파라미터 설정 불필요.바로 실행하면 됨.
2.인파라미터가 있는 쿼리문 (인파라미터는 ? 요걸로 쓴다!)

     -실행전 반드시 값을 설정
***쿼리 실행 전에 값에 해당하는 부분을 ? 처리한 경우 값을 설정해줘야 함.
***?(인파라미터)는 쿼리문의 값에 해당하는 부분에만 넣어줘야 한다.


***인파라미터를 설정 할 때는 PreparedStatement객체의 setXXXX(파라미터인덱스,설정할 값)메소드로 설정한다
ex)
Oracle의 자료형이 NUMBER 면  setInt(),
                              char/varchar2 면 setString()
자료형에 상관없이 setString( )설정가능
즉, ResultSet객체로 값을 읽어오는 getXXXX()메소드와 사용법이 동일하다.

public class InsertSQL extends IConnectImpl{
	
    public InsertSQL(String url, String user, String password){
		connect(url, user, password);		
	}/////////////인자생성자
    
    public void execute() throws Exception {
    	String sql ="INSERT INTO member VALUES(?,?,?,?)";
        try{
            psmt = conn.prepareStatement(sql) // 여기서 미리 인자를 넣어 줌
            while(true){
                    try{
                            psmt.setString(1,getValue("아이디"));
                            psmt.setString(2,getValue("비밀번호"));
                            psmt.setString(3,getValue("이름"));
                               //날짜 설정  날짜를 java.sql.Date타입으로 설정시]
                          //Date regidate = new Date(new java.util.Date().getTime());
                          //psmt.setDate(4,regidate);
                               //날짜를 문자열로 설정
                            Pattern pattern = Pattern.compile("[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}");
                            String regidate = null;
                                while(true) {/// 날짜만 반복하네
                                      regidate = getValue("가입일");
                                      Matcher matcher = pattern.matcher(regidate);
                                      if(!matcher.matches()) {
                                      System.out.println("날짜 형식의 문자열이 아닙니다.");
                                         continue;
                                         }
                                          break;
                                        }
                            psmt.setString(4,regidate);
                            System.out.println(psmt.executeUpdate()+"행이 입력 되었습니다."); // 요기서 인자 안 넣어 줌 신기!     			
                     }
                     catch(SQLException e) {
                        System.out.println("입력시 오류:"+e.getMessage());
                      }
                   } //////while
           }
        chtch(SQLException e){
        	System.out.println("preeparedStatement 객체 생성 실패:"+e.getMessage());
        }
        finally{
        	close();
        }
    }


public static void main(String[] args) {		
		try {
			new InsertSQLMore(ORACLE_URL,"KOSMO","KOSMO").execute();  //로그인정보 생성자에 않넣고 여기다 넣어도 가능
		   } 
		 catch (Exception e) {
			System.out.println("오류발생:"+e.getMessage());				
		    }				
		
	}////main
}