com.example.springboot 에 service 패키지 만들기
레파지토리 연결 =>
@Autowired private BookRepository repository;
@Autowired
private BookService bookService;
@GetMapping("/list")
public String list(Model model){
List<Book> list = bookService.list();
model.addAttribute("list", list);
return "list"; // list.html
}
thymeleaf:
prefix: classpath:/templates/
suffix: .html
cache: false
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<td>번호</td>
<td>제목</td>
<td>가격</td>
<td>저자</td>
</tr>
<tr th:each= "book : ${list}">
<td th:text="${book.id}">번호</td>
<td><a th:href="@{/detail/{id}(id=${book.id})}" th:text="${book.title}">제목</a></td>
<td th:text="${book.price}">가격</td>
<td th:text="${book.name}">저자</td>
</tr>
</table>
</body>
</html>
타임리프에서 a태크 링크 방법
public Book detail(Long id){
Optional<Book> optional = repository.findById(id);
return optional.orElse(null);
}
@GetMapping("/detail/{id}")
public String detail(@PathVariable Long id, Model model){
Book book = bookService.detail(id);
model.addAttribute("book", book);
return "detail"; // detail.html
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
<tr>
<td>번호</td>
<td th:text="${book.id}">번호</td>
</tr>
<tr>
<td>제목</td>
<td th:text="${book.title}">제목</td>
</tr>
<tr>
<td>가격</td>
<td th:text="${book.price}">가격</td>
</tr>
<tr>
<td>저자</td>
<td th:text="${book.name}">저자</td>
</tr>
</table>
</body>
</html>
실습 : 가격이 10000원 이상인 책을 검색
package com.example.springboot.repository;
import com.example.springboot.entity.Book;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Optional;
public interface BookRepository extends JpaRepository<Book,Long> {
// 1. 정해진 메소드 사용(JpaRepository)
// findAll() --> select * from Book
// save() --> insert into 가 된다. 기존에 데이터가 없으면 insert
// save() --> Update 기능도 한다. 구분은 기존에 데이터가 있으면 update
// findById(id) --> select * from Book where id = #{id}
// deleteById(id) --> delete from Book where id = #{id}
// 2. 쿼리 메소드 사용
// (find + By + 맴버변수 의 조합으로 생성) -> 여러 조합방식이 있음
// 책 제목에 해당하는 책 정보 1개를 가지고 오기 -> 해당 메소드를 만들어줘야함
// --> public Optional<Book> findByTitle(String title);
public Optional<Book> findByPrice(int price); // select * from Book where price = price
// 3. JPQL(Java Persistence Query Language) : Entity 기반
// 사용자정의 SQL과 유사한 쿼리 언어 입니다.
//SELECT * FROM Book WHERE price <= 10000
//@Query("SELECT b FROM Book b WHERE b.price >= :price") // Entity 기반
//public List<Book> getByPrice(@Param("price") int price); // 가격이 10000원 이상인 책을 검색
@Query("SELECT b FROM Book b WHERE b.price >= :price And b.page >= :page") // Entity 기반
public List<Book> getByPriceAndPage(@Param("price") int price, @Param("page") int page); // 가격이 10000원 이상인 책을 검색
// 4. JPQL(Java Persistence Query Language) : SQL 기반
@Query(value = "SELECT * FROM Book WHERE price >= ?1", nativeQuery = true) // nativeQuery = true : 순수 sql로 쓰겠다는 의미
public List<Book> getByPrice(int price);
}