클래스를 만들기 위한 틀
여러 클래스에서 동일한 동작을 할 수 있게 만드는 틀
abstract method만 있으므로 interface 혼자서 뭘 할 수 없음(Method Body가 없기 때문)
package kr.co.jsp.board.model;
import java.util.List;
public interface IBoardDAO {
/*
interface
- 클래스를 만들기 위한 틀
- interface 혼자서 어떤 것을 할 수 없음(추상 메서드만 있으므로)
*/
// 게시글 등록
boolean insert(BoardVO vo);
// 모든 게시물의 정보가 들어있는 객체가 들어감
// execute~~는 true,false로 반환되므로 리턴 타입도 지정
// 게시글 전체 조회
List<BoardVO> selectAll();
// 게시글 상세 조회
BoardVO selectOne(int num);
// 글 제목이 ?로 되기 때문에 매개변수로 넣음
// 게시글 수정
boolean update(BoardVO board);
// 글 제목, 글 내용, 글 번호가 ?로 되는데 그냥 BoardVO 객체를 통해서 넣을 수 있으므로 그냥 BoardVO객체 사용
// execute~~는 true,false로 반환되므로 리턴 타입도 지정
// 게시글 삭제
boolean delete(int num);
// 글 번호가 ?로 되기 때문에 매개변수로 넣음
}
매번 finally 뒤에 연결을 끊어주는 것이 효율성이 떨어져 클래스를 만들어 사용
package kr.co.jsp.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbdUtil {
public static void close(Connection conn, PreparedStatement pstmt) {
try {
if(pstmt!=null) pstmt.close();
if(conn != null) conn.close();
}
catch (SQLException e) {
System.out.println("close 과정에서 에러 발생!");
}
}
public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs) {
try {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}
catch (SQLException e) {
System.out.println("close 과정에서 에러 발생!");
}
}
}
DAO에 insert 로직을 구현
DAO의 insert는 true, false를 반환하므로 jsp에서 true or false로 조건을 걸어 성공적으로 insert 성공 유무 확인
BoardDAO
package kr.co.jsp.board.model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import kr.co.jsp.util.JdbdUtil;
public class BoardDAO implements IBoardDAO {
// 싱글톤 디자인 패턴 구축
// 외부에서 객체 생성을 하지 못하고 접근하지 못하도록 하기 위해 private 작성
private BoardDAO() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (Exception e) {
e.printStackTrace();
}
}
private static BoardDAO dao = new BoardDAO();
// BoardDAO에 접근하기 위해서는 getInstance()메소드를 통해서만 접근
public static BoardDAO getInstance() {
return dao;
}
//////////////////////////////////////////////
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
private Connection getConnection() throws Exception {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String uid = "jsp";
String upw = "jsp";
return DriverManager.getConnection(url, uid, upw);
} // DB를 연동할 수 있는 메소드를 생성
@Override
public boolean insert(BoardVO vo) {
boolean flag = false;
String sql = "INSERT INTO board VALUES(bid_seq.NEXTVAL, ?, ?, ?, sysdate)";
// sysdate는 굳이 넣지 않아도 상관없음 그 대신 table뒤에 컬럼명을 각각 지정해줘야함
try {
conn = getConnection();
// DB접속
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, vo.getWriter());
pstmt.setString(2, vo.getTitle());
pstmt.setString(3, vo.getContent());
// 값 넣어주기
int rn = pstmt.executeUpdate();
if (rn == 1) {
flag = true;
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JdbdUtil.close(conn, pstmt);
}
return flag;
}
write.jsp
사용자에게 값을 입력 받는 곳
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>게시글 등록</h2>
<form action="write_con.jsp" method="post">
<p>
# 작성자 : <input type="text" name="writer"><br>
# 제목 : <input type = "text" name = "title"><br>
# 글내용 : <br>
<textarea rows="3" name = "content"></textarea><br>
<input type = "submit" value = "등록">
<!-- submit 등록을 클릭하게 되면 post방식으로 write_con.jsp로 값이 이동 -->
</p>
</form>
</body>
</html>
write_con.jsp
사용자에게 입력 받은 값을 DAO와 연동
<%@page import="kr.co.jsp.board.model.BoardDAO"%>
<%@page import="kr.co.jsp.board.model.BoardVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*
1. 사용자의 입력값을 가져오세요. 그리고 객체로 포장하세요.
2. DAO클래스의 주소값을 받아 DB에 내용을 삽입하는 메서드를 호출하세요.
(board_id -> 시퀀스 객체로 삽입, 날짜는 넣어줄 필요가 없다.)
3. 글 등록 성공 시 list.jsp로 리다이렉팅,
4. 글 등록 실패 시 write.jsp로 리다이렉팅 해 주세요.
*/
request.setCharacterEncoding("utf-8");
// post방식이므로 인코딩설정
String name = request.getParameter("writer");
String title = request.getParameter("title");
String content = request.getParameter("content");
// write.jsp에서 준 값을 get
BoardVO board = new BoardVO();
board.setWriter(name);
board.setTitle(title);
board.setContent(content);
// 개별 값을 넣어줌
BoardDAO DAO = BoardDAO.getInstance();
// 주소값을 받아옴
boolean flag = DAO.insert(board);
if (flag){
response.sendRedirect("list.jsp");
System.out.println("등록완료");
// flag가 true이면 등록완료이므로 해당 jsp파일로 이동
}
else {
response.sendRedirect("write.jsp");
// flag가 false이면 등록완료가 안되었으므로 다시 작성하도록 하기
}
%>
전체 데이터를 조회하는 기능
BoardDAO
@Override
public List<BoardVO> selectAll() {
List<BoardVO> boardlist = new ArrayList<>();
String sql = "SELECT * FROM board ORDER BY BOARD_ID ASC";
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
// 데이터베이스 연결 및 쿼리 실행
while (rs.next()) {
BoardVO vo = new BoardVO(rs.getInt("Board_ID"), rs.getString("WRITER"), rs.getString("TITLE"),
rs.getString("CONTENT"), rs.getTimestamp("REG_DATE"));
// 객체를 생성해서 값을 넣어줌
boardlist.add(vo);
// 객체를 객체 저장소인 boadlist에 넣어줌
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbdUtil.close(conn, pstmt);
}
return boardlist;
}
list.jsp
<%@page import="kr.co.jsp.board.model.BoardVO"%>
<%@page import="java.util.List"%>
<%@page import="kr.co.jsp.board.model.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
//BoardDAO 클래스의 selectAll() 을 호출하여
//DB에 들어있는 모든 글들을 list로 받아 오셔야 합니다.
//리턴값으로 받은 리스트를 body태그에 반복문을 사용하여 하나씩 작성 (테이블 형식으로).
//번호, 작성자, 제목, 비고(삭제)
//조건문을 사용하여 DB에서 얻어온 글이 하나도 없을 때는
//게시글이 존재하지 않는다 라는 글을 출력해 주세요.
%>
<%
BoardDAO dao = BoardDAO.getInstance();
// 주소값 받아옴
List<BoardVO> boardlist = dao.selectAll();
// 모두 조회한 값 받아옴
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> 게시글 목록 </h1>
<% if (boardlist.size() > 0 ) {%>
<table border = "3">
<tr>
<th>name</th>
<th>writer</th>
<th>title</th>
<th>etc</th>
</tr>
<% for (BoardVO board : boardlist){ %>
<tr>
<td><%= board.getBoardId() %></td>
<td><%= board.getWriter() %></td>
<td><%= board.getTitle() %></td>
<!-- board객체에서 값을 get -->
<td>
<a href = "delete.jsp">
삭제
</a>
</td>
</tr>
<%} %>
<%} else{ %>
<h3>게시글이 존재하지 않습니다!</h3>
<a href = "write.jsp">새 글 쓰기</a>
<%} %>
</table>
</body>
</html>
하나의 데이터를 조회하는 기능
BoardDAO
@Override
public BoardVO selectOne(int num) {
String sql = "SELECT * FROM board WHERE Board_ID = ?";
BoardVO vo = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
// DB연결 수행 및 Query에 값을 넣어주고 Query 실행
if (rs.next()) {
vo = new BoardVO(rs.getInt("Board_ID"), rs.getString("WRITER"), rs.getString("TITLE"),
rs.getString("CONTENT"), rs.getTimestamp("REG_DATE"));
}
// 값이 하나이므로 반복문보다는 조건문이 좋을 것 같음
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JdbcUtil.close(conn, pstmt);
}
return vo;
// 전역변수로 BoardVO 객체를 생성해주고 그 값을 try문에서 넣어주고 BoardVO 객체를 리턴
}
content.jsp
<%@page import="kr.co.jsp.board.model.BoardVO"%>
<%@page import="kr.co.jsp.board.model.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
int id = Integer.parseInt(request.getParameter("bID"));
// 요청과 함께 넘어오는 파라미터값(글 번호)을 얻어와서
// DAO의 selectOne() 호출하여 객체를 와야함
BoardDAO dao = BoardDAO.getInstance();
BoardVO vo = dao.selectOne(id);
// 요청과 함께 넘어오는 파라미터값을 기준으로 객체를 반환하는 메서드를 작성해서 객체 반환
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> <%= vo.getBoardId() %> 번 게시물 내용</h1>
<p>
# 작성자 : <%= vo.getWriter() %> <br>
# 제목 : <%= vo.getTitle() %> <br>
# 내용 : <br>
<textarea rows="5" readonly><%= vo.getContent() %></textarea><br>
# 작성일 : <%= vo.getRegDate() %> <br>
</p>
<a href = "list.jsp">글 목록 보기</a>
<a href="update.jsp?bID=<%=vo.getBoardId() %>" >글 수정</a>
<!-- 값을 수정하기 위해서는 id값이 있어야 하기 때문에 update에도 값을 보내줘서 값을 기준으로 다시 찾아서 수정하도록 로직을 진행 -->
</body>
</html>
Board_id값을 통해 데이터 삭제
BoardDAO
@Override
public boolean delete(int num) {
boolean flag = false;
String sql = "DELETE FROM BOARD WHERE BOARD_ID = ?";
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
int rn = pstmt.executeUpdate();
if (rn == 1) {
flag = true;
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JdbcUtil.close(conn, pstmt);
}
return flag;
}
delete.jsp
<%@page import="kr.co.jsp.board.model.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int num = Integer.parseInt(request.getParameter("bID"));
// list.jsp에서 받아온 아이디
BoardDAO dao = BoardDAO.getInstance();
boolean flag = dao.delete(num);
%>
<%
if (flag){
%>
<h2> 삭제가 완료되었습니다.</h2>
<a href = "write.jsp">글 작성 이동</a>
<%} else { %>
<h2> 삭제가 완료되지 못했습니다.</h2>
<a href = "list.jsp">글 목록 이동</a>
<%} %>