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... 클릭


아래와 같이 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());
}
}
}
코드 실행 결과


