Learn & Record

JAVA JDBC (deposit, updateBalance, withdraw, selectOne, inquire, disConnect, accountDAO) 본문

Dev/Java

JAVA JDBC (deposit, updateBalance, withdraw, selectOne, inquire, disConnect, accountDAO)

Walker_ 2024. 2. 19. 13:52

1. 입금(deposit) 메서드 코드 작성

    public void deposit() { // 입금
        System.out.print("계좌번호: ");
        int id = stdIn.nextInt();

        System.out.print("입금액: ");
        long money = stdIn.nextLong();

        // 해당 계좌 찾기
        if (isAccount((id))) {
            updateBalance(id, money, true);
        } else {
            System.out.println("해당 계좌번호가 존재하지 않습니다.");
        }
    }

 

1-2. updateBalance 코드 작성

    private boolean updateBalance (int id, long money, boolean flag) {
        Statement statement = null;
        boolean res = false;
        int upd = 0;
        try {
            String sql;
            if (flag) {
                sql = String.format("UPDATE account SET balance = balance + %d WHERE (id = %d)" , money, id);
            } else {
                sql = String.format("UPDATE account SET balance = balance - %d WHERE (id = %d)", money, id);
            }
            statement = connection.createStatement();
            upd = statement.executeUpdate(sql);
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        res = (upd == 0) ? false : true;
        return res;
    }

 

2. 출금 (withdraw) 메서드 작성

    public void withdraw() { // 출금
        System.out.print("계좌번호: ");
        int id = stdIn.nextInt();

        System.out.print("출금액: ");
        long money = stdIn.nextLong();

        if(!isAccount(id)) {
            System.out.println("해당 계좌번호가 존재하지 않습니다.");
            return;
        }
        Account account = selectOne(id);
        if (account.getBalance() < money) {
            System.out.println("잔액이 부족합니다.");
        } else {
            updateBalance(id, money, false);
            System.out.println("출금완료 되었습니다.");
        }
    }

 

2-2. selectOne 메서드

private Account selectOne(int id) {
        Statement statement = null;
        Account account = null;
        try {
            String sql = "SELECT * FROM account WHERE id = '" +id+"'";
            statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(sql);

            if (resultSet.next()) {
                account = new Account();
                account.setId(resultSet.getInt("id"));
                account.setName(resultSet.getString("name"));
                account.setBalance(resultSet.getInt("balance"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return account;
    }

 

3. 잔액조회(inquire) 메서드

   public void inquire() { // 잔액 조회
        System.out.print("계좌번호: ");
        int id = stdIn.nextInt();

        if (!isAccount(id)) {
            System.out.println("해당 계좌번호가 존재하지 않습니다.");
            return;
        }

        Account account = selectOne(id);
        System.out.println(account.getId() + "\t" + account.getName() + "\t" + account.getBalance());
    }

 

4. 전체 계좌(display) 메서드

    public void display() {
        /* 전체 계좌 출력 */
        ArrayList<Account> list = selectAll();
        for (Account account : list) {
            System.out.println(account.getId() + "\t" + account.getName() + "\t" + account.getBalance());
        }
    }

 

5. 연결 해제. 프로그램 종료 (disConnect) 메서드 

    public void disConnect() { // 연결 해제. 서비스 종료시에 사용
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

 

6. Controller에 있는 데이터베이스 관련 처리를 따로 분리. DAO 클래스 생성. model은 DTO와 DAO로 구성

 - try with resourse와 PreparedStatement 사용으로 수정

 - 메서드 이름만으로 Controller에 있는 메서드인지, DAO에 있는 메서드인지 구분 될 수 있도록

 - DAO의 메서드는 메서드당 하나의 쿼리만 실행

 - AccountDAO 클래스 작성

 - 데이터 베이스 연결 메서드 getConnection()를 DAO로 이동

 - 계좌개설 makeAccount() 메서드 수정

 - DAO로 기능 메서드 모두 이전

 

[ AccountDAO ]

package ch_01.day240216_19.mvc;

import ch_01.day240119.ClassD.Product;

import java.sql.*;
import java.util.ArrayList;

public class AccountDAO {
    /* DB 서버와 접속하고 레코드를 처리하는 기능.
    데이터베이스 처리에 관한 기능만으로 구성되는 객체를 DAO Data Access Object 객체라고 함
     */
    private Connection connection = null;

    AccountDAO() {getConnection();}
    private void getConnection() { // 디비 연결 생성자에서 실행
        try {
            String url = "jdbc:mariadb://localhost:3306/sample";
            String user = "root";
            String password = "5046";

            try {
                Class.forName("org.mariadb.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

            this.connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public int selectAccountCnt(int id) {
        /* 해당 계좌번호의 계좌가 있는지 리턴 */
        String sql = "SELECT COUNT(*) AS cnt FROM sample.account WHERE id = ? ";
        int cnt;
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setInt(1,id);
            try (ResultSet resultSet = preparedStatement.executeQuery()){
                resultSet.next();
                cnt = resultSet.getInt(1);
            }
        }catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return cnt;
    }

    public boolean insertAccount(Account account) {
        String sql = "INSERT INTO sample.account VALUES (?,?,?)";
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setInt(1, account.getId());
            preparedStatement.setString(2, account.getName());
            preparedStatement.setLong(3, account.getBalance());

            return preparedStatement.executeUpdate() == 1;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public boolean updateBalance (int id, long money, boolean flag) {
        String sql;
        int cnt = 0;
        if (flag) {
            sql = "UPDATE sample.account SET balance = balance + ? WHERE (id=?)";
        } else {
            sql = "UPDATE sample.account SET balance = balance - ? WHERE (id=?)";
        }
        try(PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setLong(1, money);
            preparedStatement.setInt(2, id);

            cnt = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return cnt == 1;
    }

    public Account selectOne(int id) {
        Account account = new Account();
        String sql = "SELECT * FROM sample.account WHERE id = ? ";
        try(PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setInt(1, id);
            try (ResultSet resultSet = preparedStatement.executeQuery()){
                if (resultSet.next()) {
                    account = new Account();
                    account.setId(resultSet.getInt("id"));
                    account.setName(resultSet.getString("name"));
                    account.setBalance(resultSet.getInt("balance"));
                }
            }
        }catch (SQLException e) {
            e.printStackTrace();
        }
        return account;
    }

    public ArrayList<Account> selectAll() {
        // 전체 정보 전달
        String sql = "SELECT * FROM sample.account";
        ArrayList<Account> list = new ArrayList<>();

        try (PreparedStatement preparedStatement = connection.prepareStatement(sql);
             ResultSet resultSet = preparedStatement.executeQuery()) {
            while (resultSet.next()) {
                Account account = new Account(resultSet.getInt("id"), resultSet.getString("name"),
                        resultSet.getInt("balance"));
                list.add(account);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

    public void disConnect() { // 연결 해제. 서비스 종료시에 사용
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}