-
[JDBC] DTO, DAODataBase/JDBC 2022. 9. 9. 15:58
DTO
-Data Tranfer Object 다른 말로 JAVA Bean.
-다수의 자료를 객체에 한번에 담아서 한번에 전송하기 위해 만들어진 클래스, 객체package JDBC03; public class BookDto { private int num; private String subject; private int makeyear; private int inprice; private int rentprice; private String grade; }
위 코드에서 마우스 우클릭 후 아래와 같이 Generate Getters and Setters... 클릭
Select All 클릭 후 Generate 클릭 아래와 같이 get, set 메서드가 생성됨
package JDBC03; public class BookDto { private int num; private String subject; private int makeyear; private int inprice; private int rentprice; private String grade; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public int getMakeyear() { return makeyear; } public void setMakeyear(int makeyear) { this.makeyear = makeyear; } public int getInprice() { return inprice; } public void setInprice(int inprice) { this.inprice = inprice; } public int getRentprice() { return rentprice; } public void setRentprice(int rentprice) { this.rentprice = rentprice; } public String getGrade() { return grade; } public void setGrade(String grade) { this.grade = grade; } }
DAO
-Database Access Object
-데이터베이스 접근(Access) 및 처리를 담당하는 클래스 객체
-CRUD(Create, Read, Update, Delete) 기본 멤버메서드가 존재
package JDBC03; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class BookDao { String driver="oracle.jdbc.OracleDriver"; String url="jdbc:oracle:thin:@localhost:1521:xe"; Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null; public ArrayList<BookDto> selectAll() { ArrayList<BookDto> list=new ArrayList<BookDto>(); // 테이블조회에서 rs의 내용을 list에 넣어줌 String sql="select*from booklist order by num desc"; try { Class.forName(driver); con=DriverManager.getConnection(url, "SCOTT", "tiger"); pstmt=con.prepareStatement(sql); rs=pstmt.executeQuery(); while(rs.next()) { // rs에서 필드별로 꺼내서 BookDto의 멤버변수에 하나씩 담음 // 이를 위해서 매반복마다 새로운 new BookDto()로 객체를 만듦 BookDto bdto=new BookDto(); bdto.setNum(rs.getInt("num")); bdto.setSubject(rs.getString("subject")); bdto.setMakeyear(rs.getInt("makeyear")); bdto.setInprice(rs.getInt("inprice")); bdto.setRentprice(rs.getInt("rentprice")); bdto.setGrade(rs.getString("grade")); // 다 담겨진 BookDto 객체는 list에 add됨 list.add(bdto); } } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (SQLException e) {e.printStackTrace(); } finally { try { if(con!=null) con.close(); if(pstmt!=null) pstmt.close(); if(rs!=null) rs.close(); } catch (SQLException e) {e.printStackTrace();} } return list; } public int insertRecord(BookDto bdto) { int result=0; String sql="insert into booklist values(book_seq.nextVal," + "?,?,?,?,?)"; try { Class.forName(driver); con=DriverManager.getConnection(url, "SCOTT", "tiger"); pstmt=con.prepareStatement(sql); pstmt.setString(1,bdto.getSubject()); pstmt.setInt(2,bdto.getMakeyear()); pstmt.setInt(3,bdto.getInprice()); pstmt.setInt(4,bdto.getRentprice()); pstmt.setString(5,bdto.getGrade()); result=pstmt.executeUpdate(); } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (SQLException e) {e.printStackTrace(); } finally { try { if(con!=null) con.close(); if(pstmt!=null) pstmt.close(); if(rs!=null) rs.close(); } catch (SQLException e) {e.printStackTrace();} } return result; } public BookDto getBook(int num) { BookDto bdto=null; String sql="select*from booklist where num=?"; try { Class.forName(driver); con=DriverManager.getConnection(url, "SCOTT", "tiger"); pstmt=con.prepareStatement(sql); pstmt.setInt(1, num); rs=pstmt.executeQuery(); if(rs.next()) { bdto=new BookDto(); bdto.setNum(rs.getInt("num")); bdto.setSubject(rs.getString("subject")); bdto.setMakeyear(rs.getInt("makeyear")); bdto.setInprice(rs.getInt("inprice")); bdto.setRentprice(rs.getInt("rentprice")); bdto.setGrade(rs.getString("grade")); } } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (SQLException e) {e.printStackTrace(); } finally { try { if(con!=null) con.close(); if(pstmt!=null) pstmt.close(); if(rs!=null) rs.close(); } catch (SQLException e) {e.printStackTrace();} } return bdto; } public int update(BookDto bdto) { int result=0; String sql="update booklist set subject=?, makeyear=?," +" inprice=?, rentprice=?, grade=? where num=?"; try { Class.forName(driver); con=DriverManager.getConnection(url, "SCOTT", "tiger"); pstmt=con.prepareStatement(sql); pstmt.setString(1,bdto.getSubject()); pstmt.setInt(2,bdto.getMakeyear()); pstmt.setInt(3,bdto.getInprice()); pstmt.setInt(4,bdto.getRentprice()); pstmt.setString(5,bdto.getGrade()); pstmt.setInt(6,bdto.getNum()); result=pstmt.executeUpdate(); } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (SQLException e) {e.printStackTrace(); } finally { try { if(con!=null) con.close(); if(pstmt!=null) pstmt.close(); if(rs!=null) rs.close(); } catch (SQLException e) {e.printStackTrace();} } return result; } public int delete(String num) { int result=0; String sql="delete from booklist where num=?"; try { Class.forName(driver); con=DriverManager.getConnection(url, "SCOTT", "tiger"); pstmt=con.prepareStatement(sql); pstmt.setInt(1, Integer.parseInt(num)); result=pstmt.executeUpdate(); } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (SQLException e) {e.printStackTrace(); } finally { try { if(con!=null) con.close(); if(pstmt!=null) pstmt.close(); if(rs!=null) rs.close(); } catch (SQLException e) {e.printStackTrace();} } return result; } }
Main 코드
package JDBC03; import java.util.ArrayList; import java.util.Scanner; public class BookMain { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(true) { System.out.println("\n---메뉴 선택---"); System.out.printf("1. 데이터열람 2. 데이터 추가 "); System.out.printf(" 3. 데이터 수정 4. 데이터 삭제 "); System.out.printf(" 5. 프로그램 종료. >> 메뉴선택: "); String choice=sc.nextLine(); if(choice.equals("5")) break; // 5를 입력하면 프로그램 종료됨 BookDao bdao=new BookDao(); // BookDao 객체를 생성 switch(choice) { case "1": select(bdao); break; case "2": insert(bdao); break; case "3": update(bdao); break; case "4": delete(bdao); break; default: System.out.println("메뉴 선택이 잘못되었음"); } } System.out.println("프로그램 종료"); } private static void delete(BookDao bdao) { Scanner sc=new Scanner(System.in); System.out.printf("삭제할 도서번호(필수): "); String num=sc.nextLine(); int result=bdao.delete(num); if(result==1) System.out.println("레코드 삭제 성공"); else System.out.println("레코드 삭제 실패"); } private static void update(BookDao bdao) { // 각 필드값을 입력받되, 입력된 내용이 있으면 그 값을 수정할 값으로 // 입력된 내용이 없으면 기존 값이 수정할 값으로 설정됨 Scanner sc=new Scanner(System.in); // 수정할 도서번호를 입력받음(입력안하고 엔터치면 다시 입력화면으로) int num=0; while(true) { System.out.printf("수정할 도서번호(필수): "); String input=sc.nextLine(); if(input.equals("")) System.out.println("도서번호 입력 필수"); else { num=Integer.parseInt(input); break; } } BookDto bdto=bdao.getBook(num); // 도서번호로 조회한 내용이 null이라면 // 해당도서가 없음이라고 출력하고 종료 if(bdto==null) { System.out.println("입력한 도서번호로 조회된 도서가 없음"); return; } // 수정할 도서가 조회가 되었다면 수정할 사항을 차례로 // 모두 입력할 화면을 제공하되 수정하지 않을 항목은 엔터만 입력받아 지나감 // 수정할 사항은 bdto에 업데이트함 // 차후에 bdto의 내용 레코드를 한번에 수정할 예정 // 도서제목 입력 System.out.printf("도서제목 입력(수정하지 않으려면 엔터 입력): "); String subject=sc.nextLine(); if(!subject.equals("")) bdto.setSubject(subject); // 출판년도 System.out.printf("출판년도 입력(수정하지 않으려면 엔터 입력): "); String makeyear=sc.nextLine(); if(!makeyear.equals("")) bdto.setMakeyear(Integer.parseInt(makeyear)); // 입고가격 System.out.printf("입고가격 입력(수정하지 않으려면 엔터 입력): "); String inprice=sc.nextLine(); if(!inprice.equals("")) bdto.setMakeyear(Integer.parseInt(inprice)); // 대여가격 System.out.printf("대여가격 입력(수정하지 않으려면 엔터 입력): "); String rentprice=sc.nextLine(); if(!rentprice.equals("")) bdto.setMakeyear(Integer.parseInt(rentprice)); // 등급 입력 System.out.printf("등급 입력(수정하지 않으려면 엔터 입력): "); String grade=sc.nextLine(); if(!grade.equals("")) bdto.setGrade(grade); // Dao에 BookDto를 보내서 해당 레코드를 수정함 int result=bdao.update(bdto); if(result==1) System.out.println("레코드 수정 성공"); else System.out.println("레코드 수정 실패"); } private static void insert(BookDao bdao) { // 각 값들을 입력받아서 BookDto에 저장하고 // BookDao의 insertRecord() 메서드에 전달인수로 전달 // BookDao bdao=new BookDao(); BookDto bdto=new BookDto(); Scanner sc=new Scanner(System.in); System.out.print("제목: "); // String subject=sc.nextLine(); // bdto.setSubject(subject); bdto.setSubject(sc.nextLine()); System.out.print("출판년도: "); bdto.setMakeyear(Integer.parseInt(sc.nextLine())); System.out.print("입고가격: "); bdto.setInprice(Integer.parseInt(sc.nextLine())); System.out.print("출고가격: "); bdto.setRentprice(Integer.parseInt(sc.nextLine())); System.out.print("등급: "); bdto.setGrade(sc.nextLine()); int result=bdao.insertRecord(bdto); if(result==1) System.out.println("레코드 추가 성공"); else System.out.println("레코드 추가 실패"); } public static void select(BookDao bdao) { // BookDao 객체 내의 selectAll 메서드를 호출하는데 // 그 메서드는 리턴값이 // 다수의 BookDto를 다수 품고있는 ArrayList형 자료 ArrayList <BookDto> bookDtoList=bdao.selectAll(); System.out.println("도서번호\t출판년도\t입고가격\t\t출고가격\t등급\t\t제목"); System.out.println("------------------------------------------------------------------"); // 리턴된 리스트를 반복실행문에 적용해서 // 레코드갯수만큼 반복실행함 for(BookDto bdto : bookDtoList) { System.out.printf("%d\t\t%d\t\t%d\t\t%d\t\t%s\t\t%s\n", bdto.getNum(),bdto.getMakeyear(), bdto.getInprice(),bdto.getRentprice(), bdto.getGrade(),bdto.getSubject()); } } }
코드 실행 결과
메뉴선택: 1 → select(bdao) 실행 메뉴선택: 2 → insert(bdao) 실행 메뉴선택: 3 → update(bdao) 실행 메뉴선택: 4 → delete(bdao) 실행 {"originWidth":773,"originHeight":195,"style":"alignCenter","caption":"메뉴 선택에 해당하지 않은 번호(1~5) 입력시 → 잘못 선택되었다고 안내 'DataBase > JDBC' 카테고리의 다른 글
[JDBC] singleton (0) 2022.09.09 [JDBC] 연습하기 (0) 2022.09.09 [JDBC] select, insert, update, delete (0) 2022.09.09 [JDBC] Java Database Connectivity (0) 2022.09.09