오늘은 JPA 한데요!

jyp·2023년 4월 4일
0

학원

목록 보기
57/57

BoardController

@Autowired
private BoardRepository repo; << 요게 기존에 사용하던 mapper.java 역할을 하는듯

@RequestMapping("/")
  public String home()
  {
      return "redirect:/list";
  }

@RequestMapping("/list")
  public String list(Model model)
  {
      model.addAttribute("list",repo.list());
      return "/list";
  }

@RequestMapping("/content")
  public String content(HttpServletRequest request,Model model)
  {
      int id = Integer.parseInt(request.getParameter("id"));

      Board bvo = repo.content(id);
      bvo.setContent(bvo.getContent().replace("\r\n","<br>"));

      model.addAttribute("bvo",bvo);

      return "/content";
  }
}

JPA는 VO를 요롷게 사용한다고 하심

Board.class

package com.example.demo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

@Entity
@Table(name="board")
@Data
public class Board {

	@Autowired
	private BoardRepository repo;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private int readnum;
    private String title,name,content,pwd,writeday;
}

Repository.class

package com.example.demo;

import javax.persistence.EntityManager;

import org.springframework.stereotype.Repository;

@PersistenceContext

(JPA라이브러리 EntityManager)
private EntityManager manager; << 기존에 사용하던 쿼리문(CRUD)를 사용할때 필요함 

public ArrayList의 상위 interface라고함 >>List<Board> list()
{
	String jpql = "select b from Board<<(Board.class의 Board) b order by id desc";
	TypedQuery<Board> list = manager.createQuery(jpql,Board.class);
    
    return list.getResultList(); << list형태로 받으려면 getResultList()로 받아야함
}

public Board content(int id)
{
	return manager.find(Board.class, id);
}

@Transactional << DB안에 값을 바꿔주거나 할땐 꼭 있어야하는 annotation
public Board update(int id)
{
	return manager.find(Board.class, id);
}

public void update_ok(Board bvo)
{
	manager.merge(bvo);
}

게시글의 조회수를 늘릴땐 어떻게 하느냐

@Repository
public interface BoardRepository2 extends JpaRepository<Board, Integer>{

    @Modifying
    @Query("update Board b set b.readnum=b.readnum+1 where b.id=:id")
    void updateReadnum(int id);
}

interface를 하나 만들어서 쿼리문을 적어주고

@Transactional
public void updateReadnum(int id)
{
	repo2.updateReadnum(id);
}
이렇게도 사용할 수 있음 그런데 이건 좀 귀찮은거 같아서 아래처럼 해봤는데
문제없이 됐음 그래서 난 아래걸 쓰겠다.

하지만

근데 위 방법은 쿼리문 자체를 내가 쓸수있기 때문에 좀 더 세밀하게 작업할때
사용할 수 있을듯


@Transactional
public void readnum(int id)
{
	Board bvo = manager.find(Board.class, id);
	bvo.setReadnum(bvo.getReadnum() + 1);
}

이렇게 하면 쉽게 쌉가능
profile
국비 코딩

0개의 댓글