프로시저를 이용한 댓글 구현(코드만 정리)

부트캠프(END)/Oracle|2022. 9. 14. 12:29
--댓글 추가
CREATE OR REPLACE PROCEDURE replyInsert (
  pCno spring_reply2.cno%TYPE,
  pType spring_reply2.type%TYPE,
  pId spring_reply2.id%TYPE,
  pName spring_reply2.name%TYPE,
  pMsg spring_reply2.msg%TYPE
)
IS 
BEGIN
  INSERT INTO spring_reply2 VALUES(
    (SELECT NVL(MAX(no)+1,1) FROM spring_reply2),
    pCno, pType, pId, pName, pMsg, SYSDATE
  );
  COMMIT;
END;
/

--댓글 읽기
CREATE OR REPLACE PROCEDURE replyListData(
  pCno spring_reply2.cno%TYPE,
  pType spring_reply2.type%TYPE,
  pResult OUT SYS_REFCURSOR
)
IS
BEGIN
  OPEN pResult FOR
    SELECT no, cno, type, id, name, msg, TO_CHAR(regdate, 'YYYY-MM-DD HH24:MI:SS')
      FROM spring_reply2
      WHERE cno=pCno AND type=pType
      ORDER BY no DESC;
END;
/

--댓글 수정
CREATE OR REPLACE PROCEDURE replyUpdate(
  pNo spring_reply2.no%TYPE,
  pMsg spring_reply2.msg%TYPE
)
IS
BEGIN
  UPDATE spring_reply2 SET
  msg = pMsg
  WHERE no=pNo;
  commit;
END;
/

--댓글 삭제
CREATE OR REPLACE PROCEDURE replyDelete(
  pNo spring_reply2.no%TYPE
)
IS
BEGIN
  DELETE FROM spring_reply2 
  WHERE no=pNo;
  COMMIT;
END;
/

 

package doo.doo.dao;

import java.util.*;
import doo.doo.vo.*;
import oracle.jdbc.OracleTypes;

import java.sql.*;
import org.springframework.stereotype.Repository;

@Repository
public class ReplyDAO {
  private Connection conn;
  private CallableStatement cs; //프로시저 호출할 때 씀
  private final String URL = "jdbc:oracle:thin:@localhost:1521:XE";

  public ReplyDAO() {
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (Exception ex) {}
  }

  public void getConnection() {
    try {
      conn = DriverManager.getConnection(URL, "user", "pwd");
    } catch (Exception ex) {}
  }

  public void disConnection() {
    try {
      if (cs != null) cs.close();
      if (conn != null) conn.close();
    } catch (Exception ex) {}
  }

  //댓글 올리기
  /*CREATE OR REPLACE PROCEDURE replyInsert (
      pCno spring_reply2.cno%TYPE,
      pType spring_reply2.type%TYPE,
      pId spring_reply2.id%TYPE,
      pName spring_reply2.name%TYPE,
      pMsg spring_reply2.msg%TYPE
  )*/
  public void replyInsert(ReplyVO vo) {
    try {
      getConnection();
      String sql = "{CALL replyInsert(?,?,?,?,?)}";
      cs = conn.prepareCall(sql);
      cs.setInt(1, vo.getCno());
      cs.setInt(2, vo.getType());
      cs.setString(3, vo.getId());
      cs.setString(4, vo.getName());
      cs.setString(5, vo.getMsg());
      cs.executeQuery();
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
      disConnection();
    }
  }
  //댓글 읽기
  /*CREATE OR REPLACE PROCEDURE replyListData(
      pCno spring_reply2.cno%TYPE,
      pType spring_reply2.type%TYPE,
      pResult OUT SYS_REFCURSOR
  )*/
  public List < ReplyVO > replyListData(ReplyVO vo) {
    List < ReplyVO > list = new ArrayList < ReplyVO > ();
    try {
      getConnection();
      String sql = "{CALL replyListData(?,?,?)}";
      cs = conn.prepareCall(sql);
      cs.setInt(1, vo.getCno());
      cs.setInt(2, vo.getType());
      cs.registerOutParameter(3, OracleTypes.CURSOR); //결과값을 담아줌
      cs.executeQuery();
      ResultSet rs = (ResultSet) cs.getObject(3);
      while (rs.next()) {
        ReplyVO rvo = new ReplyVO();
        rvo.setNo(rs.getInt(1));
        rvo.setCno(rs.getInt(2));
        rvo.setType(rs.getInt(3));
        rvo.setId(rs.getString(4));
        rvo.setName(rs.getString(5));
        rvo.setMsg(rs.getString(6));
        rvo.setDbday(rs.getString(7));
        list.add(rvo);
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
      disConnection();
    }
    return list;
  }

  public void replyDelete(int no) {
    try {
      getConnection();
      String sql = "{CALL replyDelete(?)}";
      cs = conn.prepareCall(sql);
      cs.setInt(1, no);
      cs.executeQuery();
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
      disConnection();
    }
  }

  public void replyUpdate(ReplyVO vo) {
    try {
      getConnection();
      String sql = "{CALL replyUpdate(?,?)}";
      cs = conn.prepareCall(sql);
      cs.setInt(1, vo.getNo());
      cs.setString(2, vo.getMsg());
      cs.executeQuery();
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
      disConnection();
    }
  }
}

 

Controller

package doo.doo.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import doo.doo.dao.ReplyDAO;
import doo.doo.vo.ReplyVO;
import java.util.*;

import javax.servlet.http.HttpSession;

@Controller
public class ReplyController {
  @Autowired
  private ReplyDAO dao;

  @PostMapping("reply/insert.do")
  public String reply_insert(ReplyVO vo, HttpSession session, RedirectAttributes ra) {
    String id = (String) session.getAttribute("id");
    String name = (String) session.getAttribute("name");
    vo.setId(id);
    vo.setName(name);
    dao.replyInsert(vo);
    //RedirectAttributes : redirect하면서 데이터를 넘길 때 사용함
    ra.addAttribute("tab", vo.getType());
    ra.addAttribute("no", vo.getCno());
    return "redirect:../seoul/detail.do";
    //		return "redirect:../seoul/detail.do?tab="+vo.getType()+"&no="+vo.getCno();
  }

  @GetMapping("reply/delete.do")
  public String reply_delete(ReplyVO vo, RedirectAttributes ra) {
    dao.replyDelete(vo.getNo());
    ra.addAttribute("tab", vo.getType());
    ra.addAttribute("no", vo.getCno());
    return "redirect:../seoul/detail.do";
  }

  @PostMapping("reply/update.do")
  public String reply_update(ReplyVO vo, RedirectAttributes ra) {
    dao.replyUpdate(vo);
    ra.addAttribute("tab", vo.getType());
    ra.addAttribute("no", vo.getCno());
    return "redirect:../seoul/detail.do";
  }

}

 

RedirectAttributes 객체

package doo.doo.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import doo.doo.dao.ReplyDAO;
import doo.doo.vo.ReplyVO;
import java.util.*;

import javax.servlet.http.HttpSession;

@Controller
public class ReplyController {
  @Autowired
  private ReplyDAO dao;

  @PostMapping("reply/insert.do")
  public String reply_insert(ReplyVO vo, HttpSession session, RedirectAttributes ra) {
    //RedirectAttributes : redirect하면서 데이터를 넘길 때 사용함
    ra.addAttribute("tab", vo.getType());
    ra.addAttribute("no", vo.getCno());
    return "redirect:../seoul/detail.do";
  }
}
return "redirect:../seoul/detail.do?tab=" + vo.getType() + "&no=" + vo.getCno();

'부트캠프(END) > Oracle' 카테고리의 다른 글

regexp - 수정중  (0) 2022.08.18
MyBatis : JOIN, IN  (0) 2022.08.09
PL/SQL : TRIGGER  (0) 2022.07.07

댓글()