프로그래밍/TIL(국비과정)

TIL #29 - 데이터베이스 Update

양아무개 2020. 5. 13. 15:43

 

레코드 수정이다. 

수정 역시 드라이버 로딩 후 접속, 그런 후 update(수정) 해준다. 

아래의 코드에서는 수정할 이름을 입력받으면 나이와 키를 1씩 증가 시킨다. 

수정 sql 문장을 조금 헤메었다. 

 

UpdateTest.java

package com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class UpdateTest {
	private String driver = "oracle.jdbc.driver.OracleDriver";
	private String url = "jdbc:oracle:thin:@localhost:1521:xe";
	private String username = "c##java";
	private String password = "bit";

	private Connection conn;
	private PreparedStatement pstmt;

 필드값은 insert와 동일하다. 

또 생성자에 드라이버를 로딩해주고 db에 접속해주는 것 역시 insert와 동일하다. 

	// 1. 설치 (설치는 생성자에)
	public UpdateTest() {
		try {
			Class.forName(driver);
			// System.out.println("드라이버 로딩 성공 ");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}

	// 2. 접속
	public void getConnection() {
		try {
			conn = DriverManager.getConnection(url, username, password);
			// System.out.println("접속 성공");
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					conn.close();
				// 끊어줄 땐 반대로 끊어주기
			} catch (SQLException e) {

				e.printStackTrace();
			}
		}

	}

접속 후 접속이 필요 없어지면 꺼지도록 꼭 close 해준다. 

 

이제 레코드를 수정할 updateArticle() 이다. 

먼저 수정할 레코드를 이름으로 찾는다. 

public void updateArticle() {
		Scanner scan = new Scanner(System.in);
		System.out.print("수정할 이름을 입력하세요 :");
		String name = scan.next();

  이름을 입력받으면 db에 접속을 하고 사용할 sql 문을 넣어준다. 

getConnection();
String sql = "update dbtest set age = age+1, height = height+1 where name like ?";

이름으로 찾기 때문에 where name like ? 이다. 

물음표는 % 와 같이 먹히지 않기 때문에 단독으로 물음표만 써준다. (이 부분을 몰라서 헤맸다. )

또, 나이와 키를 1씩 더해주는 것도 위의 sql 문에 적어준다. 

 

위의 sql문을 자바도 알아 들을 수 있게 가이드 역할을 해주는 prepareStatement 를 준다. 

pstmt = conn.prepareStatement(sql); 

그런 후 데이터를 주입한다. 

pstmt.setString(1, "%" + name + "%");

물음표가 하나 있기 때문에 인덱스는 1이 되고, 검색한 이름(name)이 포함된 단어를 찾아야하기 때문에 앞 뒤로 %를 적어준다.  단, %를 적어줄 때는 큰따옴표를 표기한다. 

위의 과정은 데이터를 update 해주기 때문에 (갱신 해주기) executeUpdate를 해준다. 

executeUpdate를 해주지 않으면 위의 sql 문은 실행되지 않으므로 잊지 말고 꼭 적어준다. 

그리고 그것을 su 변수에 넣어 행이 수정되었다는 메시지를 띄워준다. 

int su = pstmt.executeUpdate(); 
System.out.println(su + "개의 행 수정 성공했습니다");

 

위의 과정은 전부 예외처리가 필요하므로 try로 묶어준다. 

	pstmt = conn.prepareStatement(sql); 
			// 데이터 주입
			pstmt.setString(1, "%" + name + "%");

			int su = pstmt.executeUpdate(); 
			System.out.println(su + "개의 행 수정 성공했습니다");

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
			
				if (pstmt != null)
					pstmt.close();
				if (conn != null)
					pstmt.close();
			} catch (SQLException e) {

				e.printStackTrace();
			}

		}
	}

pstmtconn 역시도 사용이 끝났다면 실행 순서와 반대로 꼭 close 해준다. 

close 해주지 않으면 나중에 오라클이 뻗을 수 있다고 한다. 

필요한 예외처리도 추가적으로 해준다.

 

public static void main(String[] args) {
		new UpdateTest().updateArticle();

	}

}