반응형
👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇
오늘은 과제를 제출하는 날
전날 조원들과 밤 9시부터 12시 까지 Zoom으로 숙제를 했다ㅎㅎ
얼굴은 안보이고 서로 화면을 공유해 가며 예외처리가 나는 부분, 에러가 나는 부분들을 같이 점검하며
코딩을 했는데 너무 즐거운 시간이었다 ㅎ_ㅎ
이번 조 친구들은 너도 나도 할 것 없이 서로 열심히 하려고 해서 너무 즐거운 프로젝트이다.
룰루랄라 오늘도 신나게 시작하며 룰루랄라 재밌게 출발해 본다 부릉부릉 🚗🚘
DB 뷰 쿼리 , 시퀀스 쿼리, 트리거 쿼리
DB INSERT 쿼리
------------------------------------------------------------------------------
-- DB - Member Insert
------------------------------------------------------------------------------
INSERT INTO Members VALUES( 'user1' , 'pass1' , '박재업' , 0 );
INSERT INTO Members VALUES( 'user2' , 'pass2' , '박성희' , 0 );
INSERT INTO Members VALUES( 'user3' , 'pass3' , '남미연' , 0 );
INSERT INTO Members VALUES( 'user4' , 'pass4' , '이수진' , 0 );
INSERT INTO Members VALUES( 'user5' , 'pass5' , '고은이' , 0 );
INSERT INTO Members VALUES( 'user6' , 'pass6' , '서지원' , 0 );
INSERT INTO Members VALUES( 'user7' , 'pass7' , '박미선' , 0 );
INSERT INTO Members VALUES( 'user8' , 'pass8' , '문종석' , 0 );
INSERT INTO Members VALUES( 'user9' , 'pass9' , '이성우' , 0 );
INSERT INTO Members VALUES( 'user10' , 'pass10' , '차선우' , 0 );
INSERT INTO Members VALUES( 'user11' , 'pass11' , '최성희' , 0 );
INSERT INTO Members VALUES( 'user12' , 'pass12' , '김도균' , 0 );
INSERT INTO Members VALUES( 'user13' , 'pass13' , '박춘규' , 0 );
INSERT INTO Members VALUES( 'user14' , 'pass14' , '고연숙' , 0 );
INSERT INTO Members VALUES( 'user15' , 'pass15' , '윤태욱' , 0 );
INSERT INTO Members VALUES( 'user16' , 'pass16' , '배창숙' , 0 );
INSERT INTO Members VALUES( 'user17' , 'pass17' , '배건우' , 0 );
INSERT INTO Members VALUES( 'user18' , 'pass18' , '배신웅' , 0 );
INSERT INTO Members VALUES( 'user19' , 'pass19' , '배윤식' , 0 );
INSERT INTO Members VALUES( 'user20' , 'pass20' , '김종원' , 0 );
INSERT INTO Members VALUES( 'user21' , 'pass21' , '강동호' , 0 );
INSERT INTO Members VALUES( 'user22' , 'pass22' , '최의정' , 0 );
INSERT INTO Members VALUES( 'user23' , 'pass23' , '신보경' , 0 );
INSERT INTO Members VALUES( 'user24' , 'pass24' , '김보라' , 0 );
INSERT INTO Members VALUES( 'user25' , 'pass25' , '윤보라' , 0 );
INSERT INTO Members VALUES( 'user26' , 'pass26' , '장보람' , 0 );
INSERT INTO Members VALUES( 'user27' , 'pass27' , '박보은' , 0 );
INSERT INTO Members VALUES( 'user28' , 'pass28' , '김성경' , 0 );
INSERT INTO Members VALUES( 'user29' , 'pass29' , '최원호' , 0 );
INSERT INTO Members VALUES( 'user30' , 'pass30' , '이연주' , 0 );
INSERT INTO Members VALUES( 'user31' , 'pass31' , '이민호' , 0 );
INSERT INTO Members VALUES( 'user32' , 'pass32' , '김태형' , 0 );
INSERT INTO Members VALUES( 'admin' , 'human' , '관리자' , 0 );
COMMIT;
------------------------------------------------------------------------------
-- DB - Review Insert
------------------------------------------------------------------------------
INSERT INTO Review VALUES( Review_no.NEXTval, '파견자들' ,'재밌어용 또 읽어보려구요1', 1 ,'user1' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '시대예보' ,'재밌어용 또 읽어보려구요2', 1 ,'user2' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '손실 없는 투자 원칙' ,'재밌어용 또 읽어보려구요3', 1 ,'user3' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '낮에 뜨는 달' ,'재밌어용 또 읽어보려구요4', 1 ,'user4' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '붉은 궁' ,'재밌어용 또 읽어보려구요5', 1 ,'user5' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '세이노의 가르침' ,'재밌어용 또 읽어보려구요6', 1 ,'user6' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '아침 그리고 저녁' ,'재밌어용 또 읽어보려구요7', 1 ,'user7' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역행자 ' ,'재밌어용 또 읽어보려구요8', 1 ,'user8' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '고통 구경하는 사회' ,'재밌어용 또 읽어보려구요9', 1 ,'user9' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '슈퍼노멀' ,'재밌어용 또 읽어보려구요10', 1 ,'user10' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '디케의 눈물' ,'재밌어용 또 읽어보려구요11', 1 ,'user11' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '최소한의 한국사' ,'재밌어용 또 읽어보려구요12', 1 ,'user12' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역사는 반복된다' ,'재밌어용 또 읽어보려구요13', 1 ,'user13' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '머니 트렌드' ,'재밌어용 또 읽어보려구요14', 1 ,'user14' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '단 한 사람' ,'재밌어용 또 읽어보려구요15', 1 ,'user15' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '멜랑콜리아' ,'재밌어용 또 읽어보려구요16', 1 ,'user16' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '무명의 감정들' ,'재밌어용 또 읽어보려구요17', 1 ,'user17' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '대화의 정석' ,'재밌어용 또 읽어보려구요18', 1 ,'user18' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '돈의 속성' ,'재밌어용 또 읽어보려구요19', 1 ,'user19' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '모순' ,'재밌어용 또 읽어보려구요20', 1 ,'user20' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '구의 증명' ,'재밌어용 또 읽어보려구요21', 1 ,'user21' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '아주 희미한 빛으로도' ,'재밌어용 또 읽어보려구요22', 1 ,'user22' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '파견자들' ,'재구매 예상각1', 1 ,'user23' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '시대예보' ,'재구매 예상각2', 1 ,'user24' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '손실 없는 투자 원칙' ,'재구매 예상각3', 1 ,'user25' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '낮에 뜨는 달' ,'재구매 예상각4', 1 ,'user26' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '붉은 궁' ,'재구매 예상각5', 1 ,'user27' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '세이노의 가르침' ,'재구매 예상각6', 1 ,'user28' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '아침 그리고 저녁' ,'재구매 예상각7', 1 ,'user29' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역행자 ' ,'재구매 예상각8', 1 ,'user30' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '고통 구경하는 사회' ,'재구매 예상각9', 1 ,'user31' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '슈퍼노멀' ,'재구매 예상각10', 1 ,'user32' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '디케의 눈물' ,'재구매 예상각11', 0 ,'user5' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '파견자들' ,'재구매 예상각12', 0 ,'user6' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '시대예보' ,'재구매 예상각13', 0 ,'user7' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '손실 없는 투자 원칙' ,'재구매 예상각14', 0 ,'user8' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '낮에 뜨는 달' ,'재구매 예상각15', 0 ,'user9' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '붉은 궁' ,'재구매 예상각16', 0 ,'user10' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '세이노의 가르침' ,'재구매 예상각17', 0 ,'user11' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '아침 그리고 저녁' ,'재구매 예상각18', 0 ,'user12' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역행자 ' ,'재구매 예상각19', 0 ,'user13' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '고통 구경하는 사회' ,'재구매 예상각20', 0 ,'user14' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '슈퍼노멀' ,'재구매 예상각21', 0 ,'user15' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '디케의 눈물' ,'재구매 예상각22', 0 ,'user16' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '최소한의 한국사' ,'재구매 예상각23', 0 ,'user17' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역사는 반복된다' ,'재구매 예상각24', 0 ,'user18' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '머니 트렌드' ,'재구매 예상각25', 0 ,'user19' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '단 한 사람' ,'재구매 예상각26', 0 ,'user20' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '멜랑콜리아' ,'이거보면 꿀잠자요1', 0 ,'user21' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '무명의 감정들' ,'이거보면 꿀잠자요2', 0 ,'user22' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '대화의 정석' ,'이거보면 꿀잠자요3', 0 ,'user23' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '돈의 속성' ,'이거보면 꿀잠자요4', 0 ,'user24' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '모순' ,'이거보면 꿀잠자요5', 0 ,'user21' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '구의 증명' ,'이거보면 꿀잠자요6', 0 ,'user22' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '아주 희미한 빛으로도' ,'이거보면 꿀잠자요7', 0 ,'user23' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '파견자들' ,'이거보면 꿀잠자요8', 0 ,'user24' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '시대예보' ,'이거보면 꿀잠자요9', 0 ,'user25' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '손실 없는 투자 원칙' ,'이거보면 꿀잠자요10', 0 ,'user26' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '낮에 뜨는 달' ,'이거보면 꿀잠자요11', 0 ,'user27' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '시대예보' ,'이거보면 꿀잠자요12', 0 ,'user28' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '손실 없는 투자 원칙' ,'이거보면 꿀잠자요13', 0 ,'user29' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '낮에 뜨는 달' ,'리뷰는 그만쓸래 1', 0 ,'user30' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '붉은 궁' ,'리뷰는 그만쓸래 2', 1 ,'user31' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '세이노의 가르침' ,'리뷰는 그만쓸래 3', 1 ,'user32' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '아침 그리고 저녁' ,'리뷰는 그만쓸래 4', 1 ,'user1' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역행자 ' ,'리뷰는 그만쓸래 5', 1 ,'user2' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '고통 구경하는 사회' ,'리뷰는 그만쓸래 6', 1 ,'user3' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '슈퍼노멀' ,'리뷰는 그만쓸래 7', 1 ,'user4' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '디케의 눈물' ,'리뷰는 그만쓸래 8', 1 ,'user5' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '최소한의 한국사' ,'리뷰는 그만쓸래 9', 1 ,'user6' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역사는 반복된다' ,'리뷰는 그만쓸래 10', 1 ,'user7' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '머니 트렌드' ,'리뷰는 그만쓸래 11', 1 ,'user8' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '단 한 사람' ,'리뷰는 그만쓸래 12', 1 ,'user9' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역사는 반복된다' ,'리뷰는 그만쓸래 13', 1 ,'user10' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역사는 반복된다' ,'리뷰는 그만쓸래 14', 1 ,'user11' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '최소한의 한국사' ,'리뷰는 그만쓸래 9', 1 ,'user6' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역사는 반복된다' ,'리뷰는 그만쓸래 10', 1 ,'user7' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '머니 트렌드' ,'리뷰는 그만쓸래 11', 1 ,'user8' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '단 한 사람' ,'리뷰는 그만쓸래 12', 1 ,'user9' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역사는 반복된다' ,'리뷰는 그만쓸래 13', 1 ,'user10' ,default );
INSERT INTO Review VALUES( Review_no.NEXTval, '역사는 반복된다' ,'리뷰는 그만쓸래 14', 1 ,'user11' ,default );
Test 쿼리작성
Class Diagram
DB에 Access 하기위한 드라이버와 커넥션 준비
package DAO;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class AccessDAO {
private final static String url = "jdbc:oracle:thin:@localhost:1521:XE";
private final static String username = "system";
private final static String pass = "oracle";
private static Connection conn = null;
private static PreparedStatement psmt = null;
private static AccessDAO self = null;
public static AccessDAO getInstance() {
if(self == null) {
self = new AccessDAO();
}
return self;
}
// 드라이버 로드
private AccessDAO() {
try {// 실행중에 발생하는 예외를 처리하여 프로그램 오류가 나지 않게 한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (Exception e) {
System.out.println("드라이버 로드 실패");// 가 코드에서 드라이버를 로드 못하면 실행
}
}
// 커넥션 시도 리턴값 : 성공/실패
public static boolean getConnection()
{
try {
conn = DriverManager.getConnection(url, username, pass);
return true;
} catch (Exception e) {
System.out.println("컨넥션 실패");
}
return false;
}
// 자원 반납 메서드정의
public static void resourcesClose(){
try {
if ( psmt != null ) psmt.close();
if ( conn != null ) conn.close();
}catch (Exception e){
System.out.println("자원 반납 예외발생");
}
}
/*
Getter && Setter Area
*/
public static Connection getConn() {
return conn;
}
}
DTO 정의
package DTO;
public class BookDTO {
private String book = null;
private String author = null;
private int rec = 0;
public int getRec() {
return rec;
}
public void setRec(int rec) {
this.rec = rec;
}
public String getBook() {
return book;
}
public void setBook(String book) {
this.book = book;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void bookPrt() {
System.out.println("책이름 : " + this.book + "\n저자 :" + this.author);
}
}
package DTO;
public class BookJoinReviewDTO {
private int rnum = 0;
private String book = null;
private String author = null;
private String id = null;
private String rText = null;
public BookJoinReviewDTO(){}
public int getRnum() {
return rnum;
}
public void setRnum(int rnum) {
this.rnum = rnum;
}
public String getBook() {
return book;
}
public void setBook(String book) {
this.book = book;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getrText() {
return rText;
}
public void setrText(String rText) {
this.rText = rText;
}
}
package DTO;
public class MembersDTO {
private String id = null;
private String pw = null;
private String name = null;
private int point = 0;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
}
package DTO;
public class ReviewDTO {
private int rnum = 0;
private String book = null;
private String rtext = null;
private int rec = 0;
private String id = null;
public int getRnum() {
return rnum;
}
public void setRnum(int rnum) {
this.rnum = rnum;
}
public String getBook() {
return book;
}
public void setBook(String book) {
this.book = book;
}
public String getRtext() {
return rtext;
}
public void setRtext(String rtext) {
this.rtext = rtext;
}
public int getRec() {
return rec;
}
public boolean setRec(int rec) {
if ( rec == 0 || rec == 1 ) {
this.rec = rec;
return true;
}
else System.out.println("추천은 1, 비추천은 0만 입력해주세요");
return false;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
DAO 정의
package DAO;
import DTO.BookDTO;
import DTO.BookJoinReviewDTO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class BookDAO {
// DB에 도서를 추가하는 메서드
public static void bookInsertDB(BookDTO BDTO) {
Boolean trueConn = AccessDAO.getConnection();
PreparedStatement psmt = null;
if (trueConn == true) {
Connection conn = AccessDAO.getConn();
try {
String sql = "insert into Book values (?,?,?)";
psmt = conn.prepareStatement(sql);
psmt.setString(1, BDTO.getBook());
psmt.setString(2, BDTO.getAuthor());
psmt.setInt(3, BDTO.getRec());
psmt.executeQuery();
System.out.println("도서명 : " + BDTO.getBook() + " 등록 완료 ");
} catch (Exception e) {
e.printStackTrace();
System.out.println("도서 등록 실패");
} finally {
AccessDAO.resourcesClose();
}
}
}
// DB에서 검색하고자 하는 도서를 키워드 Like 검색, 후기와 함께 서브쿼리 리턴값 반환
public static ArrayList<BookJoinReviewDTO> bookTitleSearch(String title) {
ArrayList<BookJoinReviewDTO> searchBookReview = new ArrayList<>();
Boolean trueConn = AccessDAO.getConnection();
PreparedStatement psmt = null;
ResultSet rs = null;
if (trueConn) {
try {
Connection conn = AccessDAO.getConn();
String sql = "SELECT * FROM ReviewAndBook WHERE book LIKE ? ORDER BY RNUM";
psmt = conn.prepareStatement(sql);
psmt.setString(1, "%" + title + "%");
rs = psmt.executeQuery();
while (rs.next()) {
BookJoinReviewDTO tmpBook = new BookJoinReviewDTO();
tmpBook.setRnum(rs.getInt("rnum"));
tmpBook.setBook(rs.getString("book"));
tmpBook.setAuthor(rs.getString("author"));
tmpBook.setId(rs.getString("id"));
tmpBook.setrText(rs.getString("rtext"));
searchBookReview.add(tmpBook);
}
return searchBookReview;
} catch (Exception e) {
e.printStackTrace();
System.out.println("검색 결과가 없습니다");
} finally {
AccessDAO.resourcesClose();
}
}
return null;
}
// DB 에서 도서 단건 검색 후 리턴 메서드
public static BookDTO searchBook(String searchBookTitle) {
Boolean trueConn = AccessDAO.getConnection();
PreparedStatement psmt = null;
ResultSet rs = null;
if (trueConn) {
try {
Connection conn = AccessDAO.getConn();
String sql = "select * from book where book=?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, searchBookTitle);
rs = psmt.executeQuery();
if (rs.next()) {
BookDTO bDTO = new BookDTO();
bDTO.setBook(rs.getString("book"));
System.out.println(bDTO.getBook() + "가 검색되었습니다.");
return bDTO;
} else {
System.out.println("검색하신 책이 없습니다.");
}
} catch (Exception e) {
System.out.println("select 오류");
e.printStackTrace();
} finally {
AccessDAO.resourcesClose();
}
}
return null;
}
// 등록된 책 이름만 DB에서 가져오는 메서드
public static ArrayList<BookDTO> allBookTitle() {
ArrayList<BookDTO> allTitle = new ArrayList<>();
PreparedStatement psmt = null;
ResultSet rs = null;
Boolean trueConn = AccessDAO.getConnection();
if (trueConn != null) {
try {
Connection conn = AccessDAO.getConn();
String sql = "SELECT * FROM Book ORDER BY book";
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
while (rs.next()) {
BookDTO bookDTO = new BookDTO();
bookDTO.setBook(rs.getString("book"));
bookDTO.setAuthor(rs.getString("author"));
bookDTO.setRec(rs.getInt("rec"));
allTitle.add(bookDTO);
}
return allTitle;
} catch (Exception e) {
e.printStackTrace();
System.out.println("오류발생");
} finally {
AccessDAO.resourcesClose();
}
}
return null;
}
}
package DAO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import DTO.MembersDTO;
public class MembersDAO {
// 회원이 정보를 조회 할때마다 DB에 있는 회원 포인트를 다시 읽어와서 갱신 후 출력해주는 메서드
public static MembersDTO newMemberP(String memberId) {
MembersDTO newMember = new MembersDTO();
PreparedStatement psmt = null;
ResultSet rs = null;
Boolean trueConn = AccessDAO.getConnection();
if (trueConn != null){
try {
Connection conn = AccessDAO.getConn();
String sql = "select * FROM Members WHERE id = ?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, memberId);
rs = psmt.executeQuery();
if (rs.next()) {
newMember.setId(rs.getString("id"));
newMember.setPw(rs.getString("pw"));
newMember.setName(rs.getString("name"));
newMember.setPoint(rs.getInt("point"));
return newMember;
}
} catch (Exception e) {
System.out.println("예외발생");
e.printStackTrace();
} finally {
AccessDAO.resourcesClose();
}
}
return null;
}
// DB에서 등록된 사용자인지 검증 후 사용자 정보를 리턴해주는 메서드
public MembersDTO serUser(String id, String pw) {
PreparedStatement psmt = null;
ResultSet rs = null;
Boolean trueConn = AccessDAO.getConnection();
if (trueConn) {
try {
Connection conn = AccessDAO.getConn();
String sql = "select * from members where id=? and pw=?";
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
psmt.setString(2, pw);
rs = psmt.executeQuery();
if (rs.next()) {
MembersDTO m = new MembersDTO();
m.setId(rs.getString("id"));
m.setPw(rs.getString("pw"));
m.setName(rs.getString("name"));
m.setPoint(rs.getInt("point"));
System.out.println("로그인이 완료되었습니다");
return m;
} else {
System.out.println("등록된 회원 정보가 없습니다");
return null;
}
} catch (Exception e) {
System.out.println("select 오류");
e.printStackTrace();
} finally {
AccessDAO.resourcesClose();
}
}
return null;
}
// 회원 가입시 DB에 전달하여 Members 테이블에 Insert처리 해주는 메서드
public MembersDTO memberAdd(MembersDTO tmpM) {
Boolean trueConn = AccessDAO.getConnection();
PreparedStatement psmt = null;
Connection conn = null;
if (trueConn) {
try {
conn = AccessDAO.getConn();
String sql = "insert into Members values (?,?,?,?)";
psmt = conn.prepareStatement(sql);
psmt.setString(1, tmpM.getId());
psmt.setString(2, tmpM.getPw());
psmt.setString(3, tmpM.getName());
psmt.setInt(4, tmpM.getPoint());
int resultInt = psmt.executeUpdate();
if (resultInt <= 0) {
System.out.println("중복된 ID입니다 , 다시 가입하세요 ");
return null;
} else {
System.out.println(tmpM.getName() + "님 회원가입 완료");
return tmpM;
}
} catch (Exception e) {
System.out.println("회원가입 오류");
e.printStackTrace();
} finally {
AccessDAO.resourcesClose();
}
}
System.out.println("커넥션오류");
return null;
}
}
package DAO;
import java.lang.reflect.Member;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import DTO.MembersDTO;
import DTO.ReviewDTO;
public class ReviewDAO {
// 리뷰 삭제 메서드
public static void reviewDel(int delReviewNum){
Boolean trueConn = AccessDAO.getConnection();
PreparedStatement psmt = null;
if (trueConn) {
try {
Connection conn= AccessDAO.getConn();
String sql = "delete from review where rnum=?";
psmt = conn.prepareStatement(sql);
psmt.setInt(1,delReviewNum);
int resultInt = psmt.executeUpdate();
System.out.println(resultInt + "건 삭제 성공");
} catch (Exception e) {
System.out.println("delete 오류");
e.printStackTrace();
} finally {
AccessDAO.resourcesClose();
}
}
}
// DB에 입력된 Review테이블에 rtext레코드를 수정하는 메서드
public void reviewMod(int rNum, String rtext) {
Boolean trueConn = AccessDAO.getConnection();
PreparedStatement psmt = null;
if (trueConn) {
try {
Connection conn= AccessDAO.getConn();
String sql = "update review set rtext=? where rnum=?";
psmt = conn.prepareStatement(sql);
psmt.setString(1,rtext);
psmt.setInt(2,rNum);
int resultInt = psmt.executeUpdate();
System.out.println(resultInt + "건 삽입 성공");
} catch (Exception e) {
System.out.println("UPDATE 오류");
e.printStackTrace();
} finally {
AccessDAO.resourcesClose();
}
}
}
// DB에 정의된 Review테이블에 insert처리 메서드
public void reviewAdd(ReviewDTO reviewDTO) {
Boolean trueConn = AccessDAO.getConnection();
PreparedStatement psmt = null;
if (trueConn) {
try {
Connection conn= AccessDAO.getConn();
String sql = "insert into Review values(Review_no.NEXTval,?,?,?,?,default)";
psmt = conn.prepareStatement(sql);
psmt.setString(1,reviewDTO.getBook());
psmt.setString(2,reviewDTO.getRtext());
psmt.setInt(3,reviewDTO.getRec());
psmt.setString(4,reviewDTO.getId());
int resultInt = psmt.executeUpdate();
System.out.println(resultInt + "건 삽입 성공");
} catch (Exception e) {
System.out.println("insert 오류");
e.printStackTrace();
} finally {
AccessDAO.resourcesClose();
}
}
}
// DB에 입력된 ID기준 리뷰목록을 DB에서 Select한 뒤 리턴해주는 메서드
public ArrayList<ReviewDTO> returnReviewId( String title, MembersDTO nowMember, int selnum) {
Boolean trueConn = AccessDAO.getConnection();
ArrayList<ReviewDTO> rlist = new ArrayList();
Connection conn = AccessDAO.getConn();
PreparedStatement psmt = null;
ResultSet rs = null;
String sql = null;
if (trueConn) {
try {
switch (selnum){
case 6 : // 정확한 도서명을 전달받아 select 결과 전달받음
sql = "select * from review where book=? and id = ? ORDER BY RNUM";
psmt = conn.prepareStatement(sql);
psmt.setString(1, title);
psmt.setString(2, nowMember.getId());
break;
default : // 로그인된 Id로 select하여 결과 전달
sql = "select * from review where id=? ORDER BY RNUM";
psmt = conn.prepareStatement(sql);
psmt.setString(1, nowMember.getId());
break;
}
rs = psmt.executeQuery(); // 결과 참조 가능하도록 연결
while(rs.next()) {
ReviewDTO rDTO = new ReviewDTO();
rDTO.setRnum(rs.getInt("rnum"));
rDTO.setBook(rs.getString("book"));
rDTO.setRtext(rs.getString("rtext"));
rDTO.setRec(rs.getInt("rec"));
rDTO.setId(rs.getString("id"));
rlist.add(rDTO);
}
return rlist;
} catch (Exception e) {
e.printStackTrace();
System.out.println("리뷰 조회 실패");
}
}
return null;
}
}
그 외 기능 소스코드
package funtion;
import DAO.MembersDAO;
import DAO.ReviewDAO;
import DTO.BookDTO;
import DTO.BookJoinReviewDTO;
import DTO.MembersDTO;
import DTO.ReviewDTO;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class Funtions {
private static Scanner in = new Scanner(System.in);
private static ArrayList<ReviewDTO> rList = null;
private static ReviewDAO rDAO = new ReviewDAO();
// 회원의 정보를 출력해주는 메서드
public void memberInfoPrt(MembersDTO tmpMember){
linePrt();
MembersDTO newMember = MembersDAO.newMemberP(tmpMember.getId());
System.out.println(" I D : " + newMember.getId());
System.out.println(" P W : " + newMember.getPw());
System.out.println(" N A M E : " + newMember.getName());
System.out.println("P O I N T : " + newMember.getPoint());
}
// 리뷰에 대한 정보를 출력해주는 메서드
public static void reviewPrt(MembersDTO nowMember, int selnum) {
try {
switch ( selnum ){
case 6 :
// 정확한 도서명을 입력받아 DB에서 select 결과 rList에 대입 , 출력
String str = OutText("책 제목");
rList = rDAO.returnReviewId(str, nowMember, selnum);
break;
default :
// 로그인된 id가 등록한 리뷰에 대해 DB에서 select 결과를 rList에 대입 , 출력
rList = rDAO.returnReviewId(null, nowMember,selnum);
break;
}
if (rList.size() != 0) {
Iterator var3 = rList.iterator();
while (var3.hasNext()) {
ReviewDTO list = (ReviewDTO) var3.next();
linePrt1();
System.out.println(String.format("%10s", "✧ 리뷰 번호 : ") + list.getRnum());
System.out.println(String.format("%10s", "✧ 추천 수 : ") + list.getRec());
System.out.println(String.format("%10s", "✧ 도서 명 : ") + list.getBook());
System.out.println(String.format("%10s", "✧ 리뷰 내용 : ") + list.getRtext());
}
}
} catch ( Exception e ){
System.out.println("예외발생");
}
}
// DB결과 : 도서명별 리뷰정보와 도서정보를 서브쿼리로 출력
// 해당 내용을 매개변수로 전달받아 출력해주는 메서드
public void prtBookNReview(ArrayList<BookJoinReviewDTO> bjrtmp){
for (BookJoinReviewDTO tmpBook : bjrtmp) {
linePrt1();
System.out.println(String.format("%20s", "리뷰 번호 : ") + tmpBook.getRnum());
System.out.println(String.format("%20s", "도서 명 : ") + tmpBook.getBook());
System.out.println(String.format("%20s", "저서 명 : ") + tmpBook.getAuthor());
System.out.println(String.format("%20s", "리뷰 ID : ") + tmpBook.getId());
System.out.println(String.format("%20s", "리뷰 내용 : ") + tmpBook.getrText());
}
}
// 등록된 책 정보만 전체 출력해주는 메서드
public void prtTitle(ArrayList<BookDTO> allTitle){
for (BookDTO tmpBook : allTitle) {
System.out.print(String.format("%10s", "✧ 도서 명 : ") + String.format("%-20s" , tmpBook.getBook()));
System.out.println();
System.out.print("∘₊✧──────────────────────────✧₊∘✧ 작가 명 : " + String.format("%-10s" , tmpBook.getAuthor()));
System.out.print(String.format("%-5s", "✧ 추천 수 : ") + String.format("%-10s" , tmpBook.getRec()));
System.out.println();
}
}
// 입력된 문자열을 리턴해주는 메서드
public static String OutText(String text) {
System.out.print("\t" + text + " 입력 >> ");
return in.nextLine();
}
public void linePrt(){
System.out.println("∘₊✧──────────────────────────✧₊∘ Information ∘₊✧──────────────────────────✧₊∘");
}
public static void linePrt1(){
System.out.println("∘₊✧──────────────────────────✧₊∘ Description ∘₊✧──────────────────────────✧₊∘");
}
}
관리자 전용 화면 클래스
package membershipRounge;
import DAO.BookDAO;
import DAO.ReviewDAO;
import DTO.BookDTO;
import DTO.BookJoinReviewDTO;
import funtion.Funtions;
import java.util.ArrayList;
public class Admin {
private ArrayList<BookJoinReviewDTO> bookJoinReviewDTOS = null;
private Funtions fn = new Funtions();
private static Admin self = null;
private Admin() {
}
// 관리자 객체를 싱글톤으로 하기 위한 인스턴스 메서드
public static Admin getInstanse() {
if (self == null) self = new Admin();
return self;
}
// 관리자 메뉴를 선택할 수 있는 메서드
public void adminInfo() {
while (true) {
fn.linePrt();
AdminInfo();
int sel = Integer.parseInt(fn.OutText("메뉴"));
if (sel == 1) addBook();
if (sel == 2) delReview();
if (sel == 3) break;
}
}
// 리뷰 삭제 메서드
// 관리자는 모든 책의 리뷰를 삭제할 수 있다
private void delReview() {
fn.linePrt();
System.out.println("리뷰 삭제 메뉴 입니다");
System.out.println("리뷰를 삭제할 도서명을 검색해주세요");
String delbookTitle = fn.OutText("키워드");
bookJoinReviewDTOS = BookDAO.bookTitleSearch(delbookTitle);
if (bookJoinReviewDTOS != null) {
fn.prtBookNReview(bookJoinReviewDTOS);
int delNum = Integer.parseInt(fn.OutText("삭제 리뷰번호"));
for (BookJoinReviewDTO tmp : bookJoinReviewDTOS) {
if (tmp.getRnum() == delNum) {
ReviewDAO.reviewDel(delNum);
break;
}
}
} else System.out.println("초기화면으로 이동합니다");
}
// 책 등록 메서드
private void addBook() {
fn.linePrt();
System.out.println("책 등록 메뉴 입니다");
BookDTO bookDTO = new BookDTO();
bookDTO.setBook(fn.OutText("책 이름"));
bookDTO.setAuthor(fn.OutText("작가 이름"));
BookDAO.bookInsertDB(bookDTO);
}
// 관리자 로그인시 info 출력 메서드
private void AdminInfo() {
System.out.println("관리자 메뉴입니다");
System.out.println("1. 책 등록");
System.out.println("2. 리뷰 삭제");
System.out.println("3. 로그아웃");
}
}
비회원 전용 화면 클래스
package infoDesk;
import java.util.ArrayList;
import DAO.BookDAO;
import DTO.BookDTO;
import DTO.BookJoinReviewDTO;
import funtion.Funtions;
public class NoMember {
private Funtions fn = new Funtions();
// 비회원 전용 클래스
public NoMember() {
boolean flag = true;
while (flag) {
info();
int sel = Integer.parseInt(fn.OutText("번호"));
switch (sel) {
case 1: // 등록된 책 이름 전체보기
AllBookTitle();
break;
case 2: // 책 이름별 리뷰 전체보기
bookTitleSearch();
break;
case 3:
System.out.println("초기 화면으로 돌아갑니다");
flag = false;
break;
default:
System.out.println("없는 메뉴 번호입니다");
}
}
}
// 책 이름별 리뷰 전체보기
private void bookTitleSearch() {
System.out.println("리뷰 조회 도서명");
String selBookTitle = fn.OutText("키워드");
ArrayList<BookJoinReviewDTO> bookJoinReviewDTO = BookDAO.bookTitleSearch(selBookTitle);
if ( bookJoinReviewDTO != null ) fn.prtBookNReview(bookJoinReviewDTO);
else System.out.println("조회된 내용이 없습니다.");
}
// 등록된 책 이름 전체보기
private void AllBookTitle() {
System.out.println("현제 등록된 책 목록입니다");
ArrayList<BookDTO> allTitle = BookDAO.allBookTitle();
fn.linePrt();
fn.prtTitle(allTitle);
}
// 비회원 전용 info 메뉴
private void info() {
System.out.println("비회원 전용 화면입니다");
System.out.println("1. 등록된 책 이름 전체보기");
System.out.println("2. 책 이름별 리뷰 전체보기");
System.out.println("3. 초기화면 돌아가기");
}
}
회원 로그인 후 선택 메뉴 및 회원 전용 화면 클래스
package membershipRounge;
import DAO.BookDAO;
import DAO.ReviewDAO;
import DTO.BookDTO;
import DTO.MembersDTO;
import DTO.ReviewDTO;
import funtion.Funtions;
import java.util.ArrayList;
public class MemberMain {
private static MemberMain self = null;
private static Funtions fn = new Funtions();
private static MembersDTO nowMember = null;
private static ReviewDAO rDAO = new ReviewDAO();
private static ArrayList<ReviewDTO> rList = new ArrayList<>();
public static MemberMain getInstance() {
if (self == null) {
self = new MemberMain();
}
return self;
}
private MemberMain() {
}
public void info(MembersDTO member) {
this.nowMember = member;
boolean flag = true;
while (flag) {
fn.linePrt();
System.out.println("1. 내 정보 조회 ");
System.out.println("2. 리뷰 등록 ");
System.out.println("3. 리뷰 수정 ");
System.out.println("4. 리뷰 삭제 ");
System.out.println("5. 리뷰 전체 보기 ");
System.out.println("6. 도셔명 리뷰 검색 ");
System.out.println("7. 로그 아웃 ");
int sel = Integer.parseInt(fn.OutText("메뉴"));
switch (sel) {
case 1: // 내 정보 조회
myPointSearch();
break;
case 2: // 리뷰 등록
addReview();
break;
case 3: // 리뷰 수정
editReview(sel);
break;
case 4: // 리뷰 삭제
deleteReview(sel);
break;
case 5: // 리뷰 전체 보기
allReviewShow(sel);
break;
case 6: // 도서명 리뷰 검색
titleSearchReview(sel);
break;
case 7:
System.out.println("로그아웃 진행합니다 . 감사합니다");
flag = false;
break;
default:
System.out.println("잘 못 입력 하셨습니다. 다시 입력해주세요");
}
}
}
// 메뉴번호 6번 : 도서명 기준으로 모든 리뷰를 검색하는 메서드
private static void titleSearchReview(int selnum) {
fn.linePrt();
System.out.println("도서명 리뷰검색 입니다.");
fn.reviewPrt(nowMember, selnum);
}
// 로그인된 회원 기준으로 해당 회원이 등록한 리뷰만 전베보기하는 메서드
private static void allReviewShow(int selnum) {
fn.linePrt();
System.out.println("전체보기입니다.");
fn.reviewPrt(nowMember, selnum);
}
// 로그인된 회원 기준으로 해당 회원이 등록한 리뷰만 삭제하는 메서드
private static void deleteReview(int selnum) {
fn.linePrt();
System.out.println("리뷰 삭제 입니다.");
System.out.println(nowMember.getName() + "님의 리뷰 내역 입니다.");
fn.reviewPrt(nowMember, selnum);
int delReview = Integer.parseInt(fn.OutText("삭제 리뷰 번호"));
editSelDel(delReview, selnum);
}
// 로그인된 회원 기준으로 해당 회원의 리뷰만 수정하는 메서드
private static void editReview(int selnum) {
fn.linePrt();
System.out.println("리뷰 수정 입니다.");
System.out.println(nowMember.getName() + "님의 리뷰 내역 입니다.");
fn.reviewPrt(nowMember, selnum);
int modReview = Integer.parseInt(fn.OutText("수정 리뷰 번호"));
editSelDel(modReview, selnum);
}
// 로그인한 회원 기준으로 리뷰 등록 하는 메서드
private static void addReview() {
ReviewDTO rDTO = new ReviewDTO();
fn.linePrt();
System.out.println("리뷰 등록 입니다.");
System.out.println("책 제목을 검색해 주세요");
String bookTitle = fn.OutText("책 제목");
BookDTO bDTO = BookDAO.searchBook(bookTitle);
if (bDTO != null) {
rDTO.setBook(bookTitle);
if (rDTO != null) {
rDTO.setRtext(fn.OutText("리뷰 "));
System.out.println("0. 추천안함 / 1. 추천함");
rDTO.setRec(Integer.parseInt(fn.OutText("번호")));
rDTO.setId(nowMember.getId());
rDAO.reviewAdd(rDTO);
}
} else
System.out.println("입력한 도서명은 등록되지 않았습니다. 관리자에게 문의하세요");
}
// 로그인된 회원 기준에 회원 정보를 출력하는 메서드
private static void myPointSearch() {
fn.memberInfoPrt(nowMember);
}
// 수정 삭제 실제 처리메서드에 전달
// int selnum = 3 (수정) or 4(삭제)
private static void editSelDel(int rnum, int selnum) {
rList = rDAO.returnReviewId(null, nowMember, selnum);
try {
if (rList != null) {
ReviewDTO editReview = null;
for (ReviewDTO review : rList) {
if (review.getRnum() == rnum) {
editReview = review;
break;
}
}
switch (selnum) {
case 3:
rDAO.reviewMod(editReview.getRnum(), fn.OutText("수정할 리뷰내용"));
break;
case 4:
rDAO.reviewDel(editReview.getRnum());
break;
}
} else System.out.println("해당 리뷰번호는 찾을 수 없습니다");
} catch ( Exception e ){
System.out.println("\t\t !! 예외발생 !! \t\t");
}
}
}
프로그램 시작 후 첫 메뉴 실행 클래스
package infoDesk;
import DAO.AccessDAO;
import DAO.MembersDAO;
import DTO.MembersDTO;
import funtion.Funtions;
import membershipRounge.Admin;
import membershipRounge.MemberMain;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
// todo : 프로그램 시작 후 메뉴선택 클래스
public class Info {
// 회원 멤버리스트
private MembersDTO member = null;
private MemberMain memberMain = MemberMain.getInstance();
private Admin adminSelf = Admin.getInstanse();
private AccessDAO driver = AccessDAO.getInstance();
private Funtions fn = new Funtions();
private MembersDAO dao = new MembersDAO();
// 로그인/회원가입/비회원전용/관리자로그인 메뉴를 출력
public Info() {
AccessDAO driver = this.driver;
boolean flag = true;
while (flag) {
fn.linePrt();
info();
int sel = Integer.parseInt(fn.OutText("번호"));
switch (sel) {
case 1: // 로그인
member = login(1);
if (member != null) memberMain.info(member);
break;
case 2: // 회원가입
member = singUpMember();
if (member != null) memberMain.info(member);
else System.out.println("회원 정보를 확인 할 수 없습니다");
break;
case 3: // 비회원전용
new NoMember();
break;
case 4:// 관리자로그인
login(4);
break;
case 5: // 프로그램 종료
System.out.println("프로그램을 종료합니다");
flag = false;
break;
default:
System.out.println("번호가 없습니다.");
}
}
}
// 회원 로그인 메뉴
private MembersDTO login(int sel) {
int loginCnt = 0;
switch (sel) {
case 1:
fn.linePrt();
System.out.println("회원 로그인 메뉴입니다");
while (loginCnt < 3) {
String tmpId = fn.OutText("아이디");
String tmpPw = fn.OutText("비밀번호");
this.member = dao.serUser(tmpId, tmpPw);
if (member != null) {
System.out.println(member.getName() + "님 반갑습니다 정상 로그인 되었습니다");
return member;
} else {
loginCnt++;
System.out.println(" [ " + loginCnt + "회/ 3회 ] 시도 횟수 초과 시 초기화면으로 이동합니다");
}
}
break;
case 4:
fn.linePrt();
System.out.println("관리자 로그인 메뉴입니다");
while (loginCnt < 3) {
String tmpId = fn.OutText("아이디");
String tmpPW = fn.OutText("비밀번호");
if (tmpId.equals("admin") && tmpPW.equals("human")) {
adminSelf.adminInfo();
break;
} else {
loginCnt++;
System.out.println(" [ " + loginCnt + "회/ 3회 ] 시도 횟수 초과 시 초기화면으로 이동합니다");
}
}
break;
}
return null;
}
// 회원 가입 메뉴
private MembersDTO singUpMember() {
MembersDTO member = new MembersDTO();
fn.linePrt();
System.out.println("회원 가입 입니다");
member.setId(fn.OutText("아이디"));
member.setPw(fn.OutText("비밀번호"));
member.setName(fn.OutText("이름"));
if (dao.memberAdd(member) != null) return member;
return null;
}
// 인포 메뉴내용 출력 메서드
private void info() {
System.out.println("1. 로그인");
System.out.println("2. 회원가입");
System.out.println("3. 비회원전용");
System.out.println("4. 관리자용 로그인");
}
}
반응형
'👩🏻💻 𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞 > ⠀⠀⠀⠀ Jᴀᴠᴀ' 카테고리의 다른 글
2023/11/13 🚀 상속과 다형성, 그리고 추상메서드 (0) | 2023.11.14 |
---|---|
2023/11/12 🦄 학원동호회 - 주말 스터디 (2) | 2023.11.13 |
2023/11/09 😱 조별 프로젝트 그리고 이틀째 (0) | 2023.11.13 |
2023/11/08 🫶 새로운 미니 프로젝트의 시작 (0) | 2023.11.13 |
2023/11/07 ✨ CRUD를 위한 게시판만들기 실습 (0) | 2023.11.07 |