JDBC Board
Table of contents
Application Environment Setting
Create Board Table
Scott에 테이블과 Sequence를 생성함
create table scott.board
(
bno number not null primary key
, subject varchar2(100) not null
, writer varchar2(50) not null
, crtdate date default sysdate
, readcnt number default 0
, content varchar2(256)
);
create sequence scott.board_bno_s;
Write jdbc.properties File
공통적으로 사용해야 하는 정보들을 따로 Properties 파일에 생성
아래 파일에서는
- 데이터베이스에 연결하기 위한 정보들(JDBC 드라이버 클래스, 연결문자열, 데이터베이스ID&PW)
- SQL 명령문
- Oracle이외의 데이터베이스 접근 정보들을 적어둠(선택)
jdbc.drv=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:XE
jdbc.usr=scott
jdbc.pwd=tiger
insert=insert into board(bno, subject, writer, content) values(board_bno_s.nextval,?,?,?)
select=select * from board
update=update board set subject=?, content=? where bno=?
delete=delete from board where bno=?
mysql.drv=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/board
mysql.usr=root
mysql.pwd=12345
(선택)
mariadb.drv=
mariadb.url=
mariadb.usr=
mariadb.pwd=
Board Application
BoardVO : Board Model Class
게시판 내용들을 생성, 초기화 그리고 get,set할 메소드를 가진 클래스
▸ 데이터베이스에서 데이터를 받고 설정할 객체라고 생각하면 됨!
package com.lec.ex02_board;
public class BoardVO {
private int bno;
private String subject;
private String writer;
private String crtdate;
private int readcmt;
private String content;
// 초기화를 따로 시켜줌 (안해도 되는 부분)
public BoardVO() {
this.bno = 0;
this.subject = null;
this.writer = null;
this.crtdate = null;
this.readcmt = 0;
this.content = null;
}
//Getter, Setter
public int getBno() {
return bno;
}
public void setBno(int bno) {
this.bno = bno;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getCrtdate() {
return crtdate;
}
public void setCrtdate(String crtdate) {
this.crtdate = crtdate;
}
public int getReadcmt() {
return readcmt;
}
public void setReadcmt(int readcmt) {
this.readcmt = readcmt;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
//toString()
@Override
public String toString() {
return + bno + "\t\t" + subject + "\t\t" + writer + "\t\t" + content;
}
}
ConnectionFactory
데이터 접속 정보를 공통으로 사용하기 위한 클래스
→ 꼭@@@ ojdbc8-21.1.0.0.jar 를 가져와야함 그래야 Class.forName(DRV);할 수 있음
package com.lec.ex02_board;
import java.io.FileReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
public class ConnectionFactory {
// Path의 경로를 가져오기 : 자기클래스명.class.getResource("파일이름").getPath()
// 해석 : ConnectionFactory와 같은 패키지의 클래스의 "jdbc.properties" 파일의 경로를 가져오세요
private String path = ConnectionFactory.class.getResource("jdbc.properties").getPath();
private String DRV = null;
private String URL = null;
private String USR = null;
private String PWD = null;
private String insert = null;
private String select = null;
private String update = null;
private String delete = null;
//생성시 setUp() 메소드 바로 시작
public ConnectionFactory() {
try {
setUp();
} catch (Exception e) {
e.printStackTrace();
}
}
//생성자가 부르는 setUp()
private void setUp() throws Exception {
//Properties 객체 생성
Properties p = new Properties();
try {
path = URLDecoder.decode(path, "utf-8"); // 한글깨짐 방지
p.load(new FileReader(path)); // path의 경로 가져오기
} catch (Exception e) {
e.printStackTrace();
}
//Properties 객체의 정보 가져오기
//a. Properties의 DB접속정보
DRV = p.getProperty("jdbc.drv");
URL = p.getProperty("jdbc.url");
USR = p.getProperty("jdbc.usr");
PWD = p.getProperty("jdbc.pwd");
//b. Properties의 SQL 정보
insert = p.getProperty("insert");
select = p.getProperty("select");
update = p.getProperty("update");
delete = p.getProperty("delete");
/* 나오는지 확인
System.out.println(DRV);
System.out.println(URL);
System.out.println(USR);
System.out.println(PWD);
System.out.println(insert);
System.out.println(select);
System.out.println(update);
System.out.println(delete);
*/
// 1. JDBC 드라이버 로딩 - Oracle JDBC 드라이버의 Driver Class 로딩
Class.forName(DRV);
}
// 2. DB접속 메서드
//객체 생성 후 접속을 위해 사용할 메소드임
public Connection getConnection() {
try {
System.out.println("DB접속성공");
return DriverManager.getConnection(URL, USR, PWD);
} catch (Exception e) {
System.out.println("DB접속실패");
e.printStackTrace();
return null;
}
}
//Properties 파일의 명령문 가져오는 메소드
public String getInsert() {
return insert;
}
public String getSelect() {
return select;
}
public String getUpdate() {
return update;
}
public String getDelete() {
return delete;
}
}
BoardDAOService Interface
게시판 인터페이스
package com.lec.ex02_board;
import java.util.ArrayList;
public interface BoardDAOService{
void createBoard(); // 글쓰기
BoardVO viewBoard(int bno); // 내용조회
void updateBoard(int bno); // 글수정
void deleteBoard(int bno); // 글삭제
ArrayList<BoardVO> listBoard(); // 전체글목록조회
ArrayList<BoardVO> findBySubjectBoard(String subject); // 제목별조회
ArrayList<BoardVO> findByWriterBoard(String writer); // 작성자조회
}
BoardDAOImpl Class
게시판 구현 클래스
BoardDAOService를 구현함
package com.lec.ex02_board;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;
public class BoardDAOImpl implements BoardDAOService {
// 글입력메서드 (새로생성)
BoardVO inputBoard() {
//게시판 Model 객체 생성
BoardVO bd = new BoardVO();
//Scanner로 값 입력받기
Scanner sc = new Scanner(System.in);
//입력받은 값으로 제목, 작성자, 글내용 입력받기
System.out.println("글제목을 입력하세요 ==> ");
bd.setSubject(sc.nextLine());
System.out.println("작성자 입력하세요 ==> ");
bd.setWriter(sc.nextLine());
System.out.println("글내용을 입력하세요 ==> ");
bd.setContent(sc.nextLine());
return bd;
}
//추.클 구현하기
@Override
public void createBoard() {
BoardVO bd = inputBoard();
// System.out.println("insert into emp values(" + bd.getSubject());
Connection conn = null;
PreparedStatement pstmt = null;
ConnectionFactory cf = new ConnectionFactory();
conn = cf.getConnection(); //연결
String sql = cf.getInsert(); // insert문 가져오기
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bd.getSubject());
pstmt.setString(2, bd.getWriter());
pstmt.setString(3, bd.getContent());
int row = pstmt.executeUpdate();
System.out.println(row + " 건이 추가되었습니다!");
} catch (Exception e) {
System.out.println("게시판 추가 실패!!");
} finally {
try {
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (Exception e2) {
// dummy
}
}
}
@Override
public ArrayList<BoardVO> listBoard() {
ArrayList<BoardVO> boardList = new ArrayList<BoardVO>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
ConnectionFactory cf = new ConnectionFactory();
conn = cf.getConnection();
String sql = cf.getSelect()
+ " where rownum between 1 and 10 "
+ " order by bno desc";
// System.out.println(sql);
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
BoardVO bd = new BoardVO();
bd.setBno(rs.getInt(1));
bd.setSubject(rs.getString("subject"));
bd.setWriter(rs.getString("writer"));
bd.setContent(rs.getString("content"));
boardList.add(bd);
}
} catch (Exception e) {
System.out.println("게시판 목록 조회 실패!!");
} finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (Exception e2) {
// dummy
}
}
return boardList;
}
@Override
public void updateBoard(int bno) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
ConnectionFactory cf = new ConnectionFactory();
conn = cf.getConnection();
String sql = cf.getUpdate();
// System.out.println(sql);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "[수정]제목");
pstmt.setString(2, "[수정]내용");
pstmt.setInt(3, bno);
pstmt.executeUpdate();
System.out.println("게시판 수정 성공!!");
} catch (Exception e) {
System.out.println("게시판 수정 실패!!");
} finally {
try {
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (Exception e2) {
// dummy
}
}
}
@Override
public void deleteBoard(int bno) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
ConnectionFactory cf = new ConnectionFactory();
conn = cf.getConnection();
String sql = cf.getDelete();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, bno);
pstmt.executeUpdate();
System.out.println("게시판 삭제 성공!!");
} catch (Exception e) {
System.out.println("게시판 삭제 실패!!");
} finally {
try {
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (Exception e2) {
// dummy
}
}
}
@Override
public BoardVO viewBoard(int bno) {
BoardVO bd = new BoardVO();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
ConnectionFactory cf = new ConnectionFactory();
conn = cf.getConnection();
String sql = cf.getSelect()
+ " where bno = " + bno;
// System.out.println(sql);
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()) {
bd.setSubject(rs.getString("subject"));
bd.setWriter(rs.getString("writer"));
bd.setContent(rs.getString("content"));
} else {
System.out.println("조회된 게시글이 없습니다!");
}
} catch (Exception e) {
System.out.println("게시판 조회 실패!!");
// e.printStackTrace();
} finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (Exception e2) {
// dummy
}
}
return bd;
}
@Override
public ArrayList<BoardVO> findBySubjectBoard(String subject) {
ArrayList<BoardVO> boardList = new ArrayList<BoardVO>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
ConnectionFactory cf = new ConnectionFactory();
conn = cf.getConnection();
String sql = cf.getSelect()
+ " where subject like '%" + subject + "%' "
+ " order by bno desc";
// System.out.println(sql);
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
BoardVO bd = new BoardVO();
bd.setBno(rs.getInt(1));
bd.setSubject(rs.getString("subject"));
bd.setWriter(rs.getString("writer"));
bd.setContent(rs.getString("content"));
boardList.add(bd);
}
} catch (Exception e) {
System.out.println("게시판 목록 조회 실패!!");
} finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (Exception e2) {
// dummy
}
}
return boardList;
}
@Override
public ArrayList<BoardVO> findByWriterBoard(String writer) {
ArrayList<BoardVO> boardList = new ArrayList<BoardVO>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
ConnectionFactory cf = new ConnectionFactory();
conn = cf.getConnection();
String sql = cf.getSelect()
+ " where writer like '%" + writer + "%' "
+ " order by bno desc";
// System.out.println(sql);
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
BoardVO bd = new BoardVO();
bd.setBno(rs.getInt(1));
bd.setSubject(rs.getString("subject"));
bd.setWriter(rs.getString("writer"));
bd.setContent(rs.getString("content"));
boardList.add(bd);
}
} catch (Exception e) {
System.out.println("게시판 목록 조회 실패!!");
} finally {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (Exception e2) {
// dummy
}
}
return boardList;
}
}
BoardFactory
게시판 생성 클래스 (Singleton)
package com.lec.ex02_board;
//@ BoardDAOImpl을 싱글톤으로 만드는 클래스
public class BoardFactory {
private static BoardDAOImpl bddao = null;
// 외부에생성금지
private BoardFactory() {}
// Singletone
public static BoardDAOImpl getInstance() {
if(bddao == null) bddao = new BoardDAOImpl();
return bddao;
}
}
BoardUI
게시판 처리 프로그램의 화면구성(메뉴)을 담당하는 클래스
package com.lec.ex02_board;
import java.util.ArrayList;
import javax.swing.JOptionPane;
public class BoardUI {
private double ver;
//생성자 호출 후 필드에 대입
public BoardUI(double ver) {
this.ver = ver;
}
// ★ 호출된 메소드
public void mainBoardMenu() {
// 게시판 인터페이스를 싱글톤 객체로 생성 @
BoardDAOImpl bddao = BoardFactory.getInstance();
// 바로 실행
while(true) {
// displayBoardMenu의 리턴값을 menuNo로 받음 &
int menuNo = displayBoardMenu();
//받은 리턴값에 따라 실행되어야 하는 메소드들을 switch문으로 나눠줌
switch(menuNo) {
case 0: System.out.println("프로그램종료"); System.exit(0); break;
case 1: makeBoard(bddao); break;
case 2: listBoard(bddao); break;
case 3: contentView(bddao); break;
case 4: updateBoard(bddao); break;
case 5: deleteBoard(bddao); break;
case 6: findBySubject(bddao); break;
case 7: findByWriter(bddao);
}
}
}
// & showInputDialog로 내용을 출력하고 값을 받음
private int displayBoardMenu() {
String menuNo = JOptionPane.showInputDialog(
"***** 게시판프로그램 V 1.0 *****\n\n" +
"1. 새로운 글쓰기\n" +
"2. 전체글 목록 조회\n" +
"3. 본문글 보기\n" +
"4. 본문글 수정\n" +
"5. 본문글 삭제\n" +
"6. 제목으로 글 조회\n" +
"7. 작성자로 글 조회\n" +
"0. 종료\n\n" +
"처리할 작업번호를 입력하세요\n");
if(menuNo == null) return 0; //값이 없거나
if(menuNo.equals("")) return 0; //null이면 0을 리턴하고
else return Integer.parseInt(menuNo); //받은 나머지 값을 menuNo에 받음
}
// case 7
private void findByWriter(BoardDAOImpl bddao) {
String writer = JOptionPane.showInputDialog("작성자를 입력하세요!!\n");
if(writer == null) return;
if(writer.equals("")) return;
// BoardDAOImpl객체의 findByWriterBoard(bno)메서드 실행
ArrayList<BoardVO> bds = bddao.findByWriterBoard(writer);
System.out.println("==================================================================");
System.out.println("번호\t\t제목\t\t작성자\t\t내용");
System.out.println("==================================================================");
for(BoardVO bd:bds) {
System.out.println(bd.toString());
}
System.out.println("----------- 출력종료 ---------------\n\n\n");
}
// case 6
private void findBySubject(BoardDAOImpl bddao) {
String subject = JOptionPane.showInputDialog("제목을 입력하세요!!\n");
if(subject == null) return;
if(subject.equals("")) return;
// BoardDAOImpl객체의 findBySubjectBoard(bno)메서드 실행
ArrayList<BoardVO> bds = bddao.findBySubjectBoard(subject);
System.out.println("==================================================================");
System.out.println("번호\t\t제목\t\t작성자\t\t내용");
System.out.println("==================================================================");
for(BoardVO bd:bds) {
System.out.println(bd.toString());
}
System.out.println("----------- 출력종료 ---------------\n\n\n");
}
// case 5
private void deleteBoard(BoardDAOImpl bddao) {
String bno = JOptionPane.showInputDialog("삭제할 글 번호를 입력하세요!");
if(bno == null) return;
if(bno.equals("")) return;
else {
// BoardDAOImpl객체의 deleteBoard(bno)메서드 실행
bddao.deleteBoard(Integer.parseInt(bno));
}
}
// case 4
private void updateBoard(BoardDAOImpl bddao) {
String bno = JOptionPane.showInputDialog("수정할 글 번호를 입력하세요!");
if(bno == null) return;
if(bno.equals("")) return;
else {
// BoardDAOImpl객체의 parseInt(bno)메서드 실행
bddao.updateBoard(Integer.parseInt(bno));
}
}
// case 3
private void contentView(BoardDAOImpl bddao) {
String bno = JOptionPane.showInputDialog("조회할 글 번호를 입력하세요!");
if(bno == null) return;
if(bno.equals("")) return;
else {
// BoardDAOImpl객체의 viewBoard(Integer.parseInt(bno))메서드 실행
BoardVO bd = bddao.viewBoard(Integer.parseInt(bno));
System.out.println("글제목 : " + bd.getSubject());
System.out.println("작성자 : " + bd.getWriter());
System.out.println("글내용 : " + bd.getContent());
}
}
// case 2
private void listBoard(BoardDAOImpl bddao) {
// BoardDAOImpl객체의 listBoard()메서드 실행
ArrayList<BoardVO> bds = bddao.listBoard();
System.out.println("==================================================================");
System.out.println("번호\t\t제목\t\t작성자\t\t내용");
System.out.println("==================================================================");
for(BoardVO bd:bds) {
System.out.println(bd.toString());
}
System.out.println("----------- 출력종료 ---------------\n\n\n");
}
// case 1
private void makeBoard(BoardDAOImpl bddao) {
bddao.createBoard(); // BoardDAOImpl객체의 createBoard()메서드 실행
}
}
Board Class
메인클래스
package com.lec.ex02_board;
import java.util.ArrayList;
public class Board {
public static void main(String[] args) {
//게시판 처리 프로그램의 화면구성(메뉴)을 담당하는 클래스를 버전 1.0으로 인스턴스생성
BoardUI bui = new BoardUI(1.0);
//인스턴스의 mainBoardMenu()호출 ★
bui.mainBoardMenu();
}
}