SpringBoot 가 어떻게 JPA 를 통합 하 는 지 자세히 알 아 보 세 요.
18362 단어 SpringBoot통합JPA
JPA & Spring Data JPA
JPA 는 자바 Persistence API 의 약칭 으로 중국어 이름 자바 지구 층 API 로 Sun 이 공식 적 으로 제기 한 자바 지구 화 규범 이다.
그 설계 목 표 는 주로 기 존의 지구 화 개발 작업 을 간소화 하고 ORM 기술 을 통합 시 키 는 것 이다.
JPA 는 XML 파일 이나 주석(JDK 5.0 또는 더 높 은 버 전)을 사용 하여 대상-관련 표 의 매 핑 관 계 를 설명 합 니 다.실행 중인 실체 대상 을 데이터베이스 에 영구적 으로 유지 할 수 있 습 니 다.자바 개발 자 에 게 자바 응용 프로그램의 관계 데 이 터 를 관리 하 는 ORM 도 구 를 제공 합 니 다.
쉽게 말 하면 JPA 는 POJO(Plain Ordinary Java Object)에 지속 적 인 표준 규범 을 제공 하 는 것 으로 자바 의 일반 대상 이 대상 관 계 를 통 해 매 핑(Object-Relational Mapping,ORM)을 데이터베이스 에 지속 적 으로 표시 할 것 이다.
JPA 는 기 존 하 이 버 네 이 트,톱 링크,JDO 등 ORM 프레임 을 충분히 흡수 한 토대 에서 발 전 했 기 때문에 사용 하기 쉽 고 신축성 이 강하 다 는 장점 이 있다.
Spring Data JPA 는 Spring 이 Spring Data 프레임 워 크 를 기반 으로 JPA 규범 을 바탕 으로 개발 한 프레임 워 크 로 Spring Data JPA 를 사용 하면 JPA 의 쓰기 법 을 크게 간소화 할 수 있 으 며,쓰기 실현 이 거의 필요 없 는 상태 에서 데이터베이스 에 대한 접근 과 조작 을 실현 할 수 있 으 며,CRUD 외 에 페이지 나 누 기와 정렬 등 자주 사용 되 는 기능 도 포함한다.
Spring Data JPA 는 페이지 별 조회,사용자 정의 SQL,지정 N 조 기록 조회,연결 표 조회 등 기능 에 대한 지원 도 제공 합 니 다.
JPA 는 새로운 ORM 프레임 워 크 가 아니 라 기 존의 ORM 기술 을 규범화 하 는 데 사 용 될 뿐 기 존의 Hibernate,TopLink 등 프레임 워 크 를 대체 할 수 없습니다.반대로 JPA 개발 을 사용 할 때 저 희 는 이러한 ORM 프레임 워 크 에 사용 할 것 입 니 다.다만 이때 개 발 된 응용 은 더 이상 지속 적 인 공급 자 에 의존 하지 않 습 니 다.응용 프로그램 은 코드 를 수정 하지 않 은 상태 에서 어떠한 JPA 환경 에서 도 실행 할 수 있 으 며,진정 으로 낮은 결합 을 하고 확장 가능 한 프로그램 설 계 를 할 수 있 습 니 다.
Hibernate & JPA
1、JPA
전체 이름 은 자바 Persistence API 로 JDK 5.0 주석 이나 XML 을 통 해 대상-관계 표 의 매 핑 관 계 를 설명 하고 실행 기간 의 실체 대상 을 데이터베이스 에 영구적 으로 유지 합 니 다.
JPA 의 출현 에는 두 가지 이유 가 있다.
첫째,기 존의 자바 EE 와 자바 SE 응용 대상 의 지속 적 인 개발 작업 을 간소화 한다.
둘째,썬 은 ORM 기술 을 통합 해 지구 화 분야 의 통일 을 이 루 고자 한다.
JPA 가 제공 하 는 기술:
1)ORM 맵 메타 데이터:JPA 는 XML 과 JDK 5.0 주석 두 가지 메타 데이터 형식 을 지원 합 니 다.메타 데이터 설명 대상 과 표 간 의 맵 관 계 를 지원 합 니 다.프레임 워 크 는 이에 따라 실체 대상 을 데이터베이스 시트 에 영구적 으로 유지 합 니 다.
2)JPA 의 API:실체 대상 을 조작 하고 CRUD 작업 을 수행 하 는 데 사 용 됩 니 다.프레임 워 크 는 배경 에서 모든 일 을 완성 하고 개발 자 는 번 거 로 운 JDBC 와 SQL 코드 에서 벗 어 납 니 다.
3)조회 언어:데이터베이스 가 아 닌 대상 을 대상 으로 하 는 조회 언어 로 데 이 터 를 조회 하여 프로그램의 SQL 문장 이 긴밀 하 게 결합 되 지 않도록 한다.
2.JPA&Hibernate 관계
JPA 는 규범,하 이 버 네 이 트 는 프레임,JPA 는 지구 화 규범,하 이 버 네 이 트 는 JPA 를 실현 했다.
Hibernate VS Mybatis
Mybatis:작고 편리 하 며 효율 적 이 고 간단 하 며 직접적 이 고 반자동 적 입 니 다.
Hibernate:강력,편리,효율,복잡,커 브,전자 동
가 져 오기 의존
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.간단 한 CRUD2.1 프로필
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/shy
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
jpa:
hibernate:
# create update
ddl-auto: update
# sql
show-sql: true
server:
port: 80
그 중에서 spring.jpa.hibenate.ddl-auto 매개 변 수 는 데이터베이스 시트 구 조 를 자동 으로 업데이트 할 지 여 부 를 설정 하 는 데 사 용 됩 니 다.create,create-drop,update,vaidate,none 5 개의 값 을 얻 을 수 있 습 니 다.Shop:
package com.shy.entity;
import lombok.Data;
import javax.persistence.*;
@Data
// jpa
@Entity// jpa
public class Shop{
@Id//
@GeneratedValue(strategy = GenerationType.IDENTITY)//
private Integer shopId;
@Column(length = 20)
private String shopName;
private double price;
private Integer shopClassId;
private Integer num;
}
ShopClass,상품 유형
package com.shy.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Data
@Entity
public class ShopClass {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer shopClassId;
private String shopClassName;
}
2.3 Dao 층dao 계승 JpaRepository 클래스 를 작성 하고 실행 할 실체 클래스 와 홈 키 형식 을 입력 합 니 다.
package com.example.dao;
import com.shy.entity.Shop;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/* T :
* ID : OID( , ) */
@Repository
public interface ShopRepository extends JpaRepository<Shop,Integer> {
/*
* JpaRepository
*
* JPA
* , 。
* */
}
JpaRepository:
package org.springframework.data.jpa.repository;
import java.util.List;
import javax.persistence.EntityManager;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
@Override
List<T> findAll();//
@Override
List<T> findAll(Sort sort);//
@Override
List<T> findAllById(Iterable<ID> ids);// ID
@Override
<S extends T> List<S> saveAll(Iterable<S> entities);// ( )
void flush();//
<S extends T> S saveAndFlush(S entity); //
<S extends T> List<S> saveAllAndFlush(Iterable<S> entities);
@Deprecated
default void deleteInBatch(Iterable<T> entities){deleteAllInBatch(entities);}
void deleteAllInBatch(Iterable<T> entities); //
void deleteAllByIdInBatch(Iterable<ID> ids);
void deleteAllInBatch();//
@Deprecated
T getOne(ID id);// ID
T getById(ID id);
@Override
<S extends T> List<S> findAll(Example<S> example);// Example
@Override
<S extends T> List<S> findAll(Example<S> example, Sort sort);// Example
}
2.4 서비스 층service:
package com.shy.service;
import com.shy.entity.Shop;
import com.shy.vo.ShopAndShopClassVo;
import java.util.List;
public interface ShopService {
//
List<Shop> findAll();
//
Shop addShop(Shop shop);
// id
Shop updateShop();
// id
void delShop(Integer id);
}
Impl:
package com.shy.service;
import com.shy.dao.ShopRepository;
import com.shy.entity.Shop;
import com.shy.vo.ShopAndShopClassVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ShopServiceImpl implements ShopService{
@Autowired
private ShopRepository shopRepository;
@Override
public List<Shop> findAll() {
return shopRepository.findAll();
}
@Override
public Shop addShop(Shop shop) {
shop.setPrice(333);
shop.setShopClassId(3);
shop.setNum(30);
shop.setShopName(" ");
return shopRepository.save(shop);
}
@Override
public Shop updateShop() {
Shop shop = new Shop();
shop.setShopId(11);
shop.setShopName(" ");
shop.setShopClassId(3);
shop.setNum(40);
return shopRepository.save(shop);
}
@Override
public void delShop(Integer id) {
shopRepository.deleteById(id);
System.out.println(" ");
}
}
2.5 controller
package com.shy.controller;
import com.alibaba.fastjson.JSON;
import com.shy.entity.Shop;
import com.shy.service.ShopService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ShopController {
@Autowired
private ShopService shopService;
@GetMapping("/list")
public String findAll(){
return JSON.toJSONString(shopService.findAll());
}
@GetMapping("/save")
public String save(Shop shop){
return JSON.toJSONString(shopService.addShop(shop));
}
@GetMapping("/saveAndFlush")
public String saveAndFlush(){
return JSON.toJSONString(shopService.updateShop());
}
@GetMapping("/delShop/{id}")
public void delShop(@PathVariable Integer id){
shopService.delShop(id);
}
}
전 과정 용 postman 테스트3.사용자 정의 SQL
Shop Repository 에 추가
// sql ,nativeQuery = true
//?1
@Query(value="select * from shop where shop.price = ?1",nativeQuery = true)
Shop findByPrice(Double price);
// ,@Modifying+@Query ,serviceImpl , hql , entity
@Transactional//
@Modifying// int/Integer
@Query("update Shop s set s.shopName = ?1 where s.shopId = ?2")
int updateshop2(String name,Integer shopId);
service:
//
Shop findByPrice(Double price);
// sql
int updateshop2(String name,Integer shopId);
Impl:
@Override
public Shop findByPrice(Double price) {
return shopRepository.findByPrice(price);
}
@Override
public int updateshop2(String name, Integer shopId) {
return shopRepository.updateshop2(name, shopId);
}
controller:
@GetMapping("/listPrice/{price}")
public String findByPrice(@PathVariable Double price){
return JSON.toJSONString(shopService.findByPrice(price));
}
@GetMapping("/saveAndFlush2/{id}/{name}")
public String saveAndFlush2(@PathVariable(value = "id") Integer shopId,
@PathVariable String name){
return shopService.updateshop2(name, shopId)>0?" ":" ";
}
페이지 별 조회Pageable 은 Spring 패 키 징 의 페이지 구현 클래스 로 사용 할 때 페이지 수,각 페이지 수,정렬 규칙 을 입력 해 야 합 니 다.
Spring Data JPA 는 페이지 나 누 기 기능 을 내장 해 주 었 습 니 다.조회 방법 에 서 는 매개 변수 Pageable 을 입력 해 야 합 니 다.조회 에 여러 개의 매개 변수 가 있 을 때 Pageable 은 마지막 매개 변수 로 전송 하 는 것 을 권장 합 니 다.
Pageable 을 사용 할 때 페이지 수,각 페이지 수,정렬 규칙 을 입력 해 야 합 니 다.정렬 규칙 은 생략 할 수 있 습 니 다.
service:
/**
*
* @param pageNo
* @param pageSize
* @param pageable Spring
* @return
*/
Page<Shop> pageShop(Integer pageNo,Integer pageSize,Pageable pageable);
Impl:
@Override
public Page<Shop> pageShop(Integer pageNo, Integer pageSize, Pageable pageable) {
// ,
// 0
pageable = PageRequest.of(pageNo,pageSize, Sort.Direction.DESC, "shopId");
return shopRepository.findAll(pageable);
}
controller:
@GetMapping("/pageShop/{pageNo}/{pageSize}")
public String pageShop(@PathVariable Integer pageNo,
@PathVariable Integer pageSize,Pageable pageable){
return JSON.toJSONString(shopService.pageShop(pageNo, pageSize, pageable));
}
연속 표 조회VO(value object)값 대상
4.567917.보통 업무 층 간 의 데이터 전달 에 사용 되 는데 데이터 만 포함 할 뿐이다.
업무 처리 가 완 료 된 대상 을 페이지 에 사용 할 데이터 로 밀봉 합 니 다.
연결 표 조회 결 과 를 받 기 위해 ShopAndShopClassVo 를 만 듭 니 다.
enity,여기 인삼 구조 가 있어 야 합 니 다.안 으로 값 을 부여 해 야 합 니 다.
package com.shy.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ShopAndShopClassVo {
private String shopName;
private double price;
private String shopClassName;
}
ShopRepository:
//
@Query("select new com.shy.vo.ShopAndShopClassVo(s.shopName,s.price,sc.shopClassName) from Shop s,ShopClass sc " +
"where s.shopClassId=sc.shopClassId and sc.shopClassName=?1")
List<ShopAndShopClassVo> findShopInfo(String shopClassName);
JPQL 에서 조회 하 는데 그 특징 은 원래 의 SQL 문장 과 유사 하고 대상 을 대상 으로 하 며 클래스 이름과 속성 을 통 해 접근 하 는 것 이지 테이블 이름과 테이블 속성 이 아 닙 니 다.service:
//
List<ShopAndShopClassVo> findShopInfo(String shopClassName);
Impl:
@Override
public List<ShopAndShopClassVo> findShopInfo(String shopClassName) {
return shopRepository.findShopInfo(shopClassName);
}
controller:
@GetMapping("/andFind/{name}")
public String findShopInfo(@PathVariable("name") String shopClassName){
return JSON.toJSONString(shopService.findShopInfo(shopClassName));
}
6.조별 조회데 이 터 를 받 는 또 다른 쓰기 방법 으로 결과 집합 인 터 페 이 스 를 만들어 서 연결 표 조회 후의 결 과 를 받 습 니 다.
결과 집합 인터페이스 류 를 정의 합 니 다.인터페이스 류 의 내용 은 상품 표 와 상품 유형 표 에서 나 옵 니 다.
entity:
package com.shy.entity;
public interface GroupShop {
String getNum();
String getShopClassName();
}
실행 중 Spring 은 인터페이스(GroupShop)에 되 돌아 오 는 결 과 를 받 기 위해 프 록 시 클래스 를 자동 으로 생산 합 니 다.코드 에 서 는 getXX 형식 으로 가 져 옵 니 다.ShopRepository:
//
@Query("select count(s.shopName) as ,sc.shopClassName as from Shop s,ShopClass sc where s.shopClassId=sc.shopClassId group by s.shopClassId")
List<GroupShop> groupShop();
service:
//
List<GroupShop> groupShop();
Impl:
@Override
public List<GroupShop> groupShop() {
return shopRepository.groupShop();
}
controller:
@GetMapping("/groupShop")
public String groupShop(){
return JSON.toJSONString(shopService.groupShop());
}
7.my batis 와 비교이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.