Java JDBC를 이용한 Oracle 데이터베이스 CRUD 애플리케이션

Soozoo·2024년 7월 12일

JAVA

목록 보기
40/41

1. 데이터베이스 연결 및 데이터 모델 클래스 정의

먼저, 데이터베이스 연결 및 데이터 모델 클래스를 정의합니다.

package dbConn.util;

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

public class ConnectionHelper {
    public static Connection getConnection(String dsn, String uid, String pwd) {
        Scanner sc = new Scanner(System.in);
        Connection conn = null;
        
        while (true) {
            try {
                System.out.println("아이디를 입력하세요.");
                uid = sc.next();
                System.out.println("비밀번호를 입력하세요.");
                pwd = sc.next();

                if (dsn.equalsIgnoreCase("mysql")) {
                    Class.forName("com.mysql.jdbc.Driver");
                    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/SampleDB", uid, pwd);
                    break;
                } else if (dsn.equalsIgnoreCase("oracle")) {
                    Class.forName("oracle.jdbc.OracleDriver");
                    conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.143:1521:xe", uid, pwd);
                    System.out.println("Oracle 데이터베이스에 접속되었습니다.");
                    break;
                } else {
                    System.out.println("지원하지 않는 데이터베이스 종류입니다. mysql 또는 oracle 중 하나를 입력하세요.");
                }
            } catch (Exception e) {
                if (e.getMessage().contains("ORA-01017")) {
                    System.out.println("유효하지 않는 사용자 이름 또는 비밀번호입니다. 다시 입력해주세요.");
                } else {
                    e.printStackTrace();
                }
            }
        }
        
        return conn;
    }
    
    public static void menu() {
		System.out.println("\n********************** 주민 테이블  **********************");
		System.out.println("\t 0.rollback");
		System.out.println("\t 1. 레코드 삽입(추가)");
		System.out.println("\t 2. 레코드 수정");
		System.out.println("\t 3. 전체보기");
		System.out.println("\t 4. 조건에 의한 검색(ex > gno)");
		System.out.println("\t 5. 레코드 삭제");
		System.out.println("\t 6. 프로그램 종료");
		System.out.println("\t 7. commit");
		System.out.println("\t >> 원하는 메뉴 선택 하세요.  ");
	}
}
package Model;

public class GogakVO {
    public final String className = "GOGAK";

    private int gno, jumin, point;
    private String gname;

    // Getters and Setters
    public int getGno() {
        return gno;
    }

    public void setGno(int gno) {
        this.gno = gno;
    }

    public int getJumin() {
        return jumin;
    }

    public void setJumin(int jumin) {
        this.jumin = jumin;
    }

    public int getPoint() {
        return point;
    }

    public void setPoint(int point) {
        this.point = point;
    }

    public String getGname() {
        return gname;
    }

    public void setGname(String gname) {
        this.gname = gname;
    }

    public String getClassName() {
        return className;
    }
}

2.CloseHelper 클래스는 JDBC 자원을 안전하게 해제하기 위한 클래스

package dbConn.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class CloseHelper {
	public static void close(Connection conn) {
		if(conn != null) try {
			conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void close(Statement stmt) {
		if(stmt != null) try {
			stmt.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void close(PreparedStatement pstmt) {
		if(pstmt !=null) try {
			pstmt.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void close(ResultSet rs) {
		if(rs!=null)try {
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4. 데이터베이스 연결 및 CRUD 기능 구현

다음으로, 데이터베이스 연결 및 CRUD 기능을 구현합니다.

package Controller;

import java.sql.*;
import java.util.Scanner;
import Model.GogakVO;
import dbConn.util.CloseHelper;
import dbConn.util.ConnectionHelper;

public class GoGakController {
    static Scanner sc = new Scanner(System.in);
    static Connection conn;
    static PreparedStatement pstmt;
    static ResultSet rs = null;
    static Statement stmt;

    // 데이터베이스 연결
    public static void connect() {
        try {
            conn = ConnectionHelper.getConnection("oracle", null, null);
            stmt = conn.createStatement();
            conn.setAutoCommit(false); // 자동 커밋 모드 해제
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 데이터베이스 연결 해제
    public static void close() {
        try {
            CloseHelper.close(rs);
            CloseHelper.close(stmt);
            CloseHelper.close(conn);
            CloseHelper.close(pstmt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 메뉴 표시 및 선택 처리
    public static void menu() throws SQLException {
        GogakVO vo = new GogakVO();

        while (true) {
            ConnectionHelper.menu(); // 메뉴 표시

            switch (sc.nextInt()) {
                case 0:
                    System.out.println("Commit 하시겠습니까?(Y/N)");
                    System.out.println("안하시려면 Rollback 됩니다. ");
                    if (sc.next().equalsIgnoreCase("Y")) {
                        commit(); // 커밋
                        selectAll(vo.getClassName()); // 전체 조회
                    } else {
                        rollback(); // 롤백
                        selectAll(vo.getClassName()); // 전체 조회
                    }
                    break;
                case 1:
                    selectAll(vo.getClassName()); // 전체 조회
                    insert(vo.getClassName()); // 추가
                    selectAll(vo.getClassName()); // 전체 조회
                    break;
                case 2:
                    selectAll(vo.getClassName()); // 전체 조회
                    update(vo.getClassName()); // 수정
                    selectAll(vo.getClassName()); // 전체 조회
                    break;
                case 3:
                    selectAll(vo.getClassName()); // 전체 조회
                    break;
                case 4:
                    selectByGno(vo.getClassName()); // 조건 조회
                    break;
                case 5:
                    selectAll(vo.getClassName()); // 전체 조회
                    delete(vo.getClassName()); // 삭제
                    break;
                case 6:
                    close(); // 연결 해제
                    System.out.println("프로그램 종료합니다!!");
                    System.exit(0); // 프로그램 종료
                    break;
                case 7:
                    conn.commit(); // 커밋
                    System.out.println("성공적으로 완료 되었습니다.");
                    break;
                default:
                    System.out.println("없는 번호 선택 하셨습니다. 0~7번 중에서 선택하세요.");
            }
        }
    }

    // 데이터 삽입
    public static void insert(String className) throws SQLException {
        try {
            System.out.println("고객 정보를 입력하세요.");

            System.out.print("고객번호 입력: ");
            int gno = sc.nextInt();
            System.out.print("고객명 입력: ");
            String gname = sc.next();
            System.out.print("주민번호 입력: ");
            int jumin = sc.nextInt();
            System.out.print("포인트 입력: ");
            int point = sc.nextInt();

            String sql = "INSERT INTO " + className + " VALUES(?,?,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, gno);
            pstmt.setString(2, gname);
            pstmt.setInt(3, jumin);
            pstmt.setInt(4, point);

            int result = pstmt.executeUpdate(); // 데이터 삽입 실행

            System.out.println(result + "개 데이터 추가 성공!!");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 데이터 조회 (전체)
    public static void selectAll(String className) throws SQLException {
        String sql = "SELECT * FROM " + className;
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery();

        ResultSetMetaData rsmd = rs.getMetaData();
        int columnCount = rsmd.getColumnCount();

        for (int i = 1; i <= columnCount; i++) {
            System.out.print(rsmd.getColumnName(i) + "\\t");
        }
        System.out.println();

        while (rs.next()) {
            for (int i = 1; i <= columnCount; i++) {
                switch (rsmd.getColumnType(i)) {
                    case Types.NUMERIC:
                    case Types.INTEGER:
                        System.out.print(rs.getInt(i) + "\\t");
                        break;
                    case Types.FLOAT:
                        System.out.print(rs.getFloat(i) + "\\t");
                        break;
                    case Types.DOUBLE:
                        System.out.print(rs.getDouble(i) + "\\t");
                        break;
                    case Types.CHAR:
                        System.out.print(rs.getString(i) + "\\t");
                        break;
                    case Types.DATE:
                        System.out.print(rs.getDate(i) + "\\t");
                        break;
                    default:
                        System.out.print(rs.getString(i) + "\\t");
                        break;
                }
            }
            System.out.println();
        }
    }

    // 데이터 업데이트
    public static void update(String className) {
        try {
            System.out.println("수정할 정보의 번호를 입력하세요.");
            int gno = sc.nextInt();
            sc.nextLine();

            System.out.println("1. 고객명 수정");
            System.out.println("2. 주민번호 수정");
            System.out.println("3. 포인트 수정");
            System.out.print("수정할 항목을 선택하세요: ");

            int num = sc.nextInt();
            sc.nextLine();

            String sql = "";
            int result = 0;
            switch (num) {
                case 1:
                    System.out.println("수정할 고객명을 입력하세요.");
                    String gname = sc.nextLine();
                    sql = "UPDATE " + className + " SET gname =? WHERE gno= ?";
                    pstmt = conn.prepareStatement(sql);
                    pstmt.setString(1, gname);
                    pstmt.setInt(2, gno);
                    break;
                case 2:
                    System.out.println("수정할 주민번호를 입력하세요.");
                    int jumin = sc.nextInt();
                    sql = "UPDATE " + className + " SET jumin =? WHERE gno= ?";
                    pstmt = conn.prepareStatement(sql);
                    pstmt.setInt(1, jumin);
                    pstmt.setInt(2, gno);
                    break;
                case 3:
                    System.out.println("수정할 포인트를 입력하세요.");
                    int point = sc.nextInt();
                    sql = "UPDATE " + className + " SET point =? WHERE gno= ?";
                    pstmt = conn.prepareStatement(sql);
                    pstmt.setInt(1, point);
                    pstmt.setInt(2, gno);
                    break;
                default:
                    System.out.println("잘못된 선택입니다. 제대로 선택하세요(1~3)");
                    return;
            }
            result = pstmt.executeUpdate();
            System.out.println(result + "개 데이터가 업데이트 되었습니다.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 데이터 삭제
    public static void delete(String className) throws SQLException {
        String num = sc.next();
        try {
            String sql = "DELETE FROM " + className + " WHERE GNO = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, num);
            int result =

 pstmt.executeUpdate(); // 데이터 삭제 실행
            System.out.println(result + "개 데이터가 삭제 되었습니다.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 트랜잭션 커밋
    public static void commit() {
        try {
            conn.commit(); // 커밋
            System.out.println("커밋 되었습니다.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 트랜잭션 롤백
    public static void rollback() {
        try {
            conn.rollback(); // 롤백
            System.out.println("롤백 되었습니다.");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

5. 메인 애플리케이션 실행

마지막으로, 메인 애플리케이션을 실행하여 사용자 인터페이스를 구현합니다.

package Main;

import java.sql.SQLException;
import Controller.GoGakController;

public class MainEntry {
    public static void main(String[] args) throws SQLException {
        GoGakController gc = new GoGakController();
        gc.connect(); // 데이터베이스 연결
        gc.menu();    // 메뉴 표시 및 사용자 선택 처리
    }
}

실행예시:

profile
넙-죽

0개의 댓글