위로 아래

DAO 생성

이전의 DBConnectionManager와 마찬가지로, private로 변수를 지정해주고, 생성자를 만든다.

private static BoardDAO dao = null;
	
private BoardDAO () {};
	
public static BoardDAO getInstance(){
    if(dao==null)
        dao = new BoardDAO();
    return dao;
}

DAO는 자주 사용해야하니, static으로 선언해서, 한 번만 생성하고 계속 재사용.

생성자가 private이니 직접 접근 못 한다. 따라서 DAO의 객체를 생성해주는 getInstance() 메소드를 작성한다.

 

 

 

 

BoardWrite() 메소드 기본형

JDBC 매커니즘에 의한 기본형을 우선 작성해본다.

 

WriteForm에서 작성한 여러 매개변수를 인자로 받아야하니, 

이를 DTO에 저장해서 DTO가 DAO에게 전달해주도록 한다. 

따라서 매개변수는 DTO가 된다.

 

데이터베이스에 데이터를 입력해야하니까 쿼리문은 INSERT가 된다.

INSERT문은 excuteUpdate()를 사용해야한다.

따라서 반환값은 int 타입이 된다.

 

데이터베이스에 연결은 url, user, pawd를 일일이 치지 않기 위해 생성한 DBConnectionManager 클래스를 사용한다.

 

따라서 기본형은 다음과 같이 나온다.

public int BoardWrite (BoardDTO dto) {
    Connection conn=null;
    PreparedStatement pstmt=null;
    int r = 0;
    conn = DBConnectionManager.getInstance().getConnection();

    try {			
        String sql = "";
        pstmt = conn.prepareStatement(sql);
        r = pstmt.executeUpdate();

    } catch(SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if(conn!=null) conn.close();
            if(pstmt!=null) pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return r;

}

 

 

 

bno 생성

이번 프로젝트의 핵심은 primary key인 bno다.

앞으로 bno를 이용해 게시글을 판별할 것이다. 

 

따라서 새 게시글을 데이터베이스에 INSERT하기 이전에,

데이터베이스에 저장된 글들의 bno를 조사하고, 숫자가 겹치지 않게 새로운 bno를 선정해 새 글의 bno에 부여해 줄 필요가 있다.

필요한 쿼리문은 지금까지 있던 bno 중 최곳값에 1을 더해주는 걸로 구할 수 있겠다.

SELECT IFNULL(MAX(bno),0)+1 AS bno FROM board

 

SELECT 문의 결과를 받기 위해서는 exeuteQuery()를 사용해 ResultSet에 받아주어야 한다.

public int BoardWrite (BoardDTO dto) {
    Connection conn=null;
    PreparedStatement pstmt=null;
    ResultSet rs=null;
    int r = 0;
    conn = DBConnectionManager.getInstance().getConnection();

    try {

        int newBno = 0;
        String sql = "SELECT IFNULL(MAX(bno),0)+1 AS bno FROM board";
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery();
        if(rs.next())
            newBno = rs.getInt("bno");

        pstmt.close();
        rs.close();

        sql = "";

        r = pstmt.executeUpdate();

    } catch(SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if(conn!=null) conn.close();
            if(pstmt!=null) pstmt.close();
            if(rs!=null) rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return r;

}

이제 새 게시글의 bno를 구했으니 INSERT 쿼리문을 작성할 수 있다.

 

 

 

INSERT 쿼리문 작성

필요한 쿼리문은 다음과 같다.

INSERT INTO board
(bno, bref, bstep, blevel, subject, content, writer, regdate, ip, passwd)
VALUES(?,?,?,?,?,?,?,SYSDATE(),?,?)

? 에는 DTO를 통해서 받은 새 게시글의 정보가 들어가야 한다.

 

pstmt = conn.prepareStatement(sql);
    pstmt.setInt(1, newBno);
    pstmt.setInt(2, newBno);
    pstmt.setInt(3, dto.getBstep());
    pstmt.setInt(4, dto.getBlevel());
    pstmt.setString(5, dto.getSubject());
    pstmt.setString(6, dto.getContent());
    pstmt.setString(7, dto.getWriter());
    pstmt.setString(8, dto.getIp());
    pstmt.setString(9, dto.getPasswd());

DTO에게 get으로 받은 정보를 쿼리문에 set해준다.

 

이제 데이터베이스에 새 글에 대한 정보를 모두 입력했다.

public int BoardWrite (BoardDTO dto) {
    Connection conn=null;
    PreparedStatement pstmt=null;
    ResultSet rs=null;
    int r = 0;
    conn = DBConnectionManager.getInstance().getConnection();

    try {

        int newBno = 0;
        String sql = "SELECT IFNULL(MAX(bno),0)+1 AS bno FROM board";
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery();
        if(rs.next())
            newBno = rs.getInt("bno");

        pstmt.close();
        rs.close();


        sql = "INSERT INTO board "
                + "(bno, bref, bstep, blevel, "
                + "subject, content, writer, regdate, "
                + "ip, passwd) "
                + "VALUES(?,?,?,?,?,?,?,SYSDATE(),?,?)";
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, newBno);
        pstmt.setInt(2, newBno);
        pstmt.setInt(3, dto.getBstep());
        pstmt.setInt(4, dto.getBlevel());
        pstmt.setString(5, dto.getSubject());
        pstmt.setString(6, dto.getContent());
        pstmt.setString(7, dto.getWriter());
        pstmt.setString(8, dto.getIp());
        pstmt.setString(9, dto.getPasswd());

        r = pstmt.executeUpdate();

    } catch(SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if(conn!=null) conn.close();
            if(pstmt!=null) pstmt.close();
            if(rs!=null) rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return r;

}

 

 

 

 

 


전체 코드

더보기
package bean;
import java.sql.*;
import java.util.*;

public class BoardDAO {
	private static BoardDAO dao = null;
	
	private BoardDAO () {};
	
	public static BoardDAO getInstance(){
		if(dao==null)
			dao = new BoardDAO();
		return dao;
	}
	
	public int BoardWrite (BoardDTO dto) {
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		int r = 0;
		conn = DBConnectionManager.getInstance().getConnection();
		
		try {
			
			int newBno = 0;
			String sql = "SELECT IFNULL(MAX(bno),0)+1 AS bno FROM board";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			if(rs.next())
				newBno = rs.getInt("bno");
			
			pstmt.close();
			rs.close();
			
			
			sql = "INSERT INTO board "
					+ "(bno, bref, bstep, blevel, "
					+ "subject, content, writer, regdate, "
					+ "ip, passwd) "
					+ "VALUES(?,?,?,?,?,?,?,SYSDATE(),?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, newBno);
			pstmt.setInt(2, newBno);
			pstmt.setInt(3, dto.getBstep());
			pstmt.setInt(4, dto.getBlevel());
			pstmt.setString(5, dto.getSubject());
			pstmt.setString(6, dto.getContent());
			pstmt.setString(7, dto.getWriter());
			pstmt.setString(8, dto.getIp());
			pstmt.setString(9, dto.getPasswd());
			
			r = pstmt.executeUpdate();
			
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(conn!=null) conn.close();
				if(pstmt!=null) pstmt.close();
				if(rs!=null) rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return r;
		
	}
}