entity
package com.koreait.day4.model.entity;
//lombok 출신
import com.koreait.day4.model.enumclass.UserStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;
// DB 새로고침하면 볼 수 있음
// JPA를 사용할때 클래스(camel표기법)와 DB이름(snake표기법)을 맞춰주지 않으면 안됨
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data //getter,setter
@Builder //method.method...가능하게 만들어주는
public class AdminUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userid;
private String userpw;
private String name;
@Enumerated(EnumType.STRING)
private UserStatus status;
private LocalDateTime lastLoginAt;
private LocalDateTime regDate;
}
repository
package com.koreait.day4.repository;
import com.koreait.day4.model.entity.AdminUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface AdminUserRepository extends JpaRepository<AdminUser, Long>{
}
단위 테스트
package com.koreait.day4.repository;
import com.koreait.day4.Day4ApplicationTests;
import com.koreait.day4.model.entity.AdminUser;
import com.koreait.day4.model.enumclass.UserStatus;
import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class AdminUserRepositoryTest extends Day4ApplicationTests {
@Autowired
private AdminUserRepository adminUserRepository;
// 모든 데이터 출력
@Test
public void crud1(){
adminUserRepository.findAll().forEach(System.out::println);
// System.out:: 객체가 toString되어 나옴
/* 아래 코드와 같은 내용이라고 보면 됨
방법1 향상된 for문
for(AdminUser adminUser : adminUserRepository.findAll()){
System.out.println(adminUser);
}
방법2 리스트에 담아 forEach
List<AdminUser> adminUsers = adminUserRepository.findAll();//리스트에 담을 수 있다
adminUsers.forEach(System.out::println);
*/
// Tip control누른상태로 클릭하면 상위 정의한 부분으로 갈수 있음
// Tip control+shift 누른 상태로 클릭하면 최상위 정의한 부분으로 갈 수 있는듯..
}
// 데이터 정렬하기
@Test
public void crud2(){
List<AdminUser> adminUsers = adminUserRepository
.findAll(Sort.by(Sort.Direction.DESC, "id"));
adminUsers.forEach(System.out::println);
}
// 데이터 검색하기
@Test
public void crud3() {
// 여러명을 검색할때는 List를 이용한다.
/*
List<Long> ids = new ArrayList<>();
ids.add(2L);
ids.add(4L);
List<AdminUser> adminUsers = adminUserRepository.findAllById(ids);
adminUsers.forEach(System.out::println);
*/
List<AdminUser> adminUsers= adminUserRepository.findAllById(Lists.newArrayList(2L,4L));
}
//여러 데이터 저장
@Test
public void crud4() {
AdminUser adminUser1 = AdminUser.builder().userid("watermelon")
.userpw("7777").name("수박").build();
AdminUser adminUser2 = AdminUser.builder().userid("orange")
.userpw("8888").name("오렌지").build();
adminUserRepository.saveAll(Lists.newArrayList(adminUser1,adminUser2));
List<AdminUser> adminusers = adminUserRepository.findAll();
adminusers.forEach(System.out::println);
}
// 단일 데이터 불러오기
@Test
@Transactional
public void crud5() {
AdminUser adminUser = adminUserRepository.getOne(2L);
System.out.println(adminUser);
//error: no session 세션이 없다. getOne은 불러와서 출력하는 과정이 있다. ~~
// -> 결론: Lazy 방식 일 때는 트랜젝션안에 넣어줘야함 @Transactional
}
// 단일 데이터 불러오기2
@Test
public void crud6(){
//Optional<AdminUser> adminUser = adminUserRepository.findById(2L);
//optional 없이 하는방법!
AdminUser adminUser = adminUserRepository.findById(2L).orElseThrow();
//findById는 null이 아니라는것을 가정하기 때문에 orElse()보단 orElseThrow() 추천
System.out.println(adminUser);
}
// 데이터 개수 불러오기
@Test
public void crud7(){
long count = adminUserRepository.count();
System.out.println(count);
}
@Test
public void crud8(){
boolean exists = adminUserRepository.existsById(2L);
System.out.println(exists);
/* existsById는 내부적으로 개수를 세기 때문에 딱히 추천하지 않음!
select
count(*) as col_0_0_
from
admin_user adminuser0_
where
adminuser0_.id=?
*/
}
//데이터 삭제
@Test
public void crud9(){
//데이터 삭제시 select가 일어남
//adminUserRepository.deleteById(5L);
//deleteById는 내부적으로 한번 select하고 아이디 찾고나서 delete한다.
//adminUserRepository.delete(adminUserRepository.findById(5L).orElseThrow(RuntimeException::new));
//delete-findById는 findById로 한번 select하고 delete로 select하고 아이디 찾고나서 delete한다.(비효율적)
//orElseThrow(RuntimeException::new) exception이름 안에 넣으면 됨!!
adminUserRepository.findAll().forEach(System.out::println);
}
//여러 데이터 삭제
@Test
public void crud10(){
//deleteAll 데이터 삭제시 select가 각각 일어남
//adminUserRepository.deleteAll(adminUserRepository.findAllById(Lists.newArrayList(3L,4L)));
//여긴 select가 findAllById, 6, 7
//deleteInBatch 데이터 삭제시 각각 select가 일어나지 않음! findAllById이거 하나만
adminUserRepository.deleteInBatch(adminUserRepository.findAllById(Lists.newArrayList(2L,6L)));
adminUserRepository.findAll().forEach(System.out::println);
}
//페이지 생성
@Test
public void crud11(){
// import org.springframework.data.domain.Page; ✔ 꼭 확인 page인터페이스라서 PageRequest클래스로 구현!
Page<AdminUser> adminUsers = adminUserRepository.findAll(PageRequest.of(2, 3));
System.out.println("🐇 page"+ adminUsers);
System.out.println("🐇 totalElements: "+ adminUsers.getTotalElements());//전체 데이터수
System.out.println("🐇 totalPages: "+adminUsers.getTotalPages());//총 페이지수
System.out.println("🐇 numberOfElements: "+ adminUsers.getNumberOfElements());//그 페이지 element 개수
System.out.println("🐇 size: "+ adminUsers.getSize());//내가 몇개씩 쪼갯다.
System.out.println("🐇 sort: "+adminUsers.getSort());
adminUsers.getContent().forEach(System.out::println);
}
//Enum 적용해서 등록하기
@Test
public void create(){
AdminUser adminUser = AdminUser.builder().userid("grape").userpw("1011")
.name("표도").status(UserStatus.REGISTERED).build();
adminUserRepository.save(adminUser);
}
}