[Java] Java로 SQL CRUD 구현하기

2023. 3. 9. 20:11·Java/Base
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
반응형
저작자표시 비영리 변경금지 (새창열림)

'Java > Base' 카테고리의 다른 글

[Java] JSON  (0) 2023.03.15
[Java] Statement와 PreparedStatement  (1) 2023.03.12
[Java] Java와 MySQL 데이터베이스 연결하기  (0) 2023.03.09
[Java] 소켓 양방향 통신 구현  (0) 2023.03.04
[Java] 소켓 통신  (0) 2023.03.03
'Java/Base' 카테고리의 다른 글
  • [Java] JSON
  • [Java] Statement와 PreparedStatement
  • [Java] Java와 MySQL 데이터베이스 연결하기
  • [Java] 소켓 양방향 통신 구현
스응
스응
    반응형
    250x250
  • 스응
    이서영의 개발 블로그
    스응
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (385)
      • Java (134)
        • Base (54)
        • Spring Boot (37)
        • JSP (16)
        • Swing (GUI) (20)
        • Design Pattern (7)
      • C# (13)
      • PHP (18)
      • SQL (27)
      • Vue.js (9)
      • Tailwind CSS (4)
      • TypeScript (7)
      • HTML & CSS (27)
      • JavaScript (26)
      • jQuery (10)
      • Android (3)
      • - - - - - - - - - - - - - - (0)
      • Hotkeys (5)
      • CS (30)
      • IT Notes (13)
      • Error Notes (17)
      • Team Project (24)
        • Airlines Web Project (12)
        • University Web Project (6)
        • Strikers 1945 GUI Project (6)
      • My Project (18)
        • Library Web Project (8)
        • Pet Shopping Mall GUI Project (10)
      • etc. (0)
  • 블로그 메뉴

    • Home
    • Write
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    zapier
    java
    티스토리챌린지
    js
    SpringBoot
    C#
    면접
    cs
    Codeigniter
    Wordpress
    오블완
    tailwindcss
    jQuery
    jsp
    Swing
    git
    CSS
    vuejs
    errorNote
    SEO
    SQL
    HTML
    SWAGGER
    typeScript
    php
    Android
    개발일지
    Hotkeys
    http
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
스응
[Java] Java로 SQL CRUD 구현하기
상단으로

티스토리툴바