2022.12.13-2 JAVA 데이터베이스 입출력
20장 데이터베이스 입출력
20.12 JDBC를 활용해서 CMD에서 실행되는 게시판을 구현해보자.
게시판은 기본적인 CRUD(Create Read Update Delete)기능이 포함되어 있는 가장 좋은 실습 주제이다.
이것은 어떤 프로젝트를 하든지 다 들어가게 된다.
기능을 하나씩 추가하는 것이다.
20.12.1 메인메뉴 게시물 기능 보여주기

20.12.2 메인메뉴 선택기능

20.12.3 board클래스작성
boards테이블의 한개의 행(게시물)을 저장할board클래스를 작성한다. 컬램개수와 타입에 맞게 필드를 선언하고 롬복@Date어노테이션을 이용한다.
첨부파일은 넣지 않을 것이므로 필드선언안함.
20.12.4 게시물 목록 기능
boards 테이블에서 모든 게시물 정보들을 가져온다음 게시물 목록으로 출력시켜보자.
DB연결이 필요하므로 Connection필드를 추가하고 생성자에서DB연결을 한다.
그리고 boards테이블에서 게시물 정보들을 가져와서 게시물 목록으로 출력하도록 list()메소드를 수정한다.
20.12.5 게시물 생성기능
1.create 를 선택하면 새로운 게시물의 제목 내용 작성자를 키보드로 입력받고 보조 메뉴 1.ok를 선택하면 boards테이블에 새로운 게시물이 저장되도록해보자.
20.12.6 게시물 읽기 기능
2.read를 선택했을때 게시물의 번호를 키보드로 입력받고 boards테이블에 있는 해당 게시물을 가져와서 출력하기
20.12.7 게시물 수정기능
게시물 읽기에서 보조메뉴를 추가하고 보조 메뉴에서 1.update를 선택햇을때 제목 내용 작성자의 수정내용을 입력할수있도록 해보자.
그리고 ok를 선택햇을때 테이블을 수정하도록하기.
20.12.8 게시물 삭제기능
게시물읽기에서 보조메뉴 delete를 선택햇을 경우 해당 테이블에서 게시물을 삭제하기
20.12.9 게시물전체 삭제기능 & 20.12.10 종료
게시물 전체삭제하기, 종료
package ch20.sec12;
import java.util.Date;
import lombok.Data;
@Data
public class Board {
private int bno;
private String btitle;
private String bcontent;
private String bwriter;
private Date bdate;
}package ch20.sec12;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import ch20.sec09.exam02.Board;
public class BoardExample8 {
//Field
private Scanner scanner = new Scanner(System.in);
Connection conn = null;
//Constructor
public BoardExample8 () {
try {
// JDBC Driver를 메모리로 로딩하고 DriverMangaer에 등록
Class.forName("oracle.jdbc.OracleDriver");
//DB와 연결
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/orcl", "java", "oracle");
System.out.println("연결 성공");
} catch (Exception e) {
e.printStackTrace();
}
}
//Method
public void list() {
System.out.println();
System.out.println("[게시물 목록]");
System.out.println("-----------------------------------------------------------------------");
System.out.printf("%-6s%-12s%-16s%-40s\n", "no", "writer", "date", "title");
System.out.println("-----------------------------------------------------------------------");
try {
//boards 테이블에서 게시물 정보를 가져와서 출력하기
//bno 가져와서내림차순으로 정렬 (최신순으로 봐야하니)
String sql = "SELECT bno, btitle, bcontent, bwriter, bdate " + "FROM boards " + "order by bno DESC";
//PreparedStatement 얻기 및 값 지정
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Board board = new Board();
board.setBno(rs.getInt("bno"));
board.setBtitle(rs.getString("btitle"));
board.setBcontent(rs.getString("bcontent"));
board.setBwriter(rs.getString("bwriter"));
board.setBdate(rs.getDate("bdate"));
System.out.printf("%-6s%-12s%-16s%-40s \n", board.getBno(), board.getBwriter(), board.getBdate(),
board.getBtitle());
}
rs.close();
pstmt.close();
} catch (Exception e) {
e.getStackTrace();
exit();
}
//메인메뉴 출력
mainMenu();
}
public void mainMenu() {
System.out.println();
System.out.println("-----------------------------------------------------------------------");
System.out.println("메인 메뉴: 1.Create | 2.Read | 3.Clear | 4.Exit");
System.out.print("메뉴 선택: ");
String menuNo = scanner.nextLine();
System.out.println();
switch(menuNo) {
case "1" -> create();
case "2" -> read();
case "3" -> clear();
case "4" -> exit();
}
}
public void create() {
//입력받기
Board board = new Board();
System.out.println("[새 게시물 입력]");
System.out.print("제목: ");
board.setBtitle(scanner.nextLine());
System.out.print("내용: ");
board.setBcontent(scanner.nextLine());
System.out.print("작성자: ");
board.setBwriter(scanner.nextLine());
//보조메뉴출력
System.out.println("-----------------------------------------------------------------------");
System.out.println("보조 메뉴: 1.Ok | 2.Cancel");
System.out.print("메뉴 선택: ");
String menuNo = scanner.nextLine();
if(menuNo.equals("1")) {
try {
//boards 테이블에 게시물 정보 저장
String sql = "INSERT INTO boards (bno, btitle, bcontent, bwriter, bdate) " + "VALUES (SEQ_BNO.NEXTVAL, ?, ?,
?, SYSDATE)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, board.getBtitle());
pstmt.setString(2, board.getBcontent());
pstmt.setString(3, board.getBwriter());
pstmt.executeUpdate();
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
exit();
}
}
//게시물 목록 출력
list();
}
public void read() {
System.out.println("[게시물 읽기]");
System.out.print("bno: " );
int bno = Integer.parseInt(scanner.nextLine()); //문자를 숫자로 받앗으니 전환
try {
//board 테이블에서 해당 게시물을 가져와 출력
String sql = "SELECT bno, btitle, bcontent, bwriter, bdate " + "FROM boards " + "WHERE bno=? ";
//PreparedStatement 얻기 및 값 지정
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,bno);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Board board = new Board();
board.setBno(rs.getInt("bno"));
board.setBtitle(rs.getString("btitle"));
board.setBcontent(rs.getString("bcontent"));
board.setBwriter(rs.getString("bwriter"));
board.setBdate(rs.getDate("bdate"));
System.out.println("###########");
System.out.println("번호: " + board.getBno());
System.out.println("제목: " + board.getBtitle());
System.out.println("내용: " + board.getBcontent());
System.out.println("작성자: " + board.getBwriter());
System.out.println("날짜: " + board.getBdate());
//보조 메뉴 출력
System.out.println("-----------------------------------------------------------------------");
System.out.println("보조 메뉴: 1.Update | 2.Delete | 3. List");
System.out.print("메뉴 선택: ");
String menuNo = scanner.nextLine();
System.out.println();
if(menuNo.equals("1")) {
update(board);
} else if (menuNo.equals("2")) {
delete(board);
} else if (menuNo.equals("3")) {
list();
}
}
rs.close();
pstmt.close();
} catch (Exception e) {
e.getStackTrace();
exit();
}
}
public void update(Board board) {
//입력받기
System.out.println("[게시물 수정]");
System.out.print("제목: ");
board.setBtitle(scanner.nextLine());
System.out.print("내용: ");
board.setBcontent(scanner.nextLine());
System.out.print("작성자: ");
board.setBwriter(scanner.nextLine());
//보조메뉴 출력
System.out.println("-----------------------------------------------------------------------");
System.out.println("보조 메뉴: 1.Ok | 2.Cancel");
System.out.print("메뉴 선택: ");
String menuNo = scanner.nextLine();
if(menuNo.equals("1")) {
try {
//boards 테이블에 게시물 업데이트
String sql = "update boards set btitle=?, bcontent=?, bwriter=? " + "where bno=? ";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, board.getBtitle());
pstmt.setString(2, board.getBcontent());
pstmt.setString(3, board.getBwriter());
pstmt.setInt(4, board.getBno());
pstmt.executeUpdate();
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
exit();
}
}
//게시물목록표기
list();
}
public void delete(Board board) {
try {
//매개변수화 된 SQL문 작성
String sql = "delete from boards where bno=? ";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, board.getBno());
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
e.getStackTrace();
exit();
}
//게시물 목록 출력
list();
}
public void clear() {
System.out.println("[게시물 전체 삭제]");
System.out.println("-----------------------------------------------------------------------");
System.out.println("보조 메뉴: 1.Ok | 2.Cancel");
System.out.print("메뉴 선택: ");
String menuNo = scanner.nextLine();
if(menuNo.equals("1")) {
//boards 테이블에 게시물 정보 전체 삭제
try {
String sql = "TRUNCATE TABLE boards";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
pstmt.close();
} catch (Exception e){
e.getStackTrace();
exit();
}
}
list();
}
public void exit() {
if(conn != null) {
try {
conn.close();
} catch (Exception e) {}
}
System.out.println("** 게시판 종료 **");
System.exit(0);
}
public static void main(String[] args) {
BoardExample8 boardExample = new BoardExample8();
boardExample.list();
}
}2022.12.13 리뷰
드디어 이것이자바다 1회독을 끝내고 CURD게시판 맛보기를 했다.
국비이전 한번 더 복습을 하고 싶다.
대학에서 DB관련 공부를 했어서 DB에 관련된 용어를 어느정도 기억하고 있는 것이 공부에 도움이 된 것 같다.
중요한 것은 꺾이지 않는 마음.