본문 바로가기

IT코딩공부!

#19 (은행) DB+인텔리제이

오늘의 노래!!!

 
못된 송아지 엉덩이에 뿔 (CRAZY NIGHT)
아티스트
DKZ
앨범
DONGKIZ 5th Single Album 'CHASE EPISODE 1. GGUM'
발매일
1970.01.01

[0] DBC 클래스 생성 -- 고정 ( DB의 개정만 수정해서 사용할 것!)

package Bank;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBC {
    public  static Connection DBConnect(){
        Connection con = null;

        String url = "jdbc:oracle:thin:@localhost:1521:xe";

        String user = "PC1";
        String password = "1111";

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");

            con = DriverManager.getConnection(url, user,password);

            System.out.println("DB 접속 성공!");

        } catch (ClassNotFoundException e) {
            System.out.println("DB접속 실패 : 드라이버 로딩실패!");
            throw new RuntimeException(e);
        } catch (SQLException e) {

            System.out.println("DB접속 실패 : 접속 정보 확인!");
            throw new RuntimeException(e);
        }
        return  con;
    }
}

[1] 필드, 생성자, 메소드[클래스 이름] 클래스 생성 - 필드 생성후 AIt + Insert 적용

public class Client{

// 필드

    private  int cNum;      //고객번호
    private  String cName;  //고객이름
    private  String cAccount;//계좌번호
    private  int balance;   //계좌잔액

// 기본생성자 - 매계변수 생성자는 생략

 public Client() {
    }

// 메소드 - 각필드 마다 getter,setter 생성

    public int getcNum() {
        return cNum;
    }

    public void setcNum(int cNum) {
        this.cNum = cNum;
    }

    public String getcName() {
        return cName;
    }

    public void setcName(String cName) {
        this.cName = cName;
    }

    public String getcAccount() {
        return cAccount;
    }

    public void setcAccount(String cAccount) {
        this.cAccount = cAccount;
    }

    public int getBalance() {
        return balance;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

// 메소드 - toString으로 모든 필드 지정 (오버라이딩)

    @Override
    public String toString() {
        return "Client[cNum=" + cNum +
                ", cName=" + cName +
                ", cAccount=" + cAccount  +
                ", balance=" + balance +
                ']';
    }

}

[2] 객체 생성후 DB에 들어갈 SQL문 작성

import java.sql.*;

// 각각 사용할 변수 선언 

// stmt - sql문을 전송을 위한 객체

// pstmt - '?' 없이도 사용 가능!!! -- 주로 사용함

public class Client_CRUD {

    Connection con;

    // sql 쿼리문 전송을 위한 객체
    Statement stmt;


    ResultSet rs;

    // '?' 없이도 사용 가능
    PreparedStatement pstmt;

// DB연동을 위한 DBConnect() 메소드 사용

public void DBConnect() {
        con = DBC.DBConnect();
    }

// 기본 insert, select, update, delete, close문 사용

// 위에 변수 선언과 DB연동, close문은 무조건 사용

 

// 이번 프로젝트엔 사용 안함!!!

// insert - 생성6단계 생각할것

    public void insert() {
        try {
            stmt = con.createStatement();

            String sql = "INSERT INTO BANK VALUES( )";

            int result = stmt.executeUpdate(sql);

            if (result > 0) {
                System.out.println("성공!");
            } else {
                System.out.println("실패");
            }

            stmt.close();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

 

// select - 생성6단계 생각할것

    public void select() {

        try {
            stmt = con.createStatement();

            String sql = "SELECT * FROM BANK";

            rs = stmt.executeQuery(sql);

            while (rs.next()) {
                System.out.print("고객번호 : " + rs.getString(1)+" | ");
                System.out.print("고객이름 : " + rs.getString(2)+" | ");
                System.out.print("계좌번호 : " + rs.getString(3)+" | ");
                System.out.println("계좌잔액 : " + rs.getString(4));
            }

            stmt.close();
            rs.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

// update - 생성6단계 생각할것

  public void update() {


        try {
            stmt = con.createStatement();

            String sql = "UPDATE BANK SET ";

            int result = stmt.executeUpdate(sql);

            if (result > 0) {
                System.out.println("업데이트 성공!");
            } else {
                System.out.println("업데이트 실패");
            }

            stmt.close();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

// delete - 생성6단계 생각할것

    public void delete() {


        try {
            stmt = con.createStatement();

            String sql = "DELETE FROM BANK ";

            int result = stmt.executeUpdate(sql);

            if (result > 0) {
                System.out.println("삭제 성공!");
            } else {
                System.out.println("삭제 실패");
            }

            stmt.close();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


    }

// close - 중요!!! > 마무리 지을때 꼭 사용!!

   public void conClose() {

        try {
            con.close();
            System.out.println("접속해체");
        } catch (SQLException e) {
            System.out.println("접속중이 아님!");
            throw new RuntimeException(e);
        }
    }

 

중요!!! >  고객 번호를 받기위한 메소드 지정!!! (DB : CNUM)

// sql = 지정할때 주의있게 볼것

    public int clientNumber() {
        int cNum=0;

            String sql = "SELECT MAX(CNUM) FROM BANK";

            try {
                pstmt = con.prepareStatement(sql);

                // sql문 실행
                rs = pstmt.executeQuery();

                //결과
                if (rs.next()) {
                    cNum = rs.getInt(1);
                }
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
//            System.out.println("고객번호 : "+ cNum);
            return cNum;

    }

중요!!! >  계좌번호를 랜덤으로 지정해서 받기 위한 메소드 지정!!! (DB : CACCOUT)

// 여기서 Math.random() 함수를 사용할 것을 볼수 있다

    public String accountNumber() {
        String cAccount = null;

        // 예를 들어 : 신한은행 계좌번호 110-xxx-xxxxxx
        cAccount = "110-";

        // 110-xxx(무작위 3자리 숫자) -- 반복문 사용
        // String타입과 int타입 합치면 String타입 변환
        // 1~9사이의 랜덤 숫자
        for (int i = 1; i <= 3; i++) {
            cAccount += (int)(Math.random()*9)+1;
        }
        cAccount += "-";
        for (int i = 1; i <= 6; i++) {
            cAccount += (int)(Math.random()*9)+1;
        }

//        System.out.println("계좌번호"+cAccount);
        return  cAccount;
    }

중요!!! >  인텔리제이에서 sql문을 선언 후 '?' 값 받기 위한 메소드 지정!!! (DB : 컬럼에 데이터 넣기) 

//  INSERT문

    public void bankInsert(Client client) {
        // 1. sql문 작성
        String sql = "INSERT INTO BANK VALUES(?,?,?,?)";

        // 2. try=catch문
        try {
            pstmt = con.prepareStatement(sql);

            // 3. '?' 값 넣기
            pstmt.setInt(1,client.getcNum());
            pstmt.setString(2,client.getcName());
            pstmt.setString(3,client.getcAccount());
            pstmt.setInt(4,client.getBalance());

            // 4. 실행 C<R<U<D << result문 사용!!!
            int result = pstmt.executeUpdate();

            // 5. 결과확인
            if (result>0){
                System.out.println("계좌 성공");
            } else {
                System.out.println("계좌 실패");
            }

            // 6. 마무리
            pstmt.close();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

중요!!! >  데이터를 조회에서 있으면 출력 받고 없으면 실패하는 메소드 지정!!! (DB : CACCOUNT) 

//  SELECT문

    public boolean checkAccount(String cAccount) {

        boolean check = false;

        String sql = "SELECT * FROM BANK WHERE CACCOUNT = ?";

        try {
            pstmt=con.prepareStatement(sql);

            pstmt.setString(1,cAccount);

            rs = pstmt.executeQuery();
            if (rs.next()){
                check = true;
                System.out.println("계좌 조회 성공 ");

            } else {
                check = false;
                System.out.println("계좌 조회 실패");
            }
            pstmt.close();
            rs.close();

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return check;
    }

중요!!! >  데이터를 수정하기 위한  메소드 지정!!! (DB : CACCOUNT , BALANCE) 

// 사용자가 입금하기 위해서는 자신의 계좌가 맞고 그리고 다음에 자신이 원하는 금액을 입금!!

//  UPDATE문

    public void deposit(String cAccount, int balance) {

        String sql = "UPDATE BANK SET  BALANCE = BALANCE +? WHERE CACCOUNT = ?";

        try {
            pstmt = con.prepareStatement(sql);

            pstmt.setInt(1, balance);
            pstmt.setString(2,cAccount);

            int result = pstmt.executeUpdate();

            if (result>0){
               // System.out.println("입금 성공");
            } else {
                System.out.println("입금 실패");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

중요!!! >  데이터를 수정하기 위한  메소드 지정!!! (DB : CACCOUNT , BALANCE) 

// 사용자가 출금할려는 금액을 출금!!

//  UPDATE문

    public void deposit1(String cAccount, int balance) {

        String sql = "UPDATE BANK SET  BALANCE = BALANCE - ? WHERE CACCOUNT = ?";

        try {
            pstmt = con.prepareStatement(sql);

            pstmt.setInt(1, balance);
            pstmt.setString(2,cAccount);

            int result = pstmt.executeUpdate();

            if (result>0){
             //   System.out.println("출금 성공");
            } else {
                System.out.println("출금 실패");
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

중요!!! >  데이터  메소드 지정!!! (DB : CACCOUNT ) 

// 사용자가 출금할려는 높으면 출금 못하고 입금 금액 보다 적으면 금액을 출금!!

//  SELECT문

    public int checkBalance(String cAccount) {


        int balance = 0;

        String sql = "SELECT BALANCE FROM BANK WHERE CACCOUNT = ? ";

        try {

            pstmt = con.prepareStatement(sql);

            pstmt.setString(1,cAccount);
            // sql문 실행
            rs = pstmt.executeQuery();

            //결과
            if (rs.next()) {
                balance = rs.getInt(1);
            }
            rs.close();
            pstmt.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return balance;

    }

[3] 출력하기 위한 main 클래스 작성

 

public class Client_Main{

       public startic void main(String[] args){

        

// 생성자 선언!!!

        Client client = new Client();

        Client_CRUD bank = new Client_CRUD();

        bank.DBConnect();

        Scanner sc = new Scanner(System.in);

        boolean run = true;
        int menu = 0;

        System.out.println("은행에 오신것을 환영합니다");
        System.out.println("무엇을 도와드릴까요?");

// 기본 출력문 선언 (while으로 반복) (run 위에 boolean타입 무조건 true로 선언)

        while (run){
            System.out.println("========================================");
            System.out.println("1. DB접속   2. 접속해제   3. 생성   4. 입금");
            System.out.println("5. 출금     6. 송금      7. 조회   8. 종료");
            System.out.println("========================================");
            System.out.println("선택 : ");
            menu=sc.nextInt();

 // switch문으로 조건 각 case안에 조건 지정

switch ( menu ){

// 1. DB 연결

                case 1:
                    bank.DBConnect();
                    break;

// 2. DB 해체

                case 2:
                    bank.conClose();
                    break;

// 3. 계좌 생성!!! 

// clientNumber메소드 생성 

// 고객번호 생성 및 계좌 번호 자동으로 생성 (중복 무시)

                case 3:
                    System.out.println("새로운 계좌를 생성합니다");

                    // 자동으로 고객번호 생성
                    int cNum=bank.clientNumber()+1;


                    // 고객이름
                    System.out.println("고객 이름 입력 : ");
                    String cName = sc.next();

                    // 계좌번호 자동생성
                    // 중복 무시 x
                    String cAccount = bank.accountNumber();


                    // 초기 입금액
                    System.out.println("초기 입금액 : ");
                    int balance = sc.nextInt();

                    client.setcNum(cNum);
                    client.setcName(cName);
                    client.setcAccount(cAccount);
                    client.setBalance(balance);

                    bank.bankInsert(client);

                    break;

// 4. 계좌 입금!!! 

// checkAccount을 통한 입금할때 사용하는 메소드 지정!!

// 먼저 boilean타입을 통해 계좌 여부를 확인후 있으면 입금 없으면 존재하는 되묻기

case 4:
                    // (1) 계좌를 입력 받는다
                    System.out.println("계좌번호 입력 : ");
                    cAccount = sc.next();

                    boolean check = bank.checkAccount(cAccount);
                    //     L 계좌 여부


                    // (2) 입금할 금액을 입력한다.

                    if(check) {
                        System.out.println("입력할 금액은 : ");
                        balance = sc.nextInt();

                        bank.deposit(cAccount, balance);

                    } else {

                        System.out.println("계좌번호가 존재하지 않습니다.");
                    }
                    break;

// 5. 계좌 출금!!!

// checkBalance를 통해서 출금 메소드 지정!!!

// 위에서 계좌여부 확인뒤 출금 

case 5:
                    System.out.println("계좌번호 입력 : ");
                    cAccount = sc.next();



                    // (2) 입금할 금액을 입력한다.
                    if(bank.checkAccount(cAccount)) { // 이렇게 사용해도 된다 (위에처럼 해도 되구 ㅎㅎ)
                        System.out.println("출력할 금액은 : ");
                        balance = sc.nextInt();
                        int balance1 = bank.checkBalance(cAccount);

                        if (balance1>=balance) {
                            bank.deposit1(cAccount, balance);
                        } else {
                            System.out.println("잔액이 : " + (balance - balance1) + "원");
                        }
                    }else{
                        System.out.println("계좌번호가 존재하지 않습니다.");
                    }
                    break;

// 6. 송금!!!

// checkAccount

// checkBalance

//두개의 메소드를 사용해서  계좌여부를 똑같이 확인후 맞으면 내 계좌 출금 상대방 입금 아니면 반대!!! 

                case 6:
                    //(1) 내 계좌 조회
                    System.out.println("내 계좌 조회 : ");
                    String sAccount = sc.next();

                    if(bank.checkAccount(sAccount)){
                        //(2) 상대방 계좌 조회
                        System.out.println("상대방 계좌 조회 : ");
                        String rAccount = sc.next();
                        if(bank.checkAccount(rAccount)){
                            // (3) 내 계좌 잔액 조회 + 송금액 입력
                            System.out.print("송금액 >> ");
                            int sBalance = sc.nextInt();                // 송금액
                            int cBalance = bank.checkBalance(sAccount);  // 보내는 사람 계좌 잔액

                            if(cBalance>=sBalance){
                                // (4) 내 계좌 (송금액만큼) 출금
                                bank.deposit1(sAccount, sBalance);

                                // (5) 상대방 계좌 (송금액만큼) 입금
                                bank.deposit(rAccount, sBalance);

                                System.out.println("송금 성공!");
                            } else {
                                System.out.println("잔액이 " + (sBalance-cBalance) + "원 부족합니다.");
                            }


                        } else {
                            System.out.println("받는분 계좌가 존재하지 않습니다.");
                        }

                    } else {
                        System.out.println("보내는분 계좌가 존재하지 않습니다.");
                    }
                    break;

// 7. 계좌 조회 후 잔액 조회까지!!!

// checkBalance

case 7:
                    System.out.println("계좌번호 입력 : ");
                    cAccount = sc.next();

                    if(bank.checkAccount(cAccount)) {

                        //db에서 계좌번호에 대한 잔액 조회
                        balance = bank.checkBalance(cAccount);
                        System.out.println("잔액 : " + balance);

                    } else {

                        System.out.println("계좌번호가 존재하지 않습니다.");
                    }
                    break;

// 8. 사용종료!!!

// run = false;

                case 8:
                    System.out.println("이용해주셔서 감사합니다");
                    run = false;
                    break;

// default. 잘못입력시!!!

                default:
                    System.out.println("다시입력해주세요");
                    break;
            }

     }

   }

}