09009

[Java] JDBC (3) - 조회 / 입력 / 수정 / 삭제 본문

Back-End/JAVA
[Java] JDBC (3) - 조회 / 입력 / 수정 / 삭제
09009 2023. 3. 26.

조회 - SELECT

Oracle 데이터 조회

1) Oracle을 연동할 driver와 url을 앞에 작성한다.

package ch17;

import java.sql.*;

public class OraSelect1 {
	public static void main(String[] args){
		String driver = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
	}
}

2) DB 연결을 수행할 클래스 Connection, SQL을 실행할 객체를 생성하는 클래스 Statement, 조회한 데이터를 저장해주는 클래스 ResultSet 클래스를 선언한다.

package ch17;

import java.sql.*;

public class OraSelect1 {
	public static void main(String[] args){
		String driver = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		
		// 연결할 수 있는 클래스 불러오기
		Connection conn = null; // DB 연결
		Statement stmt = null; // sql 실행할 객체 생성하는 클래스
		ResultSet rs = null; // 조회한 데이터를 저장하는 클래스
		String sql = "select * from dept;" // 실행할 쿼리문 작성
				
	}
}

3) 최종 코드

try - catch문으로 예외처리문을 작성하고, select문과 같이 결과가 있는 쿼리문인 경우 Statement 클래스executeQuery() 메소드를 사용한다. 

 

입력

package ch17;

import java.sql.*;

public class OraSelect1 {
	public static void main(String[] args) throws SQLException {
		String driver = "oracle.jdbc.OracleDriver"; 
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
		
		// 연결할 수 있는 클래스 불러오기
		Connection conn = null; // DB 연결
		Statement stmt = null; // sql 실행할 객체 생성하는 클래스
		ResultSet rs = null; // 조회한 데이터를 저장하는 클래스
		String sql = "select * from dept"; // 실행할 쿼리문
		
		try {
			Class.forName(driver); // driver load
			conn = DriverManager.getConnection(url,"c##scott", "tiger"); // DB 연결
			stmt = conn.createStatement(); // 실행할 객체 생성
//			조회 : executeQuery, 입력/수정/삭제 : executeUpdate
			rs = stmt.executeQuery(sql); // sql을 실행하고 그 결과를 rs에 저장
			while(rs.next()) { // 포인터 다음에 있는 데이터를 읽어서 읽히면 true, 못 읽으면 false
				System.out.println("부서코드 : " + rs.getInt("deptno")); // 1
				System.out.println("부서명 : " + rs.getString("dname")); // 2  = "dname"
				System.out.println("근무지 : " + rs.getString("loc")); // 3
				System.out.println("=========================");
			}
		} catch(Exception e) { // 에러 처리
			System.out.println(e.getMessage());
		} finally { // DB연결 해제
			rs.close();
			stmt.close();
			conn.close();
		}
	}
}

결괏값으로 얻은 여러 개의 row를 모두 출력하려면 ResultSet 클래스로 행 단위로 이동하는 next() 메소드를 사용하여

위와 같이 while 문으로 작성한다.

 

💻 출력

부서코드 : 10
부서명 : ACCOUNTING
근무지 : NEW YORK
=========================
부서코드 : 20
부서명 : RESEARCH
근무지 : DALLAS
=========================
부서코드 : 30
부서명 : SALES
근무지 : CHICAGO
=========================
부서코드 : 40
부서명 : OPERATIONS
근무지 : BOSTON
=========================

데이터가 올바르게 조회되었는지 Oracle에서 직접 확인한다.

 

 

아래는 부서코드를 입력받아 부서코드, 부서명, 근무지를 출력하는 코드를 작성한 것이다.

 

✍ 입력

package ch17;
import java.sql.*;
import java.util.Scanner;

public class OraSelect2 {
	public static void main(String[] args) throws SQLException {
		String driver = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe"; 
		Connection conn = null; Statement stmt = null; ResultSet rs = null;
		
		Scanner sc = new Scanner(System.in);
		System.out.println("확인하고자 하는 부서코드를 입력하세요");
		int deptno = Integer.parseInt(sc.nextLine());
		String sql = "select * from dept where deptno = " + deptno;
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "c##scott", "tiger");
			stmt = conn.createStatement(); // url, id와 pw 정보를 가진 객체 생성
			rs = stmt.executeQuery(sql);
			if (rs.next()) { // 데이터가 부서코드 당 한건이기 때문에 while문을 작성하지 않아도 된다.
				System.out.println("부서코드 : " + rs.getInt("deptno")); // rs.getInt(1)도 가능
				System.out.println("부서명 : " + rs.getString("dname")); // rs.getString(2)도 가능
				System.out.println("근무지 : " + rs.getString("loc")); // rs.getString(3)도 가능
			} else System.out.println("존재하지 않는 부서입니다.");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			rs.close(); stmt.close(); conn.close();
		}
		sc.close();
	}
}

💻 출력

 

- 입력창에 10을 입력하였을 경우

확인하고자 하는 부서코드를 입력하세요
10
부서코드 : 10
부서명 : ACCOUNTING
근무지 : NEW YORK

- 입력창에 30을 입력하였을 경우

확인하고자 하는 부서코드를 입력하세요
30
부서코드 : 30
부서명 : SALES
근무지 : CHICAGO

- 입력창에 80을 입력하였을 경우 (원래 데이터에 존재하지 않는 부서코드)

확인하고자 하는 부서코드를 입력하세요
80
존재하지 않는 부서입니다.

 


MYSQL 데이터 조회

MYSQL의 경우 위에서 작성한 Oracle의 예시와  유사하다.

연동할 driver와 url 그리고 user의 id와 pw를 변경해주면 된다.

 

✍ 입력

package ch17;

import java.sql.*;

public class MySelect {
	public static void main(String[] args) throws SQLException {
		String driver = "com.mysql.cj.jdbc.Driver";
		String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
		
		// 연결할 수 있는 클래스 불러오기
		Connection conn = null; // DB 연결
		Statement stmt = null; // sql 실행할 객체 생성하는 클래스
		ResultSet rs = null; // 조회한 데이터를 저장하는 클래스
		String sql = "select ename, job, hiredate from emp"; // 실행할 쿼리문
		
		try {
			Class.forName(driver); // driver load
			conn = DriverManager.getConnection(url,"root", "mysql"); // DB 연결
			stmt = conn.createStatement(); // 실행할 객체 생성
//			조회 : executeQuery, 입력/수정/삭제 : executeUpdate
			rs = stmt.executeQuery(sql); // sql을 실행하고 그 결과를 rs에 저장
			while(rs.next()) { // 포인터 다음에 있는 데이터를 읽어서 읽히면 true, 못 읽으면 false
				System.out.println("이름 : " + rs.getString("ename")); 
				System.out.println("업무 : " + rs.getString("job")); 
				System.out.println("입사일 : " + rs.getDate("hiredate"));
				System.out.println("=========================");
			}
		} catch(Exception e) { // 에러 처리
			System.out.println(e.getMessage());
		} finally { // DB연결 해제
			rs.close();
			stmt.close();
			conn.close();
		}

	}

💻 출력

이름 : ALLEN
업무 : SALESMAN
입사일 : 1981-02-20
=========================
이름 : WARD
업무 : SALESMAN
입사일 : 1981-02-22
=========================
이름 : JONES
업무 : MANAGER
입사일 : 1981-04-02
=========================
이름 : MARTIN
업무 : SALESMAN
입사일 : 1981-09-28
=========================
이름 : BLAKE
업무 : MANAGER
입사일 : 1981-05-01
=========================
이름 : CLARK
업무 : MANAGER
입사일 : 1981-06-09
=========================
이름 : SCOTT
업무 : ANALYST
입사일 : 1982-12-09
=========================
이름 : KING
업무 : PRESIDENT
입사일 : 1981-11-17
=========================
이름 : TURNER
업무 : SALESMAN
입사일 : 1981-09-08
=========================
이름 : ADAMS
업무 : CLERK
입사일 : 1983-01-12
=========================
이름 : JAMES
업무 : CLERK
입사일 : 1981-12-03
=========================
이름 : FORD
업무 : ANALYST
입사일 : 1981-12-03
=========================
이름 : MILLER
업무 : CLERK
입사일 : 1982-01-23
=========================

데이터가 올바르게 조회되었는지 MYSQL에서 직접 확인하였다.

참고로 MYSQL에서 쿼리문을 실행하기 위해서는 사용할 DB명(아래 스크린샷의 경우 test)을 미리 선언해주어야 한다.

이번에는 Java에서 출력되는 형식을 MYSQL에서 출력되는 형식과 같이 유사하게 수행하였다.

 

✍ 입력

package ch17;

import java.sql.*;
public class MySelect1 {
	public static void main(String[] args) throws SQLException {
		String driver = "com.mysql.cj.jdbc.Driver";
		String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";

		Connection conn = null; 
		Statement stmt = null; 
		ResultSet rs = null; 
		String sql = "select ename, job, hiredate from emp";
		
		System.out.println("이름\t업무\t입사일");
		System.out.println("=========================");
		
		try {
			Class.forName(driver); // driver load
			conn = DriverManager.getConnection(url,"root", "mysql"); // DB 연결
			stmt = conn.createStatement(); // 실행할 객체 생성
			rs = stmt.executeQuery(sql); 
			while(rs.next()) { 
				System.out.print(rs.getString("ename") + "\t"); // 이름
				System.out.print(rs.getString("job") + "\t"); 
				System.out.println(rs.getDate("hiredate") + "\t");
			}
		} catch(Exception e) { 
			System.out.println(e.getMessage());
		} finally { // DB연결 해제
			rs.close();
			stmt.close();
			conn.close();
		}
	}
}

💻 출력

위에서 보이는 것과 같이 보기좋게 출력이 되지 않아 코드를 약간 수정하였다.

job 문자열의 길이에 따라 입사일 출력 형식이 달라지므로 job에 대한 조건을 수정하였다.

	while(rs.next()) { 
		System.out.print(rs.getString("ename") + "\t"); // 이름
		if(rs.getString("job").length() > 7) 
			System.out.print(rs.getString("job") + "\t");
		else System.out.print(rs.getString("job") + "\t\t"); 
		System.out.println(rs.getDate("hiredate") + "\t");
		}

그리고 job에 대하여 작성해야할 칸이 늘어나게 되므로 처음에 출력할 문장에서도 칸을 늘려주었다.

	System.out.println("이름\t업무\t\t입사일");
	System.out.println("==================================");

✍ 입력

package ch17;

import java.sql.*;
public class MySelect1 {
	public static void main(String[] args) throws SQLException {
		String driver = "com.mysql.cj.jdbc.Driver";
		String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";

		Connection conn = null; 
		Statement stmt = null; 
		ResultSet rs = null; 
		String sql = "select ename, job, hiredate from emp";
		
		System.out.println("이름\t업무\t\t입사일");
		System.out.println("==================================");
		
		try {
			Class.forName(driver); // driver load
			conn = DriverManager.getConnection(url,"root", "mysql"); // DB 연결
			stmt = conn.createStatement(); // 실행할 객체 생성
			rs = stmt.executeQuery(sql); 
			while(rs.next()) { 
				System.out.print(rs.getString("ename") + "\t"); // 이름
				if(rs.getString("job").length() > 7) 
					System.out.print(rs.getString("job") + "\t");
				else System.out.print(rs.getString("job") + "\t\t"); 
				System.out.println(rs.getDate("hiredate") + "\t");
			}
		} catch(Exception e) { 
			System.out.println(e.getMessage());
		} finally { // DB연결 해제
			rs.close();
			stmt.close();
			conn.close();
		}
	}
}

💻 출력

위와 같이 코드를 작성하면 MYSQL에서 보이는 형식과 유사하게 출력할 수 있다.

아래는 사번을 입력받아 이름, 입사일, 부서명을 출력하는 코드를 작성한 것이다.

 

✍ 입력

package ch17;

import java.sql.*;
import java.util.Scanner;

// 사번을 받아서 이름, 입사일, 부서명
public class MySelect2 {
	public static void main(String[] args) throws SQLException {
		String driver = "com.mysql.cj.jdbc.Driver";
		String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
		Connection conn = null; Statement stmt = null; ResultSet rs = null;
		
		System.out.println("확인하고자 하는 사번을 입력하세요.");
		Scanner sc = new Scanner(System.in);
		int empno = Integer.parseInt(sc.nextLine());
		String sql = "select ename, hiredate, dname from emp e, dept d where e.deptno = d.deptno and empno = " + empno;
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url,"root","mysql");
			stmt = conn.createStatement(); // stmt에는 url, 아이디, 패스워드를 가진 객체
			rs = stmt.executeQuery(sql);
			if (rs.next()) {
				System.out.println("이름 : " + rs.getString("ename"));
				System.out.println("입사일 : " + rs.getDate("hiredate"));
				System.out.println("부서명 : " + rs.getString("dname"));
			} else System.out.println("존재하지 않는 사원입니다.");			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			conn.close(); stmt.close(); rs.close();
		}
		sc.close();
	}
}

💻 출력

 

- 입력창에 7499를 입력하였을 경우

확인하고자 하는 사번을 입력하세요.
7499
이름 : ALLEN
입사일 : 1981-02-20
부서명 : 영업팀

- 입력창에 7900을 입력하였을 경우

확인하고자 하는 사번을 입력하세요.
7900
이름 : JAMES
입사일 : 1981-12-03
부서명 : 영업팀

MYSQL에서 데이터를 확인한 결과 올바르게 출력되었다는 것을 확인할 수 있다.


입력 - INSERT

Oracle 데이터 입력

입력/수정/삭제의 경우 데이터를 조회할 때와 다른 점은 ResultSet 클래스를 사용하지 않는다는 점이다.

ResultSet 클래스조회된 결과를 저장할 때 사용하는데 데이터 입력 시에는 조회된 결과를 저장할 필요가 없으므로 사용하지 않아도 된다.

 

그리고 조회 시에는 executeQuery() 메서드를 사용하였지만, 입력/수정/삭제 시에는 데이터를 변경하는 작업이므로

executeUpdate() 메서드를 사용한다.

 

입력/수정/삭제의 경우에는 result라는 정수형을 반환하는 변수를 선언하여 반환하는 값이 추가되면 입력/수정/삭제가 성공하였다고 출력하고 반환하는 값이 추가되지 않고 0으로 반환되면 입력/수정/삭제에 실패하였다는 문구를 출력한다.

 

 

- Oracle에 저장된 dept 테이블의 raw data

Java를 이용하여 Oracle과 MYSQL에 데이터를 추가하고 싶을 때  아래와 같이 소스코드를 작성한다.

 

✍ 입력

sql 구문을 편리하게 작성하기 위하여 Statement 클래스 Stringformat 메서드를 사용하였다.

package ch17;

import java.sql.*;
import java.util.Scanner;
public class OraInsert {
	public static void main(String[] args) throws SQLException {
		String driver = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe"; 
		// resultset 클래스는 조회된 결과를 저장할 때 사용하므로 입력을 위한 코드에서는 선언하지 않아도 된다.
		Connection conn = null; Statement stmt = null; 
		
		Scanner sc = new Scanner(System.in);
		System.out.println("부서코드를 입력하세요");
		// 문자와 숫자를 반복해서 입력할 경우는 문자로 읽어서 숫자로 형변환하여야 한다
		int deptno = Integer.parseInt(sc.nextLine());
		
		System.out.println("부서명을 입력하세요");
		String dname = sc.nextLine();
		
		System.out.println("근무지를 입력하세요");
		String loc = sc.nextLine();
		
//		String sql = "insert into dept values("+deptno+", '" + dname + "', '" + loc + "')";도 되지만
//		String.format을 사용하는 것이 입력하기 더 편리함
		String sql = String.format("insert into dept values(%d, '%s', '%s')", deptno, dname, loc);
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "c##scott", "tiger");
			stmt = conn.createStatement(); // url, id와 pw 정보를 가진 객체 생성
			
//			입력/수정/삭제는 executeUpdate, 성공한 개수를 반환한다.
			int result = stmt.executeUpdate(sql);
			if(result > 0) System.out.println("입력에 성공하였습니다.");
			else System.out.println("입력에 실패하였습니다");
	
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			stmt.close(); conn.close();
		}
		sc.close();
	}
}

위와 같이 코드를 작성하였고 데이터를 입력하였을 때 출력되는 결과를 살펴보면 아래와 같다.

 

필자는 입력창에 부서코드를 50, 부서명을 MARKETING,  근무지를 MANCHESTER라고 입력하였다.

 

💻 출력

부서코드를 입력하세요
50
부서명을 입력하세요
MARKETING
근무지를 입력하세요
MANCHESTER
입력에 성공하였습니다.

그 후, 결과가 어떻게 되는지 확인하여 보면

위에서 Oracle의 데이터를 조회할 경우에 대하여 작성하였던 OraSelect1.java의 출력 결과에서 아래와 같이 데이터가

추가된 것을 확인할 수 있고

 

💻 출력 (OraSelect1.java)

부서코드 : 10
부서명 : ACCOUNTING
근무지 : NEW YORK
=========================
부서코드 : 20
부서명 : RESEARCH
근무지 : DALLAS
=========================
부서코드 : 30
부서명 : SALES
근무지 : CHICAGO
=========================
부서코드 : 40
부서명 : OPERATIONS
근무지 : BOSTON
=========================
부서코드 : 50
부서명 : MARKETING
근무지 : MANCHESTER
=========================

 

Oracle에서도 입력된 결과가 적용된 것을 확인할 수 있다.

아래는 데이터를 부서코드 순으로 정렬한 것이다.

 

만일, 이미 존재하는 부서코드를 입력창에 입력하면 어떤 결과가 출력될까?

위의 스크린샷에서 확인할 수 있듯이 부서코드 20은 이미 존재하지만 필자는 부서코드 20에 관한 데이터를

입력해보았다.

부서코드를 입력하세요
20
부서명을 입력하세요
IT
근무지를 입력하세요
SEOUL
ORA-00001: 무결성 제약 조건(C##SCOTT.SYS_C008314)에 위배됩니다

무결성 제약조건에 위배된다는 에러가 발생하였다.

이미 존재하는 key에 대한 value를 입력하였을 때, 즉 dept 테이블에 단 하나만 존재해야하는 key가 중복해서 들어가기 때문에

발생하는 에러이므로 테이블에 key값이 중복되지 않게 입력해야 한다. MYSQL도 마찬가지이므로 따로 언급하지 않겠다.


MYSQL 데이터 입력

MYSQL의 경우에도 Oracle과 방식이 유사하다. id, pw, driver 등 필요할 부분만 변경해주면 된다.

 

- MYSQL에 저장된 dept 테이블의 raw data

 

✍ 입력

package ch17;

import java.sql.*;
import java.util.Scanner;

public class MyInsert {
	public static void main(String[] args) throws SQLException {
		String driver = "com.mysql.cj.jdbc.Driver"; 
		String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
		Connection conn = null; Statement stmt = null;
		
		Scanner sc = new Scanner(System.in);
		System.out.println("부서코드를 입력하세요");
		String deptno = sc.nextLine();
//		String deptno = sc.nextLine(); 이건 괜찮다. 에러가 나지 않는다. 밑에 %s로 바꿔주면 된다. 알아서 숫자로 인식한다.
		
		System.out.println("부서명을 입력하세요");
		String dname = sc.nextLine();
		
		System.out.println("근무지를 입력하세요");
		String loc = sc.nextLine();
		
		String sql = String.format("insert into dept values(%s, '%s', '%s')", deptno, dname, loc);
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "root", "mysql");
			stmt = conn.createStatement();
			int result = stmt.executeUpdate(sql);
			if (result > 0) System.out.println("입력에 성공하였습니다"); 
			else System.out.println("입력에 실패하였습니다");
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			
		} finally {
			stmt.close(); conn.close(); 
		}
		sc.close();
	}
}

위와 같이 코드를 작성하였고 데이터를 입력하였을 때 출력되는 결과를 살펴보면 아래와 같다.

 

필자는 입력창에 부서코드를 50, 부서명을 마케팅,  근무지를 맨체스터라고 입력하였다.

 

💻 출력

부서코드를 입력하세요
50
부서명을 입력하세요
마케팅
근무지를 입력하세요
맨체스터
입력에 성공하였습니다

그 후, MYSQL에서 데이터를 다시 조회하였을 때 위에서 추가한 데이터가 적용된 것을 확인할 수 있다.


 

수정 - Update

Oracle 데이터 수정

✍ 입력

이번에는 Statement 클래스의 Stringformat 메서드를 사용하는 대신 PreparedStatement 클래스를 사용하였다.

package ch17;
import java.sql.*;
import java.util.Scanner;

public class OraUpdate {
	public static void main(String[] args) throws SQLException {
		String driver = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe"; 
		Connection conn = null;
		PreparedStatement pstmt = null; // sql문을 좀 더 원활하게 사용하기 위함
		// 입력 수정 삭제는 preparedstatement 선호
		
		Scanner sc = new Scanner(System.in);
		System.out.println("수정할 부서코드를 입력하세요");
		int deptno = Integer.parseInt(sc.nextLine());
		
		System.out.println("수정할 부서명을 입력하세요");
		String dname = sc.nextLine();
		
		System.out.println("수정할 근무지를 입력하세요");
		String loc = sc.nextLine();
		
		// preparedStatement를 사용하면 ?에 데이터를 넣는 형식으로 사용 (Statement 클래스의 Stringformat과 차이점 보기)
		String sql = "update dept set dname = ?, loc = ? where deptno = ?";
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "c##scott", "tiger");
			pstmt = conn.prepareStatement(sql); // sql문장 추가, stmt = conn.createStatement();과 차이 확인하기
			pstmt.setString(1,  dname); // 첫번째 ?에 문자열 dname 대입
			pstmt.setString(2,  loc); // 두번째 ?에 문자열 loc
			pstmt.setInt(3, deptno); // 세번째 ?에 숫자 deptno
			
			int result = pstmt.executeUpdate(); 
			if (result > 0) System.out.println("수정되었습니다");
			else System.out.println("수정에 실패하였습니다"); // 수정하지 못한 경우, exception과 else는 같은 것이 아니라는 것 인지하기
			
		} catch (Exception e) { // sql 문장 또는 table에 문제가 발생한 경우
			System.out.println(e.getMessage());
			
		} finally {
			pstmt.close(); conn.close();
		}
		sc.close();	
	}
}

 

💻 출력

필자는 입력창에 수정할 부서코드를 50, 부서명을 IT,  근무지를 BUNDANG으로 입력하였다.

수정할 부서코드를 입력하세요
50
수정할 부서명을 입력하세요
IT
수정할 근무지를 입력하세요
BUNDANG
수정되었습니다

그 후, 결과가 어떻게 되는지 확인하여 보면

위에서 Oracle의 데이터를 조회할 경우에 대하여 작성하였던 OraSelect1.java의 출력 결과에서 아래와 같이 데이터가

추가된 것을 확인할 수 있고

 

💻 출력 (OraSelect1.java)

부서코드 : 50
부서명 : IT
근무지 : BUNDANG
=========================
부서코드 : 10
부서명 : ACCOUNTING
근무지 : NEW YORK
=========================
부서코드 : 20
부서명 : RESEARCH
근무지 : DALLAS
=========================
부서코드 : 30
부서명 : SALES
근무지 : CHICAGO
=========================
부서코드 : 40
부서명 : OPERATIONS
근무지 : BOSTON
=========================

Oracle에서도 입력된 결과가 적용된 것을 확인할 수 있다.

 

본래 데이터에 존재하지 않는 부서코드를 입력하면 어떤 결과가 출력될까?

 

위의 스크린샷에서 확인할 수 있듯이 Oracle에 내장된 dept 테이블에는 부서코드 70이 존재하지 않지만

필자는 부서코드 70을 입력해보았다.

수정할 부서코드를 입력하세요
70
수정할 부서명을 입력하세요
SERVICE
수정할 근무지를 입력하세요
SEOUL
수정에 실패하였습니다

부서코드 70은 원래 데이터에 존재하지 않기 때문에 수정할 수 없다는 결과가 출력된다는 것을 확인하였다.


MYSQL 데이터 수정

emp 테이블에서 사번이 7369에 해당하는 데이터의 이름과 업무를 수정하는 코드를 작성하였다.

 

- MYSQL에 저장된 emp 테이블의 raw data

 

✍ 입력

package ch17;

import java.sql.*;
import java.util.Scanner;

// mysql emp 테이블 사번이 7369에 해당하는 empno 이름을 보검, 업무를 배우로 수정
public class MyUpdate {
	public static void main(String[] args) throws SQLException {
		String driver = "com.mysql.cj.jdbc.Driver"; 
		String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		Scanner sc = new Scanner(System.in);
		
		System.out.println("수정하고 싶은 사번을 입력하세요.");
		int empno = Integer.parseInt(sc.nextLine());
		
		System.out.println("사원명을 어떻게 수정하고 싶으신가요?");
		String ename = sc.nextLine();
		
		System.out.println("업무를 어떻게 수정하고 싶으신가요?");
		String job = sc.nextLine();
		
	        String sql = "update emp set ename = ?, job = ? where empno = ?";
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "root", "mysql");
			pstmt = conn.prepareStatement(sql); 
			pstmt.setString(1, ename); 
			pstmt.setString(2,  job); 
			pstmt.setInt(3,  empno); 
			int result = pstmt.executeUpdate(); 
			if (result > 0) System.out.println("수정되었습니다");
			else System.out.println("수정에 실패하였습니다"); 
			
		} catch (Exception e) { 
			System.out.println(e.getMessage());
		} finally {
			pstmt.close(); conn.close();
		}
		sc.close();
	}
}

💻 출력 

필자는 입력창에 수정할 사번을 7934, 사원명을 YOUNGIN,  업무를 ENGINEER 입력하였다.

수정하고 싶은 사번을 입력하세요.
7934
사원명을 어떻게 수정하고 싶으신가요?
YOUNGIN
업무를 어떻게 수정하고 싶으신가요?
ENGINEER
수정되었습니다

그 후, MYSQL에서 데이터를 다시 조회하였을 때 위에서 수정한 데이터가 적용된 것을 확인할 수 있다.


삭제 - Delete

Oracle 데이터 삭제

- Oracle에 저장된 dept 테이블의 raw data (위에서 입력 시 부서코드 50에 관한 데이터를 추가한 모습)

위에서 입력한 데이터를 다시 삭제하려 한다.

✍ 입력

package ch17;
import java.sql.*;
import java.util.Scanner;
public class OraDelete {
	public static void main(String[] args) throws SQLException {
		String driver = "oracle.jdbc.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe"; 
		Connection conn = null; PreparedStatement pstmt = null;
		
		Scanner sc = new Scanner(System.in);
		System.out.println("삭제할 부서코드를 입력하세요.");
		int deptno = sc.nextInt(); // Integer.parseInt(sc.nextLine()); 하나만 입력할 것이므로 nextInt 사용
		String sql = "delete from dept where deptno = ?";
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "c##scott", "tiger");
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, deptno);
			int result = pstmt.executeUpdate();
			if (result > 0) System.out.println("삭제하였습니다.");
			else System.out.println("삭제에 실패하였습니다."); 
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			pstmt.close(); conn.close();
		}
		sc.close();
	}
}

💻 출력

필자는 입력창에 삭제할 부서코드 50입력하였다.

삭제할 부서코드를 입력하세요.
50
삭제하였습니다.

Oracle에서 삭제 결과가 적용된 것을 확인할 수 있다.

그리고 dept 테이블에 존재하지 않는 부서코드를 입력하면 삭제할 수 없다는 결과가 출력된다.

💻 출력

삭제할 부서코드를 입력하세요.
70
삭제에 실패하였습니다.

MYSQL 데이터 삭제

MYSQL도 Oracle과 유사한 방식으로 작성한다.

 

✍ 입력

package ch17;
import java.sql.*;
import java.util.Scanner;
// mysql에서 7369 사번의 테이블 삭제
public class MyDelete {
	public static void main(String[] args) throws SQLException {
		String driver = "com.mysql.cj.jdbc.Driver"; 
		String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
		Connection conn = null; PreparedStatement pstmt = null;
		
		Scanner sc = new Scanner(System.in);
		System.out.println("삭제할 사번을 입력하세요.");
		int empno = sc.nextInt(); 
		String sql = "delete from emp where empno = ?";
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, "root", "mysql");
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, empno);
			int result = pstmt.executeUpdate();
			if (result > 0) System.out.println("삭제하였습니다.");
			else System.out.println("삭제에 실패하였습니다."); 
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			pstmt.close(); conn.close();
		}
		sc.close();
	}

}

'Back-End > JAVA' 카테고리의 다른 글

[Java] StringBuilder의 간단한 개념  (0) 2023.04.05
[Java] length, length(), size()  (0) 2023.04.05
[Java] JDBC (2) (eclipse와 Oracle, MySQL)  (0) 2023.03.24
[Java] JDBC (1) (eclipse와 Oracle, MySQL)  (0) 2023.03.23
[Java] 접근 제어자  (0) 2023.03.19