DataBase/JDBC

[JDBC] DTO, DAO

hvoon 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) 입력시  → 잘못 선택되었다고 안내