기존에 Sawon Data를 JPA를 활용해서 한 번 만들어보자!
desc sawon으로 column 확인!
[ Entity = Vo 작성하기 ]
JPA에서는 자체적으로 Entity에 제약조건을 걸어주어야 오류가 발생하지 않는다.
@Entity
@Data
@Table(name="sawon") // Entity명과 Table명이 동일하면 생략이 가능하다.
public class Sawon {
@Id
int sabun; // primary key
String saname;
String sasex;
int deptno;
String sajob;
String sahire;
@Column(nullable = true) // null 허용
Integer samgr;
int sapay;
}
[ Repository = Dao 생성하기 ]
Interface를 상속받는 구현객체가 없어도 Implements를 알아서 Spring Boot가 전부 생성한다.
// 연결한 Table , PrimaryKey Type
public interface SawonRepository extends JpaRepository<Sawon,Integer> {
// 이 안에는 findAll(), findBySabun(), 등등 모든 기능이 구현이 되어있다. (자동으로)
}
[ @RestController 생성하기 ]
@RestController // @Controller + @ResponseBody
public class SawonController {
@Autowired
SawonRepository sawonRepository;
@GetMapping("/sawons")
public List<Sawon> selectList() {
return sawonRepository.findAll();
}
}
[ Repository에 SQL문을 적용 ]
기존에 만들어져있는 findAllByDeptno를 내가 사용하고 싶은 SQL문으로 재정의
// 연결한 Table , PrimaryKey Type
public interface SawonRepository extends JpaRepository<Sawon,Integer> {
// 이 안에는 findAll(), findBySabun(), 등등 모든 기능이 구현이 되어있다. (자동으로)
// 일반 SQL문 사용 :변수처리 or :1 (첫 번째 변수)
@Query(value="select * from sawon where deptno = :deptno", nativeQuery = true)
List<Sawon> findAllByDeptno(int deptno); // 부서별 조회
}
Controller에 selectListFromDeptno Method 추가하기
@RestController // @Controller + @ResponseBody
public class SawonController {
@Autowired
SawonRepository sawonRepository;
// 전체 조회
@GetMapping("/sawons")
public List<Sawon> selectList() {
return sawonRepository.findAll();
}
// 부서별 조회
@GetMapping("/sawons/{deptno}")
public List<Sawon> selectListFromDeptno(@PathVariable int deptno) {
return sawonRepository.findAllByDeptno(deptno);
}
}
[ JPQL ]
#### JPQL(Java Persistence Query Language)
JPQL 은 객체지향 쿼리언어. 따라서 테이블을 대상으로 쿼리하는것이 아니라 엔티티 객체를 대상으로 쿼리한다.
JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다
JPQL은 결국 SQL로 변환된다.
#### JPQL 문법
엔티티와 속성은 대소문자 구분O (Member, age)
JPQL키워드는 대소문자 구분X (SELECT , FROM, where)
엔티티 이름을 사용함, 테이블 이름이 아님(Member)
반드시 alias명 사용 : 별칭은 필수 (m) (as는 생략가능)
JPA는 편안하긴 한데, mapper를 사용해서 Mybatis 사용하는게 결론적으로는 더 편안하다.
(Join 기능, view 활용 등등 이런 복잡한 SQL문이 생겨날 시에, 구조가 복잡해지고 가독성이 떨어진다)
[ sort 정렬 처리 ]
RestController에 이렇게 입력만 해줘도 끝
assending(오름차순)
// sort 처리
@GetMapping("/sawons-sortbysapay")
public List<Sawon> selectListSortBySapayDesc() {
return sawonRepository.findAll(Sort.by("sapay"));
}
descending(내림차순)
[ Paging 처리 페이징처리 ]
@RestController에 추가
// Page 처리 : @ralce11 later 이던지 MySQL 설치해서 나중에 확인해보자..
@GetMapping("/sawons/{page}/{count}")
public List<Sawon> slectListByPaging(@PathVariable int page, @PathVariable int count) {
Pageable pageAble = PageRequest.of(page, count, Sort.by("sabun"));
Page<Sawon> pageSawon = sawonRepository.findAll(pageAble);
// Page<Sawon> -> List<Sawon> 변환 : getContent()
//return sawonRepository.findAll(pageAble).getContent();
return pageSawon.getContent();
}
[ primary key로 참조하기 ]
@Repository 설정하기
// Sawon과 Dept를 Inner Join 하였음. (MySQL에서는 error 미발생)
@Query(value="select * from Sawon s inner join Dept d using(deptno) = d.deptno", nativeQuery=true)
List<Sawon> findAllWithDept();
@Entity 설정하기
// update no, insert no, 오로지 참조만 하게 설정
@Column(insertable = false, updatable = false)
int deptno;
@OneToOne // 두 개를 Join 할 때, 1:1로 연결한다.
@JoinColumn(name = "deptno", referencedColumnName = "deptno") // Join
Dept dept;
@RestController 추가하기
// 전체 조회 + query 추가
@GetMapping("/sawons-query")
public List<Sawon> selectListWithDept() {
return sawonRepository.findAllWithDept();
}
[ @OneToMany Join ]
@OneToMany
@JoinColumn(name="godam", referencedColumnName = "sabun") // Join
List<Gogek> golist;
@Entity 작성하기
@Entity
@Data // Getter + Setter
public class Gogek {
@Id
int gobun; // Primary Key
String goname;
String goaddr;
String gojumin;
int godam;
}
'SpringBoot↗' 카테고리의 다른 글
AWS 서버(프로젝트 업로드) (0) | 2024.08.13 |
---|---|
Spring Boot)Transaction (0) | 2024.08.12 |
Spring Boot) JPA (0) | 2024.08.08 |
SpringBoot 환경설정 및 초기 가이드 (0) | 2024.08.07 |
Spring)RMI (0) | 2024.08.07 |