학원/DB

21-12-23 JDBC

링규 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을 할 때 모든 컬럼 다 입력