Programming/JDBC

JDBC UPDATE ,DELETE 쿼리의 적용+ PreparedStatement 클래스.+ CRUD 서비스 만들기1. 2021-08-30

최동훈1 2021. 8. 30. 16:34

우선 지난 포스팅에는, INSERT 쿼리를 JDBC에서 실행하는 방법을 보였다. 이번엔 DBMS에 저장되있는 레코드를 변경하는 UPDATE 쿼리를 보이겠다.

우선 SQL로 현재 저장되있는 레코드를 수정하는 쿼리는 이렇다.

update notice set title='남구 옥동', content='어깨가 빨리 나았으면 좋겠다.'
where writer_id='모리';

이 쿼리를 자바 프로그램에서 DB에 넣을려면, 아래와 같은 쿼리를 쓰면 된다.

public class program {
static String url="jdbc:oracle:thin:@localhost:1521/xepdb1";
	public static void main(String[] args) 
			throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub
		
		String sql 
        ="update notice set title='남구 옥동', content='어깨가 빨리 나았으면 좋겠다.' where writer_id='모리'";
		
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = 
		DriverManager.getConnection(url,"newlec","vdongv1620");
		Statement st= con.createStatement();
		int count=st.executeUpdate(sql);
		System.out.println(count);
			
		st.close();
		con.close();

	}

}

그러나 이러면 코드의 재사용성과 유지보수성에서 문제가 있을수 있다. 예를 들면, 해당 칼럼을 다른 값으로 바꾸고 싶을 때는 문자열 코드를 통채로 고쳐야 되기 때문에 시각적으로 복잡하다.

이것 때문에 JDBC는 PreparedStatement 라는 클래스가 존재한다. 이 클래스는, 미리 SQL을 만들어놓고, 빈 자리에 문자열을 그대로 넣어주는 역할을 한다.

사용예시.

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class program {
static String url="jdbc:oracle:thin:@localhost:1521/xepdb1";
	public static void main(String[] args) 
			throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub
		
		String title ="남구 옥동";
		String content ="어깨가 빨리 나았으면 좋겠다.";
		String writer_id ="모리";
		
		
		String sql ="update notice set title=?, content=? where writer_id=?";
		//문자열을 넣어야 되는 곳에 물음표 처리.
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = 
		DriverManager.getConnection(url,"newlec","vdongv1620");
	
		PreparedStatement st= con.prepareStatement(sql);
		
		st.setString(1, title);
		st.setString(2, content);
		st.setString(3, writer_id);
		
         //물음표 처리한 순서대로 인덱스를 "1"부터 매김.
         
		int count=st.executeUpdate();
		//PreparedStatement를 사용했을 경우엔
        //일반 Statement를 사용했을떄와 달리 Sql을 executeUpdate의 인자로
        //넣어주지 않아도 됨. 넣어주면 오류남. 애초에 Prepared 뜻이
        //미리 쿼리를 사용할 준비를 해놓는다는 뜻임.
		System.out.println(count);
	
		
		
		
		st.close();
		con.close();

	}

}

이러니 코드가 훨씬 간결해졌다. 또한 중간에 문자열을 삽입하고 싶은 곳에 "?" 물음표를 넣고, 순서대로 PreparedStatement의 setString 메서드를 활용하여, 인덱스별로, 원하는 String을 넣어주면된다. 또 다른 변경사항이 있을때도, 위에 String만 바꾸어주면 되니, 코드의 재사용성과 가독성에도 좋다. 또한 PreparedStatement가 Statement 클래스를 상속받은 자손 클래스이기에 executeUpdate 메서드를 사용할수 있다. 그러나, sql 값을 넣어주지 않아야 한다.

 

변경전
변경후

또한 SELECT 문을 실행하는것이 아닌, UPDATE문을 실행하기에, executeQuery()가 아닌 executeUpdate()를 써야한다. (관련내용은 이전 포스팅 참고).

또 테이블을 삭제하는 DELETE 쿼리도 UPDATE와 작동과정이 똑같아서 별 설명을 안하겠다.

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class program4 {
static String url="jdbc:oracle:thin:@localhost:1521/xepdb1";
	public static void main(String[] args) 
			throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub
		
		
		String id ="모리";
		
		
		String sql ="DELETE notice where id=?";
		
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con = 
		DriverManager.getConnection(url,"newlec","vdongv1620");
	
		PreparedStatement st= con.prepareStatement(sql);
		
		st.setString(1, id);
		
		int count=st.executeUpdate();
		
		System.out.println(count);
	
		
		
		
		st.close();
		con.close();

	}

}

 

 

이제 CRUD 서비스의 틀을 만들어 보겠다. CRUD는 Create Retrieve Update Delete의 약자인데, 각각 SQL의 insert, select, update, delete 쿼리를 뜻한다.

맨 먼저 SELECT 기능을 만들어 보겠다. 새롭게 자바 프로젝트 NOTICE SERVICE를 생성하고, select 문을 통해, 서버로부터 받아온 notice 레코드를 반환하는 함수를 작성했다.

 

CRUD기능을 하는 하나의 서비스클래스를 만들었다.

여기서  서비스 클래스이름을 만들때, 패키지이름으로 해당 클래스이름이 중복되지 않도록 만든다. 이유는 클래스명의 확장자로 패키지 이름이 들어가기 때문이다.

서버에서 받아온 레코드를 담아두기위한 Notice 클래스를 만들었다.

또한 받아온 레코드들을 담는 그릇인 NOTICE 객체를 만들었다.

 

공부시간 3시간.

순공시간 1시간 30분.

 

오늘은 주말에 강릉할머니집 갔다가 혼행 하면서 푹 쉬어서 그런지 집중이 잘되는 느낌이였다. 또 CRUD 서비스 라고 말만 들어봤지 실체가 무엇인지 잘 몰랐는데, 직접 해당 서비스 클래스를 구상하고 구현하려보니 참 내 자신이 기특했다.

화이팅!! 다음 포스팅에는 오늘 만들었던 NOTICE 클래스와 Notice Service 클래스를 구현해 보겠다.