본문 바로가기
프로그래밍 언어/데이터베이스

데이터베이스 Day6 - Java + DB 연동(2)

by Hyeon_ 2021. 11. 25.

Java + DB 연동

실습

  • DBProject
    • DBConnect.java : DB 연결
    • BookSelectEx.java : DB 연결+ 해당 작업 수행
    • BookInsertEx.java : DB 연결+ 해당 작업 수행
    • BookInputInsert.java : DB 연결+ 해당 작업 수행
    • BookUpdateEx.java : DB 연결+ 해당 작업 수행
    • BookDeleteEx.java : DB 연결+ 해당 작업 수행
  • 프로젝트명: DBTest
  • 패키지명: db1
  • 클래스
    • DBConnecton.java
    • BookInsertEX.java
  • DBConnect 생성
package db1;

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

public class DBConnet {
    public static void main(String[] args) {
        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            Connection con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }

}
  • BookInsertEX.java 생성
package db1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;

public class BookSelectEx {
    public static void main(String[] args) {
        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            Connection con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

            // DB 연결 성공 후 SELECT 작업

            // SELECT 쿼리문 문자열 생성
            String sql = "select * from book order by bookNo";

            // 쿼리문 전송을 위한 PreparedStatement 객체 생성
            // Connection 인터페이스의 prepareStatement() 메소드를 사용하여 객체 생성
            PreparedStatement pstmt = con.prepareStatement(sql);

            // 쿼리문 실행시키고 결과 받아옴
            // select 구문이므로 excuteQuery() 메소드 사용
            // 반환되는 결과는 ResultSet 객체가 받음
            ResultSet rs = pstmt.executeQuery(sql);

            // 제목 출력
            System.out.println("\n도서 정보 조회");
            System.out.println("도서번호 \t\t\t 도서명 \t\t\t\t\t\t 저자 \t\t 가격 \t\t 발행일 \t 재고 \t 출판사번호");

            // executeQuery() 실행 결과 받아온 ResultSet에서 데이터 추출
            // ResultSet의 next() 메서드를 이용해서 논맂거 커서를 이동해 각 열의 데이터 바인딩해옴
            // next(): 커서를 이동하면 다ㅡㅇㅁ 행 지정
            // 다음 행이 있으면 true, 없으면 false 반환
            while(rs.next()) {
                // (1) 한 행씩 next 하면서 데이터를 가져와 변수에 저장
                String bookNo = rs.getString(1);
                String bookName = rs.getString(2);
                String bookAuthor = rs.getString(3);
                int bookPrice = rs.getInt(4);
                Date bookData = rs.getDate(5);
                int bookStock = rs.getInt(6);
                String pubNo = rs.getString(7);

                // (2) 한 행씩 변수 출력
                System.out.format("%-10s\t %-25s\t %-5s %10d %13s \t%3d %10s\n",
                        bookNo, bookName, bookAuthor, bookPrice, bookData, bookStock, pubNo);
            }

            // 모든 객체 close
            rs.close();
            pstmt.close();
            con.close();


        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }
}
  • BookInsertEx.java 생성
    • 코드에 값을 직접 넣은 형태
package db1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class BookInsertEx {
    public static void main(String[] args) {
        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            Connection con = DriverManager.getConnection(url, user, pwd);

            // DB 연결 완료

            // 저장할 데이터
            String bookNo = "1016";
            String bookName = "알고리즘";
            String bookAuthor = "김철수";
            int bookPrice = 25000;
            String bookDate = "2021-10-10";
            int bookStock = 10;
            String pubNo = "1";

            // sql문 작성
            String sql = "insert into book values(?,?,?,?,?,?,?)";

            // sql문 values 들어갈 (?) 데이터 설정
            // 쿼리문 전송을 위한 PreparedStatement 객체 생성
            // Connection 인터페이스의 prepareStatement() 메소드를 사용하여 객체 생성
            PreparedStatement pstmt = con.prepareStatement(sql);
            pstmt.setString(1,bookNo);
            pstmt.setString(2,bookName);
            pstmt.setString(3,bookAuthor);
            pstmt.setInt(4,bookPrice);
            pstmt.setString(5,bookDate);
            pstmt.setInt(6,bookStock);
            pstmt.setString(7,pubNo);

            // 쿼리문 실행 : 영향을 받은 행의 수 반환
            // select : executeQuery() - 결과 행 ResultSet반환
            // insert / update / delete : executeUadate() - 영향을 받은 행의 수 반환
            int result = pstmt.executeUpdate();

            // Connection 객체가 생성되면 DB 연결 성공
            if(result > 0) {
                System.out.println("데이터 입력 성공!");
            }

            pstmt.close();
            con.close();

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }
}
  • BookInsertEx.java 생성
    • Scanner를 통해 값을 받아오는 형태
package db1;

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

// 콘솔에서 데이터 입력 받아서 도서테이블에 저장
public class BookInsertInputEx {
    public static void main(String[] args) {
        // 입력
        Scanner scan = new Scanner(System.in);

        // 데이터 입력
        System.out.println("도서 정보 등록");
        System.out.println("-------------------------\n");

        System.out.print("도서번호 입력: ");
        String bookNo = scan.nextLine();

        System.out.print("도서명 입력: ");
        String bookName = scan.nextLine();

        System.out.print("저자 입력: ");
        String bookAuthor = scan.nextLine();

        System.out.print("가격 입력: ");
        int bookPrice = scan.nextInt();

        // 앞의 엔터 값이 다음 변수에 들어가지 않도록 읽어들임
        scan.nextLine();

        System.out.print("발행일 입력: ");
        String bookDate = scan.nextLine();

        System.out.print("재고 입력: ");
        int bookStock = scan.nextInt();

        // 앞의 엔터 값이 다음 변수에 들어가지 않도록 읽어들임
        scan.nextLine();

        System.out.print("출판사 번호 입력: ");
        String pubNo = scan.nextLine();;

        // DB 연동
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            Connection con = DriverManager.getConnection(url, user, pwd);

            // sql문 작성
            String sql = "insert into book values(?,?,?,?,?,?,?)";

            // sql문 values 들어갈 (?) 데이터 설정
            // 쿼리문 전송을 위한 PreparedStatement 객체 생성
            // Connection 인터페이스의 prepareStatement() 메소드를 사용하여 객체 생성
            PreparedStatement pstmt = con.prepareStatement(sql);
            pstmt.setString(1,bookNo);
            pstmt.setString(2,bookName);
            pstmt.setString(3,bookAuthor);
            pstmt.setInt(4,bookPrice);
            pstmt.setString(5,bookDate);
            pstmt.setInt(6,bookStock);
            pstmt.setString(7,pubNo);

            // 쿼리문 실행 : 영향을 받은 행의 수 반환
            // select : executeQuery() - 결과 행 ResultSet반환
            // insert / update / delete : executeUadate() - 영향을 받은 행의 수 반환
            int result = pstmt.executeUpdate();

            // Connection 객체가 생성되면 DB 연결 성공
            if(result > 0) {
                System.out.println("데이터 입력 성공!");
            }

            pstmt.close();
            con.close();
            scan.close();

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }

        // DB에 저장

    }
}
  • BookUpdateEx.java 생성
package db1;

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

public class BookUpdateEx {
    public static void main(String[] args) {
        // 입력
        Scanner scan = new Scanner(System.in);

        // 데이터 입력
        System.out.println("도서 정보 수정");
        System.out.println("-------------------------\n");

        System.out.print("수정할 도서번호 입력: ");
        String bookNo = scan.nextLine();

        System.out.print("도서명 입력: ");
        String bookName = scan.nextLine();

        System.out.print("저자 입력: ");
        String bookAuthor = scan.nextLine();

        System.out.print("가격 입력: ");
        int bookPrice = scan.nextInt();

        // 앞의 엔터 값이 다음 변수에 들어가지 않도록 읽어들임
        scan.nextLine();

        System.out.print("발행일 입력: ");
        String bookDate = scan.nextLine();

        System.out.print("재고 입력: ");
        int bookStock = scan.nextInt();

        // 앞의 엔터 값이 다음 변수에 들어가지 않도록 읽어들임
        scan.nextLine();

        System.out.print("출판사 번호 입력: ");
        String pubNo = scan.nextLine();

        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            Connection con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

            // DB 연결 완료

            // SQL 작성
            // 입련된 수정할 도서 번호로 찾아서 입력된 값으로 변경
            // 주의!! 기본키 변경 불가
            String sql = "update book set bookName=?, bookAuthor=?, bookPrice=?, " +
                    "bookDate=?, bookStock=?, pubNo=? where bookNo=?";

            // PreparedStatement 객체 생성
            // 쿼리문 전송을 위한 PreparedStatement 객체 생성
            // 데이터 설정 : UPDATE문 : UPDATE 테이블명 SET 열이름 = 값 WHERE 조건;
            PreparedStatement pstmt = con.prepareStatement(sql);
            pstmt.setString(1,bookName);
            pstmt.setString(2,bookAuthor);
            pstmt.setInt(3,bookPrice);
            pstmt.setString(4,bookDate);
            pstmt.setInt(5,bookStock);
            pstmt.setString(6,pubNo);
            pstmt.setString(7,bookNo);


            // 실행 쿼리문: 영향을 받은 행의 수 반환
            int result = pstmt.executeUpdate();

            // 결과 출력: 성공!
            if(result > 0){
                System.out.println("update 성공!!");
            }

            // 결과

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }
}
  • BookDeleteEx.java 생성
package db1;

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

public class BookDeleteEx {
    public static void main(String[] args) {
        // 입력
        Scanner scan = new Scanner(System.in);

        // 데이터 입력
        System.out.println("도서 정보 삭제");
        System.out.println("-------------------------\n");

        System.out.print("삭제할 도서번호 입력: ");
        String bookNo = scan.nextLine();

        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            Connection con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

            // DB 연결 완료
            // 도서 정보 삭제

            // SQL 작성
            String sql = "delete from book where bookNo=?";

            // PreparedStatement 객체 생성
            // 쿼리문 전송을 위한 PreparedStatement 객체 생성
            // 데이터 설정 : UPDATE문 : UPDATE 테이블명 SET 열이름 = 값 WHERE 조건;
            PreparedStatement pstmt = con.prepareStatement(sql);
            pstmt.setString(1,bookNo);


            // 실행 쿼리문: 영향을 받은 행의 수 반환
            int result = pstmt.executeUpdate();

            // 결과 출력: 성공!
            if(result > 0){
                System.out.println("delete 성공!!");
            }

            // 결과

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }
}

Statement Vs. PreparedStatement

  • 쿼리문 전송을 위한 객체 생성

Statement

  • 문자열로 구성된 SQL 문을 DBMS로 전송하면 내부적으로 SQL문을 JDBC 드라이버가 읽을 수 있는 형식으로 전처리 수행
  • SQL은 실행될 때마다 매번 전처리 작업 수행해야 하기 때문에 반복적인 작업에서 속도가 늦어질 수 있음
  • 쿼리문에 값이 미리 다 입력되어 있어야 함
  • 작성하는 SQL문이 복잡해진다는 단점 존재

PreparedStatement

  • Statement 인터페이스의 하위 인터페이스
  • SQL은 실행될 때마다 매번 전처리하지 않고 라이브러리 캐시에서 읽어와서 처리하기 때문에 처리 속도가 빠름
  • SQL문 구조는 같으나 조건이 수시로 변할 때 조건의 변수 처리를 '?'(placeholder)로 지정 - 바인딩 변수
  • 동일한 SQL문을 특정 값만 바꾸어서 여러 번 실행해야 할 때 또는 인수가 많아서 SQL 문이 복잡할 때 편리
  • 특징: 속도 빠르고 복잡하지 않다
  • 실무에서 주로 사용
  • 바인딩 변수의 순서는 ?의 순서에 의해 결정
  • 시작번호 1부터
  • 바인딩 변수에 값을 저장하기 위해서 setXXX() 메서드 사용
  • 주의!! 바인딩 변수는 반드시 열이름이 아닌 열의 값의 자리에 위치
  • values(?,?,?,?,?,?,?)

연습문제

  • db2 패키지 생성
  • product 테이블 사용 (sqldb2.product)
    • DBConnect
    • ProductSelect.java
    • ProductInsert.java
    • ProductInputInsert.java
    • ProductUpdate.java
    • ProductDelete.java

DTO / DAO 사용 - 과제 제출 형식

  • insert( ) / select( )

DTO (Data Transfer Object)

  • 데이터 저장용 클래스(멤버 변수에 데이터를 저장)
  • 데이터베이스에 데이터를 저장하거나 데이터베이스로부터 데이터를 조회할 때 데이터를 담아서 전달하기 위해 사용
  • 데이터 입력 -> DTO -> DAO(insert()로 전달) -> DB
  • 데이터 조회 -> DB -> DAO(select()로 데이터 읽어옴) -> DTO -> 출력 (또는 DTO에 담아서 출력 담당에게 전달)

DAO (Data Access Object)

  • 데이터에비스에 Access하는 클래스
  • 데이터베이스에 데이터를 저장하거나 데이터베이스에서 데이터를 가져올 때 사용
  • insert( ) / select( ) / update( ) / delete( ) 기능의 메서드 퐇ㅁ
  • DB 연결 (생성자)

실습

  • db3 패키지 생성

  • sqldb2.student 스키마 사용

  • 클래스 생성

    • StudentDTO.java
    • StudentDAO.java
    • StudentEx.java(main)
  • StudentDTO 생성

package db3;

public class StudentDTO {
    private String stdNo;
    private String stdName;
    private int stdYear;
    private String stdAddress;
    private String stdBirthday;
    private String dptNo;

    // 매개변수가 있는 생성자
    // 생성자는 StudentDTO 클래스 객체가 생성될 때 자동으로 호출되면서
    // 생성자의 매개변수 값을 받음
    public StudentDTO(String stdNo, String stdName, int stdYear, String stdAddress, String stdBirthday, String dptNo){
        this.stdNo = stdNo;
        this.stdName = stdName;
        this.stdYear = stdYear;
        this.stdAddress = stdAddress;
        this.stdBirthday = stdBirthday;
        this.dptNo = dptNo;
    }

    // getter/setter 생성
    // get: 멤버변수의 값을 반환해줄 때 사용
    // set: 멤버변수에 값을 저장할 때 사용
    public String getStdNo() {
        return stdNo;
    }

    public void setStdNo(String stdNo) {
        this.stdNo = stdNo;
    }

    public String getStdName() {
        return stdName;
    }

    public void setStdName(String stdName) {
        this.stdName = stdName;
    }

    public int getStdYear() {
        return stdYear;
    }

    public void setStdYear(int stdYear) {
        this.stdYear = stdYear;
    }

    public String getStdAddress() {
        return stdAddress;
    }

    public void setStdAddress(String stdAddress) {
        this.stdAddress = stdAddress;
    }

    public String getStdBirthday() {
        return stdBirthday;
    }

    public void setStdBirthday(String stdBirthday) {
        this.stdBirthday = stdBirthday;
    }

    public String getDptNo() {
        return dptNo;
    }

    public void setDptNo(String dptNo) {
        this.dptNo = dptNo;
    }
}
  • StudentDAO 생성
package db3;

//(1) 생성자에서 DB 연결
//(2) selectStudent() 메서드 : 데이터베이스의 student 테이블에서 select 한 결과 출력
//(3) insertStudent(StudentDTO dto) 메서드
//        - main()에서 입력한 student 데이터를 전달 받아서
//   - student 테이블에 insert 작업 수행

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class StudentDAO {
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    // 생성자 : 데이터베이스 연결
    public StudentDAO() {
        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            //Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb2?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }

    //(2) selectStudent() 메서드
    public void selectStudent() {

        try {
            // sql 직성
            String sql = "select * from student order by stdNo";
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery(sql);

            while(rs.next()) {
                String stdNo = rs.getString(1);
                String stdName = rs.getString(2);
                int stdYear = rs.getInt(3);
                String stdAddress = rs.getString(4);
                Date stdBirthday = rs.getDate(5);
                String dptNo = rs.getString(6);

                System.out.format("%-10s\t %-10s\t %-4d %-20s %13s %5s\n",
                        stdNo, stdName, stdYear, stdAddress, stdBirthday, dptNo);
            }

        } catch (Exception e) {
            System.out.println("오류 발생");
            e.printStackTrace();
        }
    }

    //(3) insertStudent(StudentDTO dto)
    public void insertStudent(StudentDTO dto) {
        try {
            // sql문 작성
            String sql = "insert into student values(?,?,?,?,?,?)";

            pstmt = con.prepareStatement(sql);
            pstmt.setString(1,dto.getStdNo());
            pstmt.setString(2,dto.getStdName());
            pstmt.setInt(3,dto.getStdYear());
            pstmt.setString(4,dto.getStdAddress());
            pstmt.setString(5,dto.getStdBirthday());
            pstmt.setString(6,dto.getDptNo());

            int result = pstmt.executeUpdate();

            if(result > 0) System.out.println("데이터 입력 성공");

        } catch (Exception e) {
            System.out.println("오류 발생");
            e.printStackTrace();
        }
    }
}
  • StudentEx 생성
package db3;

import java.util.Scanner;

public class StudentEx {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // DAO 객체 생성하면서 DB 연결
        // 객체 생성될 때 생성자 호출되면서 DB 연결
        StudentDAO stdDAO = new StudentDAO();

        // 학생 데이터 입력: stdentDAO 클래스의 insertStudetn() 메서드 호출
        System.out.println("학생 정보 등록");
        System.out.println("-------------------------\n");

        System.out.print("학번 입력: ");
        String stdNo = scan.nextLine();

        System.out.print("이름 입력: ");
        String stdName = scan.nextLine();

        System.out.print("학년 입력: ");
        int stdYear = scan.nextInt();

        scan.nextLine();

        System.out.print("주소 입력: ");
        String stdAddress = scan.nextLine();

        System.out.print("생일 입력: ");
        String stdBirthday = scan.nextLine();

        System.out.print("학과번호 입력: ");
        String dptNo = scan.nextLine();

        // StudentDTO 객체 생성
        // 생성과 동시에 갑 저장: 생성자 호출하면서 값 전달
        StudentDTO stdDTO = new StudentDTO(stdNo, stdName, stdYear, stdAddress, stdBirthday, dptNo);

        stdDAO.insertStudent(stdDTO);

        // 학생 정보 조회 : StudentDAO 클래스의 selectStudent() 메서드 호출하면서 stdDTO 전달


        //객체.메서드
        stdDAO.selectStudent();
    }
}

연습문제

  • db4 패키지 생성
  • product 테이블 사용
  • 클래스 생성
    • ProductDTO
    • ProductDAO
      • 생성자에서 DB 연결
      • insertProduct( ): 데이터 저장
      • selectProduct( ): 데이터 조회
    • ProductEx
      • 데이터 입력하고
      • insertProduct() 호출해서 데이터 저장
      • selectProduct() 호출해서 데이터 출력
  • ProductDTO 생성
package db4;

public class ProductDTO {
    private String prdNo;
    private String prdName;
    private int prdPrice;
    private String prdMaker;
    private String prdColor;
    private int ctgNo;


    public ProductDTO(String prdNo, String prdName, int prdPrice, String prdMaker, String prdColor, int ctgNo) {
        this.prdNo = prdNo;
        this.prdName = prdName;
        this.prdPrice = prdPrice;
        this.prdMaker = prdMaker;
        this.prdColor = prdColor;
        this.ctgNo = ctgNo;
    }

    public String getPrdNo() {
        return prdNo;
    }

    public void setPrdNo(String prdNo) {
        this.prdNo = prdNo;
    }

    public String getPrdName() {
        return prdName;
    }

    public void setPrdName(String prdName) {
        this.prdName = prdName;
    }

    public int getPrdPrice() {
        return prdPrice;
    }

    public void setPrdPrice(int prdPrice) {
        this.prdPrice = prdPrice;
    }

    public String getPrdMaker() {
        return prdMaker;
    }

    public void setPrdMaker(String prdMaker) {
        this.prdMaker = prdMaker;
    }

    public String getPrdColor() {
        return prdColor;
    }

    public void setPrdColor(String prdColor) {
        this.prdColor = prdColor;
    }

    public int getCtgNo() {
        return ctgNo;
    }

    public void setCtgNo(int ctgNo) {
        this.ctgNo = ctgNo;
    }
}
  • ProductDAO 생성
package db4;

import db3.StudentDTO;

import java.sql.*;
import java.util.Date;

public class ProductDAO {
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    public ProductDAO(){
        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            //Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb2?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }

    public void selectProduct() {
        try {
            String sql = "select * from product order by prdNo";
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery(sql);

            while(rs.next()) {
                String prdNo = rs.getString(1);
                String prdName = rs.getString(2);
                int prdPrice = rs.getInt(3);
                String prdMaker = rs.getString(4);
                String prdColor = rs.getString(5);
                int ctgNo = rs.getInt(6);

                System.out.format("%-10s\t %-10s\t %-4d %-20s %13s %5d\n",
                        prdNo, prdName, prdPrice, prdMaker, prdColor, ctgNo);
            }

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

    public void insertProduct(ProductDTO dto) {
        try {
            // sql문 작성
            String sql = "insert into product values(?,?,?,?,?,?)";

            pstmt = con.prepareStatement(sql);
            pstmt.setString(1,dto.getPrdNo());
            pstmt.setString(2,dto.getPrdName());
            pstmt.setInt(3,dto.getPrdPrice());
            pstmt.setString(4,dto.getPrdMaker());
            pstmt.setString(5,dto.getPrdColor());
            pstmt.setInt(6,dto.getCtgNo());

            int result = pstmt.executeUpdate();

            if(result > 0) System.out.println("데이터 입력 성공");

        } catch (Exception e) {
            System.out.println("오류 발생");
            e.printStackTrace();
        }
    }
}
  • ProductEX 생성
package db4;

import db3.StudentDAO;

import java.util.Scanner;

public class ProductEx {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        ProductDAO prdDAO = new ProductDAO();

        // 학생 데이터 입력: stdentDAO 클래스의 insertStudetn() 메서드 호출
        System.out.println("상품 정보 등록");
        System.out.println("-------------------------\n");

        System.out.print("상품 번호 입력: ");
        String prdNo = scan.nextLine();

        System.out.print("상품명 입력: ");
        String prdName = scan.nextLine();

        System.out.print("상품 가격 입력: ");
        int prdPrice = scan.nextInt();

        scan.nextLine();

        System.out.print("상품 브랜드 입력: ");
        String prdMaker = scan.nextLine();

        System.out.print("상품 색깔 입력: ");
        String prdColor = scan.nextLine();

        System.out.print("카테고리 번호 입력: ");
        int ctgNo = scan.nextInt();

        ProductDTO prdDTO = new ProductDTO(prdNo, prdName, prdPrice, prdMaker, prdColor, ctgNo);
        prdDAO.insertProduct(prdDTO);
        prdDAO.selectProduct();
    }
}