본문 바로가기
Code/Console

[Java Code] Java로 SQL CRUD 구현하기

by 스응 2023. 3. 9.
728x90
728x90

  - DTO, DAO 설명 : https://young0105.tistory.com/125

 

#  사용된 인터페이스

  1) Connection

  2) Statement

  3) ResultSet

 


코드

#  DTO

public class BuyDTO {

    // 테이블 구조 확인하고 멤버변수 선언하기
    private String userName;
    private String productName;
    private int price;
    private int amount;

    // 생성자
    public BuyDTO(String userName, String productName, int price, int amount) {
        this.userName = userName;
        this.productName = productName;
        this.price = price;
        this.amount = amount;
    }

    // get 메서드 
    public String getUserName() {
        return userName;
    }

    public String getProductName() {
        return productName;
    }

    public int getPrice() {
        return price;
    }

    public int getAmount() {
        return amount;
    }
}

 

#  DAO가 사용할 인터페이스

public interface IBuyDAO {

    // 결과 집합을 반환함
    ArrayList<BuyDTO> select();

    // 적용된 레코드 수를 반환함
    int insert(BuyDTO buyDTO);

    // 적용된 레코드 수를 반환함
    int update(BuyDTO buyDTO, String targetUserName, String targetProductName);

    void delete(String targetUserName);

}

 

728x90

#  DAO

public class BuyDAO implements IBuyDAO {

    // DB에 연결
    DBClient dbClient;

    Connection conn;
    Statement stmt;
    ResultSet rs;

    public BuyDAO() {
        dbClient = DBClient.getInstance(); // DBClient 클래스는 싱글톤 패턴으로 구현함

        // 코드 축약하기
        // conn = dbClient.getConnection();을 메서드 내에서 반복하지 않고, 생성자에서 실행
        // DBClient 생성자에 conn = getConnection(); 추가해주면 가능
        conn = dbClient.getConnection(); 
    }


    // 전체 조회 기능
    @Override
    public ArrayList<BuyDTO> select() {
        // TIP : 반환할 데이터 타입으로 먼저 지역변수를 만들어 주고, return에 넣기
        ArrayList<BuyDTO> list = new ArrayList<>();

        try {
            stmt = conn.createStatement(); 
            rs = stmt.executeQuery("SELECT * FROM buytbl ");

            // 레코드 하나씩 반복
            while (rs.next()) {
                // rs.getString의 매개변수는 결과집합에 표시되는 컬럼명대로 !!!
                String userName = rs.getString("userName");
                String productName = rs.getString("productName");
                int price = rs.getInt("price");
                int amount = rs.getInt("amount");

                BuyDTO dto = new BuyDTO(userName, productName, price, amount);
                list.add(dto);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 최근에 사용한 것부터 close()
                rs.close();
                stmt.close();
                conn.close();

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return list;
    } // end of select method

    // 데이터 추가 기능
    @Override
    public int insert(BuyDTO dto) {
        int rowCount = 0;

        String sqlFormat = "INSERT INTO buytbl (userName, productName, price, amount) "
                            + "VALUES ('%s', '%s', %d, %d) ";
        String sql = String.format(sqlFormat, dto.getUserName(), dto.getProductName(), 
                                    dto.getPrice(), dto.getAmount());

        try {
            stmt = conn.createStatement();
            // DML을 사용할 때는 executeUpdate 메서드임에 유의!
            rowCount = stmt.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                stmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return rowCount;
    }

    // 값 갱신 기능
    @Override
    public int update(BuyDTO dto, String targetUserName, String targetProductName) {
        int rowCount = 0;

        String sqlFormat = "UPDATE buytbl SET productName = '%s', price = %d, amount = %d "
        + "WHERE userName = '%s' AND productName = '%s' ";
        String sql = String.format(sqlFormat, dto.getProductName(), dto.getPrice(), dto.getAmount(),
        targetUserName, targetProductName);

        try {
            // DML을 사용할 때는 executeUpdate 메서드임에 유의!
            stmt = conn.createStatement();
            rowCount = stmt.executeUpdate(sql);

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                stmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return rowCount;
    }

    @Override
    public void delete(String targetUserName) {
        String sqlFormat = " DELETE FROM buytbl WHERE userName = '%s' ";
        String sql = String.format(sqlFormat, targetUserName);

        try {
            // DML을 사용할 때는 executeUpdate 메서드임에 유의!
            stmt = conn.createStatement();
            stmt.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                stmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
} // end of class

 

#  Main

public static void main(String[] args) {
    int rowCount;

    // 생성자에 지정해놔서 DBClient 객체도 같이 생성됨
    BuyDAO buyDAO = new BuyDAO();

    // insert
    rowCount = buyDAO.insert(new BuyDTO("야스오", "책", 10, 3));
    System.out.println(rowCount);

    // update
    rowCount = buyDAO.update(new BuyDTO("홍길동", "책", 3000, 3), "홍길동", "책");
    System.out.println(rowCount);

    // delete
    buyDAO.delete("야스오");

    // select
    // select 결과를 list로 반환받음
    ArrayList<BuyDTO> list = buyDAO.select();

    // for each : 결과 집합 확인
    for (BuyDTO dto : list) {
        System.out.println("구매자 : " + dto.getUserName());
        System.out.println("상품 : " + dto.getProductName());
        System.out.println("개당 가격 : " + dto.getPrice());
        System.out.println("구매 수량 : " + dto.getAmount());
        System.out.println("========");
    }
} // end of main

 

320x100
반응형

댓글