
그림을 클릭하면 원래 크기로 볼 수 있습니다.
게시판 테이블 물리설계
-- 게시판 테이블 생성
DROP TABLE IF EXISTS board_data;
CREATE TABLE board_data (
no SERIAL,
title VARCHAR(100) NOT NULL,
article VARCHAR(800) NOT NULL,
writer VARCHAR(50) NOT NULL DEFAULT '아무개',
wdate TIMESTAMP,
hitcnt SMALLINT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (no)
) ENGINE = MyISAM
COLLATE utf8_general_ci;
-- list()
-- 페이징 계산 필요 offset = (pageNum - 1) * rows
SELECT no, title, article, writer, wdate, hitcnt
FROM board_data
ORDER BY no DESC
LIMIT 0, 10;
-- write()
INSERT INTO board_data (title, article, writer)
VALUES ('제목1', '안녕하세요.', '홍길동');
-- delete()
DELETE FROM board_data
WHERE no = ?;
-- edit()
UPDATE board_data
SET title = '제목1', article = '안녕하세요', writer = '홍길동', hitcnt = hitcnt + 1;
-- view()
SELECT no, title, article, writer, wdate, hitcnt
FROM board_data
WHERE no = ?;
-- search()
SELECT no, title, article, writer, wdate, hitcnt
FROM board_data
WHERE ? LIKE ?;
게시판 row를 담을 빈 설계
package net.jeongsam.board;
import java.sql.Timestamp;
/**
* 게시판 row 데이터 저장 빈
* 2009. 9. 18
* @author 정승용
*
*/
public class BoardData {
private Long no;
private String title;
private String article;
private String writer;
private Timestamp wDate;
private Integer hitCnt;
public Long getNo() {
return no;
}
public void setNo(Long no) {
this.no = no;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public Timestamp getwDate() {
return wDate;
}
public void setwDate(Timestamp wDate) {
this.wDate = wDate;
}
public Integer getHitCnt() {
return hitCnt;
}
public void setHitCnt(Integer hitCnt) {
this.hitCnt = hitCnt;
}
}
정렬 데이터를 담을 빈 설계
package net.jeongsam.board;
/**
* 정렬 기준 필드 이름과 정렬 방법을 저장할 자바빈
* @author 정승용
*
*/
public class SortData {
private String fieldName; // 컬럼 이름
private String order; // 정렬 방식 "ASC"와 "DESC" 중 선택
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
}
게시판 관리 클래스
package net.jeongsam.board;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
/**
* 게시판 관리
* 2009. 9. 18
* @author 정승용
*
*/
public class BoardMgr {
/**
* 게시판 표시 기본 행 수
*/
public static int DEFAULT_ROW = 10;
/**
* DB 연결 정보
*/
private String url = "jdbc:mysql://127.0.0.1/example";
private String user = "root";
private String password = "1234";
private Connection conn = null;
/**
* 목록 표시 원형
* @param pageNum 표시할 페이지
* @param rows 한 페이지 당 표시할 행 수
* @param sort 정렬 기준 컬럼 이름과 정렬 순서 값을 저장할 자바빈
* @return 결과 테이블 구조를 저장할 컬렉션
* @throws SQLException
* @throws ClassNotFoundException
*/
public Collection<BoardData> list(int pageNum, int rows, SortData sort)
throws ClassNotFoundException, SQLException {
Statement stmt = null;
ResultSet rs = null;
ArrayList<BoardData> table = new ArrayList();
// Limit offset, row_count
// offset = (페이지 번호 - 1) * 페이지당 행 수
int offset = (pageNum - 1) * rows;
String sql = "SELECT no, title, article, writer, wdate, hitcnt ";
sql += "FROM board_data ";
sql += "ORDER BY " + sort.getFieldName() + " " + sort.getOrder() + " ";
sql += "LIMIT " + offset + ", " + rows;
conn = getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs == null) {
System.out.println("글이 없습니다."); // 사용자 정의 예외 처리가 원칙
} else {
while (rs.next()) {
BoardData rec = new BoardData();
rec.setNo(rs.getLong(1));
rec.setTitle(rs.getString(2));
rec.setArticle(rs.getString(3));
rec.setWriter(rs.getString(4));
rec.setwDate(rs.getTimestamp(5));
rec.setHitCnt(rs.getInt(6));
table.add(rec);
}
}
return table;
}
/**
* 필드별 정렬하여 목록 표시
* @param pageNum 표시할 페이지
* @param sort 정렬 기준 컬럼 이름과 정렬 순서 값을 저장할 자바빈
* @return 결과 테이블 구조를 저장할 컬렉션
* @throws SQLException
* @throws ClassNotFoundException
*/
public Collection<BoardData> list(int pageNum, SortData sort)
throws ClassNotFoundException, SQLException {
return list(pageNum, DEFAULT_ROW, sort);
}
/**
* 기본 목록 표시
* @param pageNum 표시할 페이지
* @return 결과 테이블 구조를 저장할 컬렉션
* @throws SQLException
* @throws ClassNotFoundException
*/
public Collection<BoardData> list(int pageNum)
throws ClassNotFoundException, SQLException {
SortData sort = new SortData();
sort.setFieldName("no");
sort.setOrder("DESC");
return list(pageNum, DEFAULT_ROW, sort);
}
/**
* 글 올리기
* @param article 게시물을 저장할 자바빈
* @throws SQLException JDBC 드라이버 로딩 오류
* @throws ClassNotFoundException MySQL DBMS 연결 오류
*/
public void write(BoardData article) throws ClassNotFoundException, SQLException {
Statement stmt = null;
String sql = "INSERT INTO board_data (title, article, writer) ";
sql += "VALUES ('" + article.getTitle() + "', '"
+ article.getArticle() + "', '" + article.getWriter() + "')";
// Debug 코드
System.out.println("write() : " + sql);
try {
conn = getConnection();
stmt = conn.createStatement();
stmt.executeUpdate(sql);
} finally {
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
}
}
/**
* 글 삭제
* @param articleNo 삭제할 글 번호
* @throws ClassNotFoundException JDBC 드라이버 로딩 오류
* @throws SQLException MySQL DBMS 연결 오류
*/
public void delete(long articleNo) throws ClassNotFoundException, SQLException {
Statement stmt = null;
String sql = "DELETE FROM board_data WHERE no = " + articleNo;
// Debug 코드
System.out.println("delete() : " + sql);
try {
conn = getConnection();
stmt = conn.createStatement();
stmt.executeUpdate(sql);
} finally {
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
}
}
/**
* 글 편집
* @param article 편집 내용을 담은 자바빈
* @throws SQLException JDBC 드라이버 로딩 오류
* @throws ClassNotFoundException MySQL DBMS 연결 오류
*/
public void edit(BoardData article) throws ClassNotFoundException, SQLException {
Statement stmt = null;
String sql = "UPDATE board_data ";
sql += "SET title = '" + article.getTitle() + "', article = '";
sql += article.getArticle() + "', writer = '" + article.getWriter() + "', hitcnt = hitcnt + 1";
// Debug 코드
System.out.println("edit() : " + sql);
try {
conn = getConnection();
stmt = conn.createStatement();
stmt.executeUpdate(sql);
} finally {
if (stmt != null) {
stmt.close();
stmt = null;
}
if (conn != null) {
conn.close();
conn = null;
}
}
}
/**
* 글 보기
* @param articleNo 화면에 표시할 글 번호
* @return 화면에 표시될 내용을 담은 자바빈
*/
public BoardData view(long articleNo) {
return null;
}
/**
* 찾기
* @param fieldName 검색할 컬럼 이름
* @param value 검색할 데이터
* @return 검색 결과로 표시된 테이블을 담을 컬렉션
*/
public Collection<BoardData> search(String fieldName, String value) {
return null;
}
/**
* MySQL DBMS에 연결하여 Connection 객체 생성
* @return Connection 인스턴스
* @throws ClassNotFoundException JDBC 드라이버 로딩 오류
* @throws SQLException MySQL DBMS 연결 오류
*/
private Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection(url, user, password);
}
}