ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 21-12-23 JDBC
    학원/DB 2021. 12. 23. 11:25

     

    VIEW 생성

     

    -> 조인 처럼 긴 SQL문장을 DAO 파일에 담기 어렵기 때문에 VIEW를 생성해서 처리하면 좋다

     

    CREATE OR REPLACE VIEW RENTDETAIL AS 
    SELECT TO_CHAR(A.RENTDATE, 'YYYY-MM-DD') AS RENTDATE, A.NUM AS RENTNUM, C.MEMBERNUM AS MEMBERNUM, C.NAME AS MEMBERNAME,
    B.RENTPRICE-A.DISCOUNT AS PRICE, B.NUM AS BOOKNUM, B.SUBJECT AS SUBJECT
    FROM RENTLIST A, BOOKLIST B, MEMBERLIST C 
    WHERE A.BOOKNUM=B.NUM AND A.MEMBERNUM = C.MEMBERNUM
    ORDER BY A.NUM DESC;
    
    SELECT * FROM RENTDETAIL;

     

     

     

    위처럼 VEIW를 만들면 DAO 파일 메서드 내에 SQL을 

     

    String sql = "SELECT TO_CHAR(A.RENTDATE, 'YYYY-MM-DD') AS RENTDATE, A.NUM AS RENTNUM, "+
    "C.MEMBERNUM AS MEMBERNUM, C.NAME AS MEMBERNAME, B.RENTPRICE-A.DISCOUNT AS PRICE, " +
    "B.NUM AS BOOKNUM,  B.SUBJECT AS SUBJECT FROM RENTLIST A, BOOKLIST B, MEMBERLIST C " +
    "WHERE A.BOOKNUM=B.NUM AND A.MEMBERNUM = C.MEMBERNUM "+
    "ORDER BY A.NUM DESC";

     

    String sql = "SELECT * FROM RENTDETAIL";

     

     

    위에서 아래와 같이 줄일 수 있다. 또 WHERE문을 덧붙여 검색 기능에 활용할 수 도 있다!

     

     

    전문 

     

    *DB connection, close용 클래스

    package jdbc05;
    
    import java.sql.*;
    
    public class DBManager {
    	static String driver = "oracle.jdbc.driver.OracleDriver";
    	static String url = "jdbc:oracle:thin:@localhost:1521:xe";
    	static String id = "scott";
    	static String pwd = "tiger";
    	
    	public static Connection getConnection() {
    		Connection conn = null;
    		try {
    			Class.forName(driver);
    			conn = DriverManager.getConnection(url, id, pwd);
    		} catch (ClassNotFoundException e) { e.printStackTrace();
    		} catch (SQLException e) { e.printStackTrace();
    		}
    		return conn; 
    	}
    	
    	public static void close(Connection con, PreparedStatement pstmt, ResultSet rs) {
    		try {
    			if(con!=null) con.close();
    			if(pstmt!=null) pstmt.close();
    			if(rs!=null) rs.close();
    		} catch (SQLException e) {e.printStackTrace();
    		}
    	}
    }

     

     

    *DTO

    public class RentDto {
    
    	private String rentdate;
    	private int num;
    	private int booknum;
    	private int membernum;
    	private int discount;
    	
    	public String getRentdate() {
    		return rentdate;
    	}
    	public void setRentdate(String rentdate) {
    		this.rentdate = rentdate;
    	}
    	public int getNum() {
    		return num;
    	}
    	public void setNum(int num) {
    		this.num = num;
    	}
    	public int getBooknum() {
    		return booknum;
    	}
    	public void setBooknum(int booknum) {
    		this.booknum = booknum;
    	}
    	public int getMembernum() {
    		return membernum;
    	}
    	public void setMembernum(int membernum) {
    		this.membernum = membernum;
    	}
    	public int getDiscount() {
    		return discount;
    	}
    	public void setDiscount(int discount) {
    		this.discount = discount;
    	}
    	
    }

     

     

    *DAO

    import java.sql.*;
    import java.util.ArrayList;
    
    import jdbc04.MemberDto;
    
    public class RentDao {
    
    	private RentDao() {}
    	private static RentDao itc = new RentDao();
    	public static RentDao getInstance() { return itc; }
    	//싱글턴 객체
    	
    	Connection con = null;
    	PreparedStatement pstmt = null;
    	ResultSet rs = null;
    	
    	public ArrayList<RentDto> select(){
    		ArrayList<RentDto> list = new ArrayList<>();
    		con = DBManager.getConnection();
    		String sql = "SELECT TO_CHAR(RENTDATE,'YYYY-MM-DD') AS RENTDATE, "
    				+ "NUM, BOOKNUM, MEMBERNUM, DISCOUNT FROM RENTLIST ORDER BY NUM DESC";
    		try {
    			pstmt = con.prepareStatement(sql);
    			rs = pstmt.executeQuery();
    			while(rs.next()) {
    				RentDto rdto = new RentDto();
    				//rentdate 필드 : Date 형식 => DTO의 rentDate : String으로 변환필요
    				//=> Select 문 안에서 to_Char() 함수 사용
    				rdto.setRentdate(rs.getString("rentdate"));
    				rdto.setNum(rs.getInt("num"));
    				rdto.setBooknum(rs.getInt("booknum"));
    				rdto.setMembernum(rs.getInt("membernum"));
    				rdto.setDiscount(rs.getInt("discount"));
    				list.add(rdto);
    			}
    		} catch (SQLException e) {e.printStackTrace();
    		} finally { DBManager.close(con, pstmt, rs);
    		}
    		return list;
    	}
    	
    	public boolean checkBooknum(int booknum) {
    		con = DBManager.getConnection();
    		boolean state = false;
    		String sql = "SELECT * FROM RENTLIST WHERE BOOKNUM = ?";
    		try {
    			pstmt = con.prepareStatement(sql);
    			pstmt.setInt(1, booknum);
    			rs = pstmt.executeQuery();
    			if(rs.next()) {
    				state = true;
    			}
    		} catch (SQLException e) {e.printStackTrace();
    		} finally { DBManager.close(con, pstmt, rs);
    		}
    		return state;
    	}
    	
    	public boolean checkMembernum(int membernum) {
    		con = DBManager.getConnection();
    		boolean state = false;
    		String sql = "SELECT * FROM RENTLIST WHERE MEMBERNUM = ?";
    		try {
    			pstmt = con.prepareStatement(sql);
    			pstmt.setInt(1, membernum);
    			rs = pstmt.executeQuery();
    			if(rs.next()) {
    				state = true;
    			}
    		} catch (SQLException e) {e.printStackTrace();
    		} finally { DBManager.close(con, pstmt, rs);
    		}
    		return state;
    	}	
    	
    	public int insert( RentDto rdto ){
    		int result = 0;
    		con = DBManager.getConnection();
    		String sql = "insert into rentlist values(sysdate, rent_seq.nextVal, ? , ? , ? )";
    		
    		try {
    			pstmt = con.prepareStatement(sql);
    			pstmt.setInt(1,  rdto.getBooknum() );
    			pstmt.setInt(2,  rdto.getMembernum() );
    			pstmt.setInt(3,  rdto.getDiscount() );
    			result = pstmt.executeUpdate();
    		} catch (SQLException e) { e.printStackTrace();
    		} finally {	DBManager.close( con, pstmt, rs ); }
    		return result;
    	}
    
    	
    	public RentDto getRent(int num) {
    		RentDto rdto = null;
    		con = DBManager.getConnection();
    		String sql = "SELECT TO_DATE(RENTDATE,'YYYY-MM-DD') AS RENTDATE, NUM, BOOKNUM,"
    				+ "MEMBERNUM, DISCOUNT FROM RENTLIST WHERE NUM = ?";
    		try {
    			pstmt = con.prepareStatement(sql);
    			pstmt.setInt(1, num);
    			rs = pstmt.executeQuery();
    			
    			if(rs.next()) {
    				rdto = new RentDto();
    				rdto.setRentdate(rs.getString("rentdate"));
    				rdto.setBooknum(rs.getInt("booknum"));
    				rdto.setMembernum(rs.getInt("membernum"));
    				rdto.setDiscount(rs.getInt("discount"));
    			}
    		} catch (SQLException e) {e.printStackTrace();
    		} finally { DBManager.close(con, pstmt, rs);
    		}
    		return rdto;
    	}
    	
    	public int update(RentDto rdto) {
    		int result = 0;
    		con = DBManager.getConnection();
    		String sql = "UPDATE RENTLIST SET RENTDATE=TO_DATE(''||?||'', 'YYYYMMDD'), BOOKNUM=?, MEMBERNUM=?, DISCOUNT=? WHERE NUM =?";
    		try {
    			pstmt = con.prepareStatement(sql);
    			
    			pstmt.setString(1, rdto.getRentdate());
    			pstmt.setInt(2, rdto.getBooknum());
    			pstmt.setInt(3, rdto.getMembernum());
    			pstmt.setInt(4, rdto.getDiscount());
    			pstmt.setInt(5, rdto.getNum());
    			
    			result = pstmt.executeUpdate();
    			
    		} catch (SQLException e) {e.printStackTrace();
    		} finally { DBManager.close(con, pstmt, rs);
    		}
    		return result;
    	}
    	
    	public int delete(int num) {
    		int result = 0;
    		con = DBManager.getConnection();
    		String sql = "DELETE FROM RENTLIST WHERE NUM = ?";
    		
    		try {
    			pstmt=con.prepareStatement(sql);
    			pstmt.setInt(1, num);
    			result = pstmt.executeUpdate();
    		} catch (SQLException e) {e.printStackTrace();
    		} finally { DBManager.close(con,pstmt,rs);		
    		}
    		
    		return result;
    	}
    
    	public ArrayList<RentDetailDto> selectAll() {
    		
    		ArrayList<RentDetailDto> list = new ArrayList<>();
    		con = DBManager.getConnection();
    		String sql = "SELECT * FROM RENTDETAIL";
    		
    		try {
    			pstmt=con.prepareStatement(sql);
    			rs = pstmt.executeQuery();
    			while(rs.next()) {
    				RentDetailDto rdto = new RentDetailDto();
    				rdto.setRentdate(rs.getString("rentdate"));
    				rdto.setRentnum(rs.getInt("rentnum"));
    				rdto.setMembernum(rs.getInt("membernum"));
    				rdto.setMembername(rs.getString("membername"));
    				rdto.setPrice(rs.getInt("price"));
    				rdto.setBooknum(rs.getInt("booknum"));
    				rdto.setSubject(rs.getString("subject"));
    				list.add(rdto);
    			}
    		} catch (SQLException e) {e.printStackTrace();
    		} finally { DBManager.close(con, pstmt, rs);
    		}
    		
    		return list;
    	}
    }

     

     

    *Driver

    package jdbc05;
    import java.util.ArrayList;
    import java.util.Scanner;
    public class RentDriver {
    	public static void main(String[] args) {
    	while(true){
    			Scanner sc = new Scanner(System.in);
    			System.out.println("\n---메뉴선택---");
    			System.out.print("1.데이터열람 2.데이터추가 3.데이터수정 4.데이터삭제");
    			System.out.print("5.데이터검색 6.프로그램 종료.>> 메뉴선택 : ");
    			String choice = sc.nextLine();
    			if(choice.equals("6")) break;
    			switch(choice) {
    				case"1": 
    					select();
    					break;
    				case"2": 
    					insert();
    					break;
    				case"3":
    					update();
    					break;
    				case"4": 
    					delete();
    					break;
    				case"5" :
    					selectAll();
    					break;
    					
    				default : System.out.println("메뉴 선택이 잘못되었습니다.");
    			}
    		}
    		System.out.println("프로그램을 종료합니다.");
    	}
    
    	private static void selectAll() {
    		Scanner sc = new Scanner(System.in);
    		RentDao rdao = RentDao.getInstance();
    		ArrayList<RentDetailDto> list = rdao.selectAll();
    		System.out.println("날짜\t\t번호\t회원번호\t성명\t\t대여금액\t도서번호\t도서제목");
    		System.out.println("------------------------------------------------------------------------------------------------------------------");
    		for(RentDetailDto dto : list) {
    			System.out.printf("%s\t%d\t%d\t\t%s\t\t%d\t\t%d\t\t%s\n", 
    					dto.getRentdate(), dto.getRentnum(), dto.getMembernum(), dto.getMembername(), dto.getPrice(), dto.getBooknum(), dto.getSubject()); 
    		}
    	}
    
    	private static void delete() {
    		Scanner sc = new Scanner(System.in);
    		RentDao rdao = RentDao.getInstance();
    		RentDto rdto = null;
    		
    		System.out.print("삭제할 대여 번호를 입력하세요 : ");
    		String input;
    		while(true) {
    			input = sc.nextLine();
    			if(input.equals("")) System.out.println("대여 번호 입력은 필수 입니다.");
    			else break;
    		}
    		
    		int num = Integer.parseInt(input);
    		rdto = rdao.getRent(num);
    		if(rdto == null) {
    			System.out.println("입력한 대여 번호가 존재하지 않습니다.");
    			return;
    		}
    		
    		int result = rdao.delete(num);
    		if(result==1) System.out.println("\n레코드 삭제 성공");
    		else System.out.println("\n레코드 삭제 실패");
    	}
    
    	private static void update() {
    		Scanner sc = new Scanner(System.in);
    		RentDao rdao = RentDao.getInstance();
    		RentDto rdto = null;
    		
    		//대여번호
    		System.out.print("수정할 대여 번호를 입력하세요 : ");
    		String input;
    		while(true) {
    			input = sc.nextLine();
    			if(input.equals("")) System.out.println("대여 번호 입력은 필수 입니다.");
    			else break;
    		}
    		
    		int num = Integer.parseInt(input);
    		rdto = rdao.getRent(num);
    		if(rdto == null) {
    			System.out.println("입력한 대여 번호가 존재하지 않습니다.");
    			return;
    		}
    		
    		//대여일
    		System.out.printf("수정할 날짜를 입력하세요(YYYY-MM-DD) (기존 대여일 : %s) : ", rdto.getRentdate());
    		String rentdate = sc.nextLine();
    		if(!rentdate.equals("")) rdto.setRentdate(rentdate);
    		
    		
    		//도서번호
    		System.out.printf("수정할 도서 번호를 입력하세요 (기존 도서 번호 : %d) : ", rdto.getBooknum());
    		int booknum = 0;
    		while(true) {
    			input = sc.nextLine();
    			if(input.equals("")) break; 
    			else {
    				booknum = Integer.parseInt(sc.nextLine());
    				boolean state = rdao.checkBooknum(booknum);
    				if (state) { rdto.setBooknum(booknum); break; }
    				else System.out.print("회원이 존재하지 않습니다. 다시 입력해 주세요 : ");
    				}
    		}
    
    		//회원번호
    		int membernum = 0;
    		System.out.printf("수정할 회원 번호를 입력하세요 (기존 회원 번호 : %d): ", rdto.getMembernum());
    		while(true) {
    			input = sc.nextLine();
    			if(input.equals("")) break; 
    			else {
    				membernum = Integer.parseInt(sc.nextLine());
    				boolean state = rdao.checkMembernum(membernum);
    				if (state==true) { rdto.setMembernum(membernum); break; }
    				else System.out.print("회원이 존재하지 않습니다. 다시 입력해 주세요 : ");
    			}
    		}
    		
    		//할인
    		System.out.printf("수정할 할인금액을 입력하세요 (기존 할인 금액 : %d) : ", rdto.getDiscount());
    		input = sc.nextLine();
    		if(!input.equals("")) rdto.setDiscount(Integer.parseInt(input));
    		
    		int result = rdao.update(rdto);
    		if(result==1) System.out.println("\n레코드 수정 성공");
    		else System.out.println("\n레코드 수정 실패");
    	}
    		
    	//삽입 메소드
    	private static void insert() {
    		Scanner sc = new Scanner(System.in);
    		RentDao rdao = RentDao.getInstance();
    		RentDto rdto = new RentDto();
    		
    		//rentdate는 오라클의 sysdate 또는 default 값을 이용 
    		//테이블 생성시 제약조건으로 설정되어 있으면 굳이 하지 않아도 됨
    		
    		System.out.print("대여할 도서의 번호를 입력하세요 : ");
    		int booknum = 0;
    		while(true) {
    			booknum = Integer.parseInt(sc.nextLine());
    			boolean state = rdao.checkBooknum(booknum);
    			if (state==true) break;
    			else System.out.print("도서가 존재하지 않습니다. 다시 입력해 주세요 : ");;
    		}
    		rdto.setBooknum(booknum);
    		
    		System.out.print("회원 번호를 입력하세요 : ");
    		int membernum = 0;
    		while(true) {
    			membernum = Integer.parseInt(sc.nextLine());
    			boolean state = rdao.checkMembernum(membernum);
    			if (state==true) break;
    			else System.out.print("회원이 존재하지 않습니다. 다시 입력해 주세요 : ");;
    		}
    		rdto.setMembernum(membernum);
    		
    		System.out.print("할인 금액을 입력하세요 : ");
    		String input = sc.nextLine();
    		int discount = 0;
    		if(!input.equals("")) discount = Integer.parseInt(input);
    		rdto.setDiscount(discount);
    		
    		int result = rdao.insert(rdto);
    		if(result==1) System.out.println("\n레코드 추가 성공");
    		else System.out.println("\n레코드 추가 실패");
    	}
    	
    	
    
    	//조회 메소드
    	private static void select() {
    		Scanner sc = new Scanner(System.in);
    		RentDao rdao = RentDao.getInstance();
    		ArrayList<RentDto> list = rdao.select();
    		System.out.println("날짜\t\t번호\t도서번호\t회원번호\t할인금액");
    		System.out.println("---------------------------------------------------------------------------");
    		for(RentDto dto : list) {
    			System.out.printf("%s\t%d\t%d\t\t%d\t\t%d\n", 
    					dto.getRentdate(), dto.getNum(), dto.getBooknum(), dto.getMembernum(), dto.getDiscount()); 
    		}
    		
    	}
    }

     

     

    update 가 에러는 안나고 계속 실패하는데 원인을 모르겠어서 나중에 수정 예정,,,, 

     

     

    ->> update set을 할 때 모든 컬럼 다 입력

     

     

     

     

     

    '학원 > DB' 카테고리의 다른 글

    2021-12-27 MySQL 내장함수, INSERT, CMD, JDBC  (0) 2021.12.27
    21-12-23 MySQL 설치, DDL  (0) 2021.12.23
    21-12-22 JDBC  (0) 2021.12.22
    21-12-21 JDBC  (0) 2021.12.21
    21-12-20 JDBC  (0) 2021.12.20

    댓글

Designed by Tistory.