[예제 9월 18일] 게시판 구현 - JDBC를 이용한 MySQL 이용하기
2009. 9. 18. 10:26
그림을 클릭하면 원래 크기로 볼 수 있습니다.
게시판 테이블 물리설계
-- 게시판 테이블 생성 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); } }