ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JDBC] DTO, DAO
    DataBase/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

    댓글

Designed by Tistory.