Java

preparedStatement,executeUpdate,finally

화이팅하자9 2023. 10. 1. 14:48

PreparedStatement :

1.  Statement와 동일한데 차이점은 인자값으로 SQL을 받기 때문에 특정한 SQL에 대한 통로라고 생각하면 된다. 

 

장점:  

     1.따옴표와 자료형을 신경쓰지 않아도 된다.

     2.사용자가 입력한(sql 구문) 데이터가 변경될 염려가 없다. 

     3.커넥션에서 생성하면서 SQL문이 DB에 전송되어진다.



단점: 

     1.오류발생시 변수에 입력되는 값을 알 수 없어서 디버깅이 어렵다.

      2.한번만 파싱하고 값을 바꾼다. <-- 파싱이란 : 데이터를 분해 분석하여 원하는 형태로 조립하고 다시 빼내는 프로그램

 

 

1번째

finally는 전역변수에 설정을 해줘야 하고  그리고 try안에있는 Connection , PreparedStatement 지워줘야 하므로

위에 null값으로 지정해주기

Connection conn=null;
PreparedStatement psmt=null; <--try위에 넣어주기

Class.forName("oracle.jdbc.driver.OracleDriver");

 

2번째 DB연결

sql 실행 excuteUpdate <- insert,update,delete => int를 return함

String user = "service";
String password = "12345";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
			
//try안에 있는 지역변수
conn = DriverManager.getConnection(url,user,password); <--finally를 썼기 때문에 Connection및 전역변수에 null값이 있는것

                              
                              혹은

Connection conn = DriverManager.getConnection(url,user,password); <-- finally 썼으면 위에 처럼 Connection 제외됨

String sql = "insert into member values(?,?,?,?)"; 
			
			PreparedStatement psmt =conn.prepareStatement(sql);
			
			String id = sc.next();
			String pw =  sc.next();
			String name = sc.next();
			int age = sc.nextInt();
						
			psmt.setString(1, id);
			psmt.setString(2, pw);
			psmt.setString(3, name);
			psmt.setInt(4, age);

 

3번째 연결확인

if(conn != null) {
	System.out.println("연결성공");
}else {
	System.out.println("연결실패");
}

 

4번째 insert 

 

executeUpdate 메서드는 데이터베이스에서 데이터를 추가(Insert), 삭제(Delete), 수정(Update)하는 SQL 문을 실행합니다. 메서드의 반환 값은 해당 SQL 문 실행에 영향을 받는 행 수를 반환합니다.

만약 update를 하려면 "update member set pw = '설정할값' where id = '설정할값' ";를 sql에 넣어준다.
그리고 update를 하고싶으면 insert를 설정 해준다음에 update를 쓸수있게된다.

만약 delete를 하고 싶으면 String sql = "delete from member where id = '자신이 insert에 만든값'"; 

update 나 delete는 이 문장에 넣는게 아닌 insert를 완전히 다 만들어 준후  따로 만들어줘야함


String sql = "insert into member values('smhrd','1234','park',20)"; //string은 쌍따옴표임

psmt = conn.prepareStatement(sql); // 통로를 여는 기능 이름 -> prepareStatement(sql문)
			
int row = psmt.executeUpdate();
			
if(row > 0) {
	System.out.println("insert success");
}else {
	System.out.println("insert fail");
}

executeUpdate

 

1. insert,delete,update

2. 실행된 문장의 수를 리턴해준다.

3. sql 실행하는 메소드 구현

 

 

5번째 에러확인

} catch (ClassNotFoundException e) {
	e.printStackTrace(); 	
} catch (SQLException e) {
	e.printStackTrace();

 

6번째 finally

}finally {//try, catch 최종적으로 실행되는 문장
			//conn.close(); <- conn이 try 안에있는 지역변수라서 에러임
			
			try {
				if(conn!=null)conn.close();
				if(psmt!=null)psmt.close();
				
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

finally 를 사용해서 연결을 끊어줘야 하는 이유

 

JDBC를 사용하여 데이터베이스와 연동하는 과정에서 App 과 DB를 연결해서 사용하게 되는데 정상적으로 DB 서버에 연결하여 사용하고 있었다면 마지막에는 DB서버와의 연결을 끊어주어야 한다..

 

그런데 여기서 정상적인 처리후에 연결 해제만 코딩 해놓게 된다면 비정상적인 처리(예외) 상황에서는

DB 연결이 해제 되지 않는 상황이 발생하게 되어 문제가 발생할 수 있게 된다.

 

그렇기 때문에 finally 를 통해서 try 경우든 catch 경우에든 DB 연결 해제 처리(close)를 하게 되어

DB에 영향을 주지 않도록 설정하는 것이다. <-- 그리고 변수앞인 Connection 과 PrepareStatement를 지워주며

전역변수에 Connection =null 및 PrepareStatement=null를 넣어서 에러가 안뜨게 만들어준다.