kr.s09.book
생성하고 table.sql
생성CREATE TABLE member(
me_num NUMBER PRIMARY KEY,
me_id VARCHAR2(10) UNIQUE NOT NULL,
me_passwd VARCHAR2(10) NOT NULL,
me_name VARCHAR2(30) NOT NULL,
me_phone VARCHAR2(13) NOT NULL,
me_regdate DATE DEFAULT SYSDATE NOT NULL
);
CREATE SEQUENCE member_seq;
CREATE TABLE book(
bk_num NUMBER PRIMARY KEY,
bk_name VARCHAR2(90) NOT NULL,
bk_category VARCHAR2(30) NOT NULL,
bk_regdate DATE DEFAULT SYSDATE NOT NULL
);
CREATE SEQUENCE book_seq;
CREATE TABLE reservation(
re_num NUMBER PRIMARY KEY,
re_status NUMBER(1) NOT NULL, /* 0. 미대출/반납, 1. 대출 중 */
bk_num NUMBER NOT NULL REFERENCES book (bk_num), /* 도서 번호 */
me_num NUMBER NOT NULL REFERENCES member (me_num), /* 회원 번호 */
re_regdate DATE DEFAULT SYSDATE NOT NULL, /* 대출일 */
re_modifydate DATE /* 반납일 */
);
CREATE SEQUENCE reservation_seq;
BookVO
생성package kr.s09.book;
import java.sql.Date;
public class BookVO {
private int bk_num; // 도서 번호
private String bk_name; // 도서명
private String bk_category; // 도서 분류
private Date bk_date; // 도서 등록일
public int getBk_num() {
return bk_num;
}
public void setBk_num(int bk_num) {
this.bk_num = bk_num;
}
public String getBk_name() {
return bk_name;
}
public void setBk_name(String bk_name) {
this.bk_name = bk_name;
}
public String getBk_category() {
return bk_category;
}
public void setBk_category(String bk_category) {
this.bk_category = bk_category;
}
public Date getBk_date() {
return bk_date;
}
public void setBk_date(Date bk_date) {
this.bk_date = bk_date;
}
}
MemberVO
생성package kr.s09.book;
import java.sql.Date;
public class MemberVO {
private int me_num; // 회원 번호
private String me_id; // 아이디
private String me_passwd; // 비밀번호
private String me_name; // 이름
private String me_phone; // 연락처
private Date me_regdate; // 가입일
public int getMe_num() {
return me_num;
}
public void setMe_num(int me_num) {
this.me_num = me_num;
}
public String getMe_id() {
return me_id;
}
public void setMe_id(String me_id) {
this.me_id = me_id;
}
public String getMe_passwd() {
return me_passwd;
}
public void setMe_passwd(String me_passwd) {
this.me_passwd = me_passwd;
}
public String getMe_name() {
return me_name;
}
public void setMe_name(String me_name) {
this.me_name = me_name;
}
public String getMe_phone() {
return me_phone;
}
public void setMe_phone(String me_phone) {
this.me_phone = me_phone;
}
public Date getMe_regdate() {
return me_regdate;
}
public void setMe_regdate(Date me_regdate) {
this.me_regdate = me_regdate;
}
}
BookDAO
생성package kr.s09.book;
import kr.s03.preparedstatement.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BookDAO {
// 도서 등록
public void insertBook(BookVO book) {
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "INSERT INTO book (bk_num, bk_name, bk_category) "
+ "VALUES (book_seq.NEXTVAL, ?, ?)";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터를 바인딩
pstmt.setString(1, book.getBk_name());
pstmt.setString(2, book.getBk_category());
// JDBC 수행 4단계 : SQL문을 실행해서 테이블에 행을 추가
int count = pstmt.executeUpdate();
System.out.println(count+"건의 도서를 등록했습니다.");
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(null, pstmt, conn);
}
}
// 도서 목록 보기
public void selectListBook() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "SELECT * FROM book LEFT OUTER JOIN (SELECT bk_num, re_status from reservation WHERE re_status=1)"
+ "USING(bk_num) ORDER BY bk_num DESC";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 결과 집합을 얻고 ResultSet에 담아서 반환
rs = pstmt.executeQuery();
System.out.println("번호\t분류\t\t등록일\t\t대출 여부\t도서명");
while(rs.next()) {
System.out.print(rs.getInt("bk_num")+"\t");
String bk_category = rs.getString("bk_category");
if(bk_category.length()>6) System.out.print(bk_category + "\t");
else System.out.print(bk_category + "\t\t");
System.out.print(rs.getDate("bk_regdate") + "\t");
if(rs.getInt("re_status")==0) { // re_status가 NULL일 경우, getInt() 메서드는 0으로 반환하고 getString() 메서드는 null로 반환
System.out.print("대출 가능\t");
}
else {
System.out.print("대출 중\t");
}
System.out.println(rs.getString("bk_name"));
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(rs, pstmt, conn);
}
}
// 대출 등록
public void insertReservation(ReservationVO reservation) {
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "INSERT INTO reservation (re_num, bk_num, me_num, re_status)"
+ "VALUES (reservation_seq.NEXTVAL, ?, ?, 1)";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터를 바인딩
pstmt.setInt(1, reservation.getBk_num());
pstmt.setInt(2, reservation.getMe_num());
// JDBC 수행 4단계 : SQL문을 실행해서 테이블에 행을 삽입
int count = pstmt.executeUpdate();
System.out.println(count + "권의 도서를 대출하였습니다.");
}
catch(Exception e) {
e.printStackTrace();
}
finally {
DBUtil.executeClose(null, pstmt, conn);
}
}
// 대출 여부 확인
public int getStatusReservation(int bk_num) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
int count = 0;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "SELECT re_status FROM book LEFT OUTER JOIN (SELECT * FROM reservation WHERE re_status=1)"
+ "USING(bk_num) WHERE bk_num=?";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터를 바인딩
pstmt.setInt(1, bk_num);
// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 대출 여부 조회
rs = pstmt.executeQuery();
if(rs.next()) { // 있는 도서 번호를 입력한 경우
count = rs.getInt(1); // re_status의 값을 반환; null일 경우 getInt() 메서드는 0을 반환
}
else { // 없는 도서 번호를 입력한 경우
count = -1;
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(rs, pstmt, conn);
}
return count;
}
// 반납 여부 체크
public int getStatusBack(int re_num, int me_num) {
int count = 0;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "SELECT re_status FROM reservation WHERE re_num=? AND me_num=?";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터를 바인딩
pstmt.setInt(1, re_num); // 대출 번호
pstmt.setInt(2, me_num); // 회원 번호
// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 반납 여부 체크
rs = pstmt.executeQuery();
if(rs.next()) {
count = rs.getInt(1);
}
else {
count = -1;
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(rs, pstmt, conn);
}
return count;
}
// 반납 처리
public void updateReservation(int re_num) {
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "UPDATE reservation SET re_status=0, re_modifydate=SYSDATE WHERE re_num=?";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터 바인딩
pstmt.setInt(1, re_num);
// JDBC 수행 4단계 : SQL문을 실행해서 테이블에 반납 처리
int count = pstmt.executeUpdate();
System.out.println(count + "권의 도서를 반납하였습니다.");
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(null, pstmt, conn);
}
}
// 대출 목록 보기
public void selectListReservation() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "SELECT re_num, me_id, bk_name, re_status, re_regdate, re_modifydate "
+ "FROM reservation JOIN book USING(bk_num) JOIN member USING(me_num) ORDER BY re_num DESC";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// JDBC 수행 4단계 : SQL문을 실행하고 테이블로부터 결과 집합을 얻어서 ResultSet에 담아 반환
rs = pstmt.executeQuery();
System.out.println("번호\t아이디\t도서명\t대출 여부\t대출일\t\t반납일");
while(rs.next()) {
System.out.print(rs.getInt("re_num") + "\t");
System.out.print(rs.getString("me_id") + "\t");
if(rs.getString("bk_name").length()>6) { // 도서명이 긴 경우 말줄임표 처리
System.out.print(rs.getString("bk_name").substring(0, 4) + "..\t");
}
else {
System.out.print(rs.getString("bk_name") + "\t");
}
if(rs.getInt("re_status")==0) {
System.out.print("반납\t");
}
else {
System.out.print("대출 중\t");
}
System.out.print(rs.getDate("re_regdate") + "\t");
if(rs.getDate("re_modifydate")==null) { // 반납하지 않았을 경우 null 대신 빈 문자열 출력
System.out.println();
}
else {
System.out.println(rs.getDate("re_modifydate"));
};
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(rs, pstmt, conn);
}
}
// 내 대출 목록
public void selectMyList(int me_num) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "SELECT re_num, bk_name, re_status, re_regdate, re_modifydate "
+ "FROM reservation JOIN book USING(bk_num) JOIN member USING(me_num)"
+ "WHERE me_num=? ORDER BY re_num DESC";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터를 바인딩
pstmt.setInt(1, me_num);
// JDBC 수행 4단계 : SQL문을 실행하고 테이블로부터 결과 집합을 얻어서 ResultSet에 담아 반환
rs = pstmt.executeQuery();
System.out.println("번호\t도서명\t대출 여부\t대출일\t\t반납일");
while(rs.next()) {
System.out.print(rs.getInt("re_num") + "\t");
if(rs.getString("bk_name").length()>6) { // 도서명이 긴 경우 말줄임표 처리
System.out.print(rs.getString("bk_name").substring(0, 4) + "..\t");
}
else {
System.out.print(rs.getString("bk_name") + "\t");
}
if(rs.getInt("re_status")==0) {
System.out.print("반납\t");
}
else {
System.out.print("대출 중\t");
}
System.out.print(rs.getDate("re_regdate") + "\t");
if(rs.getDate("re_modifydate")==null) { // 반납하지 않았을 경우 null 대신 빈 문자열 출력
System.out.println();
}
else {
System.out.println(rs.getDate("re_modifydate"));
};
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(rs, pstmt, conn);
}
}
// 회원 가입
public void insertMember(MemberVO member) {
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "INSERT INTO member (me_num, me_id, me_passwd, me_name, me_phone)"
+ "VALUES (member_seq.NEXTVAL, ?, ?, ?, ?)";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터를 바인딩
pstmt.setString(1, member.getMe_id());
pstmt.setString(2, member.getMe_passwd());
pstmt.setString(3, member.getMe_name());
pstmt.setString(4, member.getMe_phone());
// JDBC 수행 4단계 : SQL문을 실행해서 테이블에 행을 추가
int count = pstmt.executeUpdate();
System.out.println(count + "건의 회원 정보를 추가했습니다.");
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(null, pstmt, conn);
}
}
// 회원 목록
public void selectListMember() {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "SELECT * FROM member ORDER BY me_num DESC";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 결과 집합을 얻고 ResultSet에 담아서 반환
rs = pstmt.executeQuery();
System.out.println("번호\tID\t이름\t연락처\t\t가입일"); // 비밀번호의 경우 관리자 페이지에서도 노출하지 않는 것이 안전
while(rs.next()) {
System.out.print(rs.getInt("me_num")+"\t");
System.out.print(rs.getString("me_id") + "\t");
System.out.print(rs.getString("me_name")+"\t");
System.out.print(rs.getString("me_phone")+"\t");
System.out.println(rs.getDate("me_regdate"));
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(rs, pstmt, conn);
}
}
// 아이디 중복 체크
public int checkID(String me_id) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
int count = 0;
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "SELECT me_id FROM member WHERE me_id=?";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터를 바인딩
pstmt.setString(1, me_id);
// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 아이디를 조회
rs = pstmt.executeQuery();
if(rs.next()) { // me_id는 UNIQUE KEY이므로 최대 한 건만 반환
count = 1; // 1: 이미 있는 아이디, 0: 없는 아이디
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(rs, pstmt, conn);
}
return count;
}
// 로그인 체크
public int loginCheck(String me_id, String me_passwd) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
int me_num = 0; // 로그인이 가능하면 회원 번호 반환; me_num은 1부터 시작
try {
// JDBC 수행 1,2단계
conn = DBUtil.getConnection();
// SQL문 작성
sql = "SELECT me_num FROM member WHERE me_id=? AND me_passwd=?";
// JDBC 수행 3단계
pstmt = conn.prepareStatement(sql);
// ?에 데이터를 바인딩
pstmt.setString(1, me_id);
pstmt.setString(2, me_passwd);
// JDBC 수행 4단계 : SQL문을 실행해서 테이블로부터 회원 번호 구하기
rs = pstmt.executeQuery();
if(rs.next()) { // me_id는 UNIQUE KEY이므로 결과를 최대 한 건만 반환
me_num = rs.getInt(1);
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
// 자원 정리
DBUtil.executeClose(rs, pstmt, conn);
}
return me_num;
}
}
BookAdminMain
생성package kr.s09.book;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class BookAdminMain {
private BufferedReader br;
private BookDAO dao;
public BookAdminMain() {
dao = new BookDAO();
try {
br = new BufferedReader(new InputStreamReader(System.in));
callMenu();
}
catch(IOException e) {
e.printStackTrace();
}
finally {
if(br!=null) try {br.close();} catch(IOException e) {}
}
}
public void callMenu() throws IOException {
while(true) {
System.out.println("메뉴 : 1. 회원 목록, 2. 도서 등록, 3. 도서 목록, 4. 대출 목록, 5. 종료");
System.out.print("메뉴 > ");
try {
int menu = Integer.parseInt(br.readLine());
if(menu==1) { // 회원 목록
dao.selectListMember();
}
else if(menu==2) { // 도서 등록
BookVO vo = new BookVO();
System.out.print("도서명 > ");
vo.setBk_name(br.readLine());
System.out.print("분류 > ");
vo.setBk_category(br.readLine());
dao.insertBook(vo);
}
else if(menu==3) { // 도서 목록
dao.selectListBook();
}
else if(menu==4) { // 대출 목록
System.out.println("대출 내역");
dao.selectListReservation();
}
else if(menu==5) { // 종료
System.out.println("프로그램을 종료합니다.");
break;
}
else {
System.out.println("메뉴 번호를 잘못 입력했습니다!");
}
} catch (NumberFormatException e) {
System.out.println("숫자만 입력 가능합니다!");
}
}
}
public static void main(String[] args) {
new BookAdminMain();
}
}
BookUserMain
생성
ctrl
을 누른 채 메서드명에 커서를 올리면 메서드 선언부로 이동 가능package kr.s09.book;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class BookUserMain {
private BufferedReader br;
private BookDAO dao;
private boolean flag; // 로그인 여부
private int me_num; // 회원 번호
public BookUserMain() {
dao = new BookDAO();
try {
br = new BufferedReader(new InputStreamReader(System.in));
callMenu();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(br!=null) try {br.close();} catch(IOException e) {}
}
}
public void callMenu() throws IOException {
while(true) {
System.out.println("메뉴 : 1. 로그인, 2. 회원 가입, 3. 종료");
System.out.print("메뉴 > ");
try {
int menu = Integer.parseInt(br.readLine());
if(menu==1) { // 로그인
System.out.print("아이디 > ");
String me_id = br.readLine();
System.out.print("비밀번호 > ");
String me_passwd = br.readLine();
me_num = dao.loginCheck(me_id, me_passwd);
if(me_num!=0) {
System.out.println(me_id + "님 로그인되었습니다.");
flag = true;
break;
}
System.out.println("아이디 또는 비밀번호를 잘못 입력했습니다!");
}
else if(menu==2) { // 회원 가입
MemberVO vo = new MemberVO();
System.out.print("아이디 > ");
vo.setMe_id(br.readLine());
if(dao.checkID(vo.getMe_id())==1) { // 아이디 중복 체크
System.out.println("중복된 아이디입니다.");
continue; // 메뉴로 되돌아감
}
System.out.print("비밀번호 > ");
vo.setMe_passwd(br.readLine());
System.out.print("이름 > ");
vo.setMe_name(br.readLine());
System.out.print("연락처 > ");
vo.setMe_phone(br.readLine());
dao.insertMember(vo);
}
else if(menu==3) { // 종료
System.out.println("프로그램을 종료합니다.");
break;
}
else {
System.out.println("메뉴 번호를 잘못 입력했습니다!");
}
}
catch(NumberFormatException e) {
System.out.println("숫자만 입력 가능합니다!");
}
}
while(flag) { // 로그인시에만 동작
System.out.println("메뉴 : 1. 도서 목록, 2. 도서 대출하기, 3. 내 대출 목록, 4. 종료");
System.out.print("메뉴 > ");
try {
int menu = Integer.parseInt(br.readLine());
if(menu==1) { // 도서 목록
dao.selectListBook();
}
else if(menu==2) { // 도서 대출하기
System.out.println("도서 검색");
dao.selectListBook();
ReservationVO vo = new ReservationVO();
vo.setMe_num(me_num);
while(true) {
System.out.println("대출할 도서 번호를 입력하세요(입력 중지: 0)");
System.out.print("번호 > ");
vo.setBk_num(Integer.parseInt(br.readLine()));
if(vo.getBk_num()==0) break; // 메뉴로 되돌아가기
int reserved=dao.getStatusReservation(vo.getBk_num()); // 대출 여부 확인
if(reserved==1) {
System.out.println("대출 중인 도서는 신청할 수 없습니다.");
}
else if(reserved==-1) {
System.out.println("도서 번호를 잘못 입력했습니다.");
}
else {
dao.insertReservation(vo);
break;
}
}
}
else if(menu==3) { // 내 대출 목록
dao.selectMyList(me_num);
System.out.println("반납할 도서의 대출 번호를 입력하세요(입력 중지: 0)");
System.out.print("대출 번호 > ");
int re_num = Integer.parseInt(br.readLine());
if(re_num==0) continue; // 메뉴로 되돌아가기
int bk_status = dao.getStatusBack(re_num, me_num);
if(bk_status!=1) {
System.out.println("대출하지 않은 도서는 반납할 수 없습니다.");
continue; // 메뉴로 되돌아가기
}
dao.updateReservation(re_num);
}
else if(menu==4) { // 종료
System.out.println("프로그램을 종료합니다.");
break;
}
else {
System.out.println("메뉴 번호를 잘못 입력했습니다!");
}
}
catch (NumberFormatException e) {
System.out.println("숫자만 입력 가능합니다!");
}
}
}
public static void main(String[] args) {
new BookUserMain();
}
}
https://www.egovframe.go.kr/home/sub.do?menuNo=41
C:\javaWork\apps
로 이동C:\javaWork\apps\eGovFrameDev-3.10.0-64bit\workspace
로 변경ch15-jdbc
생성 후 Open Perspective 선택src
폴더 오른쪽 클릭하고 New-Other...-AmaterasERD-ER Diagram 선택하여 member.erd
생성TABLE_1
생성TABLE_1
을 더블 클릭하고, Logical Table Name을 회원 관리
, Physical Table Name을 member
로 변경회원 번호
, Physical Column Name을 num
, Type을 NUMBER - Numeric
으로 지정하고, Size 값 삭제하고 PK 체크 후 OKTABLE_2
생성TABLE_2
를 더블 클릭하고, Logical Table Name을 게시판
, Physical Table Name을 board
로 변경번호
, Physical Column Name을 bo_num
, Type을 NUMBER - Numeric
으로 지정하고, Size 값 삭제하고 PK 체크Reference
선택 후 board
와 member
를 차례로 클릭하여 FK 설정