DB - 오라클과 이클립스(자바) 정보수정(Update) (2022-08-06)

2022. 8. 6. 22:303층 1구역 - 개발의 장/Oracle DataBase

1. 지난 번에 뭘 했음?(서론)

 

지난 게시물에서 데이터베이스에 저장되어 있는 어떠한 정보입력으로 관련 정보를 모두 열람하는 ConnectionTest

 

while문을 사용하여 데이터베이스에 모든 정보를 열람할 수 있는 SelectAll

 

데이터베이스에 정보를 추가하고자 할 때 cmd인 명령 프롬프트 즉 데이터베이스에 직접 관여하는 게 아니라

이클립스를 통해 데이터를 삽입할 수 있는 Insert 코드에 대해 알아 보았다.

 

오늘은 정보수정에 관해서 알아보고자 한다.

 

이제 정보수정정보삭제를 구현하게 되면 이클립스의 명령어들이 메모리(단기 기억력)에 올라갈 때만 저장되던 자료들이 데이터베이스에 올려지며 심심할 (?) 때마다 그 데이터를 볼 수 있다. (내가 컴퓨터를 지배할 수 있다.!!!)

 

 

하기 전에...

필자가 여태까지 했던 회원 정보 관리 프로그램 만드는 퀴즈를 돌아보도록 하자.

 

왜 여태까지 안하던 짓거리를 하냐고 그럴 수도 있는데...

필자가 회원정보 프로그램 코드를 짜면서 업데이트 부분을 자세하게 보면...

(안 봤다고? 어쩌라고....)

 

특정한 정보 하나를 입력하여 그 입력값이 존재한다면 그 입력값을 포함하거나 또는 그 값을 제외한 값을 수정하였고,

존재하지 않는다면 '입력값이 없으니 나가!!' 라는 출력어를 표현했었다.

 

데이터베이스에서 이런 비슷한 역할 하는 명령어가 있는데....

 

SELECT count(*) FROM 테이블 이름 WHERE 검색 카테고리='검색하고자 하는 데이터';

 

정보값이 있다면 1을,
정보값이 없다면 0을 표현

 

이것을 사용하여 정보값을 수정할 수 있을 것이라 예상한다.

 

 

그럼 소스코드를 알아보도록 하자.

 

2.코드(Insert.java)

 

package jdbc_concept1;

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

public class Update {
	public static void main(String[] args) {
		try {
			Class.forName("oracle.jdbc.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user = "oracle";
		String password=  "oracle";
		String sql = "SELECT count(id) FROM test WHERE id=?";
		//↑↑↑↑↑↑ 공통으로 들어가는 부분.
		Scanner sc = new Scanner(System.in);
		//아이디를 입력하여
		System.out.print("아이디 : "); String id = sc.next();
		
		try {
			//드라이버에서 oracle url에 접속후, user와 password를 입력해 연결.
			con = DriverManager.getConnection(url, user, password);
			//prepaerStatement에서 sql로 연결하여
			ps = con.prepareStatement(sql);
			//1번에 id의 입력값을 세팅
			ps.setString(1, id);
			//ps의 쿼리문을 실행
			rs = ps.executeQuery();
			//만약 ResultSet이 입력한 값이라면(== ps.setString(1, id);)
			if(rs.next()) {
				//rs.getInt(1) == ps.setString(1, id);
				//즉, rs.getInt(1)이 0이나 1이 나올것이므로
				// row에 그 값을 대입해서...
				int row = rs.getInt(1);
				//만약 row가 1이면
				if(row == 1) {
					//해당 입력을 실행한다.
					System.out.print("비밀번호 : "); String pass = sc.next();
					System.out.print("이름 : "); String name = sc.next();
					//sql 서버에서는 그 아이디에 대한 password와 name을 갱신보고
					//아이디 확인했고, 사용자가 입력한 값으로 바꾸도록 허용.
					sql = "UPDATE test SET password=?, name=? WHERE id=?";
					//sql의 갱신보고를 ps가 받아들이며...
					ps = con.prepareStatement(sql);
					//sql문에서 명시된 내용대로
					//1번엔 사용자가 원하는 password를
					ps.setString(1, pass);
					//2번엔 사용자가 원하는 name을
					ps.setString(2, name);
					//3번에 사용가가 입력한 아이디와 DB에 기록되 있는
					//id가 일치하기 때문에
					ps.setString(3, id);
					//정보를 넣는 것을 실행한다.
					ps.executeUpdate();
				}else {
					//그게 아니면 다음 내용을 출력
					System.out.println(id + "는/은 등록된 정보가 아닙니다.");
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		//이후 모든 과정이 끝나면 데이터베이스 종료 실행.
		try {
			if(rs != null) 
				rs.close();
			if(ps != null) 
				ps.close();
			if(con != null)
				con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

 

이전 게시물부터 수정해야될 사항이 있는데...

 

sql = "UPDATE test SET password=?, name=? WHERE id=?";

 

sql에 위와 같이 SET을 하겠다고 선언 한다면

 

ps.setString(1, pass);
ps.setString(2, name);
ps.setString(3, id);

sql의 선언한 것과 동일하게 순번을 매겨줘야 한다.

 

 

 

틀린 내용이 있다면 피드백 부탁드립니다! 오늘도 감사드립니다!!!!