SpringData 기반 SpringBoot 빠 른 입문
21525 단어 SpringDataJPA
SpringBoot 지식
SpringBoot 는 Spring 응용 을 간소화 하고 개발 하 는 프레임 워 크 입 니 다.개발 과정 에서 우 리 는 항상 xml 파일 을 설정 하여 제3자 기술 을 통합 시킨다.이 중복 통합 작업 은 스프링 부 트 에 맡 겼 다.SpringBoot 는 '습관 이 설정 보다 낫다' 는 이념 을 사용 하여 프로젝트 를 신속하게 구축 하고 운영 하도록 도와 준다.주류 개발 프레임 워 크 는 배치 없 이 통합 할 수 있다.필자 가 사용 하 는 개발 도 구 는 sts (Spring Tool Suite) 로 그 조작 은 eclipse 와 거의 일치 합 니 다.이 도구 가 없 으 면 Maven 프로젝트 를 만 드 는 것 은 같 습 니 다.
Starter pom
Maven 프로젝트 핵심 프로필 pom. xml 먼저 보기
4.0.0
com.itdragon
springbootStudy
0.0.1-SNAPSHOT
war
springbootStudy
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-tomcat
provided
org.springframework.boot
spring-boot-starter-test
test
org.apache.tomcat.embed
tomcat-embed-jasper
provided
javax.servlet
jstl
org.springframework.boot
spring-boot-maven-plugin
세심 한 동창 회 는 이 파일 에 대량의 spring - boot - starter - * 문구 가 나타 나 는 것 을 발견 했다.SpringBoot 가 개발 의 비밀 을 간소화 할 수 있 는 이 유 는 바로 여기에 있다. :부모 의존, SpringBoot 프로젝트 의 표지.안에 jar 버 전이 많이 들 어 있 습 니 다. spring - boot - starter - web. :웹 프로젝트 에 대한 지원 은 SpringMVC 와 tomcatspring - boot - starter - data - jpa 를 포함 합 니 다. :JPA 에 대한 지원 에는 자주 사용 되 는 SpringData 와 Hibernate 가 포함 되 어 있 으 며, Mybatis 는 없습니다. spring - boot - starter - tomcat :tomcat 를 Servlet 용기 spring - boot - starter - test 로 사용 합 니 다. :JUnit 같은 일반적인 테스트 프레임 워 크 에 대한 지원 은 아직 많 습 니 다.
전역 파일 설정
SpringBoot 프로젝트 전역 프로필 application. properties 다시 보기
# tomcat server.port=8081# SpringMVC spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp# , tomcat , tomcat spring.datasource.url=jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver# :Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not setspring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect# , validate | update | create | create-dropspring.jpa.properties.hibernate.hbm2ddl.auto=update# sql spring.jpa.show-sql=true
전역 프로필 은 application. properties 일 수도 있 고 application. yml 일 수도 있 습 니 다. resources 디 렉 터 리 에 두 는 것 을 권장 합 니 다.더 많은 설정:https://github.com/ITDragonBlog/daydayup/blob/master/SpringBoot/SpringData/springbootStudy/src/main/resources/springboot.properties
핵심 주해
마지막 으로 SpringBoot Hello World 프로젝트 의 입구 류 입 니 다. 다음 자바 파일 만 있 으 면 main 방법 을 실행 하면 페이지 의 점프 와 데이터 반환 기능 을 실현 할 수 있 습 니 다.
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controller@SpringBootApplicationpublic class SpringbootStudyApplication {
@RequestMapping("/") public String index() { return "index";
}
@RequestMapping("hello") @ResponseBody
public String helloWorld() { return "Hello SpringBoot !";
} public static void main(String[] args) {
SpringApplication.run(SpringbootStudyApplication.class, args);
}
}
@ SpringBootApplication: SpringBoot 의 핵심 주석 으로 입구 류 에 사 용 됩 니 다.이것 은 하나의 조합 주석 입 니 다. 그 중에서 주요 내용 은 세 가지 @ SpringBootConfiguration 입 니 다. 하나의 클래스 주석 입 니 다. 지시 대상 은 bean 정의 소스 입 니 다. xml 의 beans 로 이해 할 수 있 습 니 다. 보통 @ Bean 주석 과 함께 사용 합 니 다. @EnableAutoConfiguration: Spring 프로그램 컨 텍스트 의 자동 설정 을 사용 하여 필요 한 bean 을 추측 하고 설정 하려 고 합 니 다.자동 설정 클래스 는 보통 classpath 와 정 의 된 beans 대상 을 기반 으로 합 니 다. @Componentscan: 이 설명 은 지정 한 가방 에 표 시 된 모든 @ Component, @ Service, @ Repository, @ Controller 주석 클래스 를 자동 으로 검색 하여 bean 으로 등록 합 니 다.
SpringData 입구 클래스
package com.itdragon;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class StartApplication {
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
}
}
SpringDataJPA 지식
SpringData 는 데이터베이스 접근 을 간소화 하고 클 라 우 드 서 비 스 를 지원 하 는 오픈 소스 프레임 워 크 입 니 다.비 관계 형 데이터베이스 (NoSQL) 와 관계 형 데이터 베 이 스 를 지원 합 니 다.그 주요 목적 은 데이터베이스 에 대한 접근 을 편리 하고 빠르게 하 는 것 이다.스프링 데이터 JPA 는 스프링 이 제공 하 는 간소화 JPA 개발 의 프레임 워 크 로, 데이터 액세스 층 의 개 발 량 을 줄 이 는 데 주력 하고 있다.
POJO 층
실체 클래스 User 테이블 을 만 듭 니 다. 대응 하 는 데이터베이스 테이블 이름 은 itdragon 입 니 다.user, id 는 자체 성장 의 메 인 키 로 서 plainPassword 는 데이터베이스 에 저장 되 지 않 는 명문 암호 입 니 다.
import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;import javax.persistence.Transient;/**
*
* @author itdragon
*
*/@Table(name="itdragon_user")
@Entitypublic class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO) private Long id; //
private String account; //
private String userName; //
@Transient
private String plainPassword; // ,
private String password; //
private String salt; //
private String iphone; //
private String email; //
private String platform; //
private String createdDate; //
private String updatedDate; //
// get/set/toString }
Repository 인터페이스 층
UserRepository 를 만 드 는 것 은 SpringData 의 핵심 지식 입 니 다. 코드 를 먼저 보 겠 습 니 다.
import java.util.List;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.jpa.repository.Modifying;import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.PagingAndSortingRepository;import org.springframework.data.repository.query.Param;import com.itdragon.pojo.User;/**
* :SpringData Repository
*
* CrudRepository
* - T save(T entity); //
* - T findOne(ID id); // id
* - void delete(ID/T/Iterable); // Id , ,
* PagingAndSortingRepository
* - // ,
* - Iterable findAll(Sort sort); //
* - Page findAll(Pageable pageable); // ( )
* JpaSpecificationExecutor Specification( JPA Criteria )
* - List findAll(Specification spec);
* - Page findAll(Specification spec, Pageable pageable);
* - List findAll(Specification spec, Sort sort);
*
*
* 1.
* 2. CrudRepository findAll() 。 , findAll , 。
* 3. CrudRepository deletAll() 。 , 。
* 4. PagingAndSortingRepository JpaSpecificationExecutor 。
*/public interface UserRepository extends PagingAndSortingRepository,
JpaSpecificationExecutor{
/** * :SpringData * * 1. find | read | get , find * findByAccount : account User * account User , * 2. Or,Between,isNull,Like,In * findByEmailEndingWithAndCreatedDateLessThan : , xx * And : * EndingWith : * LessThan : * * * User( ) Platform( ) , User platformId * SpringData : * findByPlatFormId platformId * findByPlatForm_Id platform id * * * , , 。 */
// 1
User findByAccount(String account); // 2 xx
List findByEmailEndingWithAndCreatedDateLessThan(String email, String createdDate); /** * : @Query * * ( sql ), ----- , * 1. @Query , nativeQuery=true sql * 2. @Modifying , , * 3. SpringData , * * * @Query ,SpringData : * ?1 ... ?2 * :xxx ... :yyy xxx yyy , @Param("xxx") * %xxx% * * * 1. , * 2. @Query, */
// 3
@Query(value="SELECT count(u.id) FROM User u WHERE u.platform = :platform AND u.updatedDate <= :updatedDate")
long getActiveUserCount(@Param("platform")String platform, @Param("updatedDate")String updatedDate);
// 4
@Query(value="SELECT u FROM User u WHERE u.email LIKE %?1% OR u.iphone LIKE %?2%") List findByEmailAndIhpneLike(String email, String iphone);
// 5
@Modifying
@Query("UPDATE User u SET u.email = :email WHERE u.id = :id") void updateUserEmail(@Param("id") Long id, @Param("email") String email); // 6
@Modifying
@Query("update Variable v set v.lastSavedValue =:#{#variable.lastSavedValue}, v.lastSavedValueTime =:#{#variable.lastSavedValueTime} where v.id=:#{#variable.id}")
Variable updateVariableValue(Variable: variable);
}
코드 에는 모두 다섯 가지 방법 이 있 는데, 모든 방법 에는 많은 지식 이 포함 되 어 있다.방법 1 과 방법 2 는 주로 SpringData 키워드 의 용법 을 소개 한다.1 키워드 분석 은 여기 서 findByPlatFormId () 방법 으로 SpringData 분석 조회 방법의 절 차 를 소개 합 니 다.첫 번 째 단계: 키워드 findBy 두 번 째 단계: 나머지 PlatFormId 이니셜 소문 자 를 제거 하고 User 대상 에서 이 속성 이 있 는 지 찾 고 있 으 면 조회 하고 끝 냅 니 다.없 으 면 세 번 째 단계: platFormId, 오른쪽 에서 왼쪽 으로 첫 번 째 대문자 로 캡 처 한 다음 에 나머지 platForm 이 User 대상 인지 여 부 를 판단 하여 끝 날 때 까지 순환 합 니 다.2 직렬 속성 구분 만약 조회 의 속성 이 실체 류 라면 오해 와 충돌 을 피하 기 위해 "" 로 속성 중의 속성 3 을 표시 합 니 다. 페이지 순 서 를 조회 합 니 다. findByPlatFormId () 방법 으로 정렬 하거나 페이지 를 나 누 려 면 Pageable, Sort 인 자 를 뒤에 추가 할 수 있 습 니 다.findByPlatFormId(String platFormId, Pageable pageable)findByPlatFormId(String platFormId, Sort sort)4 기타 키워드
방법 3 부터 방법 5 까지 주로 @ Query 주해 의 사용 을 소개 합 니 다.1 전송 방식 색인 매개 변수:?n, n 은 1 부터 첫 번 째 인 자 를 표시 합 니 다.방법 이 들 어 오 는 매개 변수의 순서 와 개 수 는 n 과 일치 해 야 합 니 다.이름 매개 변수: key, 전 참 은 @ Param ("key") 주석 수식 2 가 있어 야 합 니 다. 원생 적sql@Query주 해 는 로 컬 조 회 를 지원 합 니 다. 즉, 원생 sql 문 구 를 사용 합 니 다.예: @ Query (value = "xxxx", nativeQuery = true) 3 Modifying 이 수정 작업 을 직접 수행 하면 SpringDataJPA 는 오류 정 보 를 Executing an update / delete query 에 알려 줍 니 다.Spring Data 의 기본 검색 어 는 읽 기 전용 으로 밝 혀 졌 기 때 문 입 니 다.그래서 우 리 는 Service 층 에 @ Transactional 주 해 를 추가 해 야 합 니 다.
SpringDataJPA 핵심 지식 Repository 인터페이스 1 Repository: 빈 인터페이스, 표지 역할 은 모든 계승 이 Repository 인터페이스 류 2 임 을 나타 낸다. CrudRepository: Repository 를 계승 하여 CRUD 관련 방법 을 실현 하 였 습 니 다. 3 paging AndSorting Repository: CrudRepository 를 계승 하여 페이지 정렬 과 관련 된 방법 4 를 실현 하 였 습 니 다. JpaRepository: paging AndSorting Repository 를 계승 하여 JPA 규범 과 관련 된 방법 5 Jpa SpecificationExecutor: Repository 시스템 에 속 하지 않 고 JPA Criteria 조회 와 관련 된 방법 을 실현 합 니 다. Paging AndSorting Repository 와 Jpa SpecificationExecutor 는 기본적으로 기업 의 대부분 수 요 를 만족시킨다.Repository 도 사용자 정의 할 수 있 으 며, JpaRepository 를 계승 하면 일반적인 데이터 액세스 제어 층 의 능력 을 갖 출 수 있다.각 인터페이스 클래스 에 들 어가 서 단축 키 Ctrl + o 를 사용 하면 현재 클래스 의 모든 방법 을 볼 수 있 기 때문에 여기에 붙 이지 않 습 니 다.
서비스 층
UserService 를 만 들 고 주 해 를 추가 합 니 다 @ Transactional
import javax.transaction.Transactional;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.itdragon.common.ItdragonResult;import com.itdragon.pojo.User;import com.itdragon.repository.UserRepository;@Service@Transactionalpublic class UserService {
@Autowired
private UserRepository userRepository;
public ItdragonResult registerUser(User user) { // , , ,
if (null != userRepository.findByAccount(user.getAccount())) { return ItdragonResult.build(400, "");
}
userRepository.save(user); // 。
return ItdragonResult.build(200, "");
}
public ItdragonResult editUserEmail(String email) { // Session , Session id, SOA , FIXME
long id = 3L; // ,
userRepository.updateUserEmail(id, email); return ItdragonResult.ok();
}
}
유닛 테스트
SpringBoot 의 단원 테스트 는 @ RunWith 와 @ SpringBootTest 주석 을 사용 해 야 합 니 다. 코드 주석 에 상세 하 게 소개 되 어 있 습 니 다.
import java.util.List;import javax.persistence.criteria.CriteriaBuilder;import javax.persistence.criteria.CriteriaQuery;import javax.persistence.criteria.Predicate;import javax.persistence.criteria.Root;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.domain.Page;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Sort;import org.springframework.data.domain.Sort.Direction;import org.springframework.data.domain.Sort.Order;import org.springframework.data.jpa.domain.Specification;import org.springframework.test.context.junit4.SpringRunner;import com.itdragon.StartApplication;import com.itdragon.common.ItdragonUtils;import com.itdragon.pojo.User;import com.itdragon.repository.UserRepository;import com.itdragon.service.UserService;/**
* @RunWith
* @RunWith(SpringRunner.class) Spring , spring Spring
* @SpringBootTest(classes=StartApplication.class) StartApplication.class , bean 。
*
* @author itdragon
*
*/@RunWith(SpringRunner.class)@SpringBootTest(classes=StartApplication.class)public class SpringbootStudyApplicationTests {
@Autowired
private UserService userService; @Autowired
private UserRepository userRepository; @Test
public void contextLoads() {
}
@Test // ,
public void registerUser() {
User user = new User();
user.setAccount("gitLiu");
user.setUserName("ITDragonGit");
user.setEmail("[email protected]");
user.setIphone("12349857999");
user.setPlainPassword("adminroot");
user.setPlatform("github");
user.setCreatedDate(ItdragonUtils.getCurrentDateTime());
user.setUpdatedDate(ItdragonUtils.getCurrentDateTime());
ItdragonUtils.entryptPassword(user);
userService.registerUser(user);
}
@Test // SpringData
public void findByEmailEndingWithAndCreatedDateLessThan() {
List users = userRepository.findByEmailEndingWithAndCreatedDateLessThan("qq.com", ItdragonUtils.getCurrentDateTime());
System.out.println(users.toString());
}
@Test // SpringData @Query
public void getActiveUserCount() { long activeUserCount = userRepository.getActiveUserCount("weixin", ItdragonUtils.getCurrentDateTime());
System.out.println(activeUserCount);
}
@Test // SpringData @Query , like
public void findByEmailAndIhpneLike() {
List users = userRepository.findByEmailAndIhpneLike("163.com", "6666");
System.out.println(users.toString());
}
@Test // SpringData @Query @Modifying
public void updateUserEmail() { /**
* org.springframework.dao.InvalidDataAccessApiUsageException:Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
* userRepository.updateUserEmail(3L, "[email protected]");
*/
userService.editUserEmail("[email protected]");
}
@Test // SpringData PagingAndSortingRepository
public void testPagingAndSortingRepository() { int page = 1; // 0 ,
int size = 3; //
PageRequest pageable = new PageRequest(page, size, new Sort(new Order(Direction.ASC, "id")));
Page users = userRepository.findAll(pageable);
System.out.println(users.getContent().toString()); // 5 , ,id 4,5 ( , )
}
@Test // SpringData JpaSpecificationExecutor
public void testJpaSpecificationExecutor(){ int pageNo = 1; int pageSize = 3;
PageRequest pageable = new PageRequest(pageNo, pageSize);
Specification specification = new Specification() { @Override
public Predicate toPredicate(Root root,
CriteriaQuery> query, CriteriaBuilder cb) {
Predicate predicate = cb.gt(root.get("id"), 1); // id 1
return predicate;
}
};
Page users = userRepository.findAll(specification, pageable);
System.out.println(users.getContent().toString()); // 5 , ,id 5
}
}
이 가능 하 다, ~ 할 수 있다,...
프로젝트 시작 시 알 수 없 는 문자 집합 알림: 'utf8mb 4'
이 로 인 한 원인 은 my sql 서버 버 전의 설치 가 정확 하지 않 고 해결 방법 은 두 가지 가 있 습 니 다.첫 번 째: my sql - connector - 자바 jar 패키지 버 전 은 5.1.6 (추천 하지 않 음) 으로 바 꿉 니 다.현재 jar 버 전 은 5.1.44 입 니 다.두 번 째: my sql 버 전 을 다시 설치 합 니 다. 현재 최신 버 전 은 5.7 입 니 다.교과 과정 이 모두 준비 되 었 다.https://www.cnblogs.com/sshoub/p/4321640.html (mysql 설치)http://blog.csdn.net/y694721975/article/details/52981377 (mysql 마 운 트 해제)
SpringBoot 연결 풀 설정 의혹
저 희 는 전체 프로필 에 관련 값 을 설정 하고 연결 풀 설정 을 완 료 했 을 뿐 모두 가 의심 하고 있 을 것 입 니 다.사실 pom. xml 파일 에 spring - boot - starter - data - jpa 를 추가 하면 SpringBoot 는 tomcat - jdbc 연결 풀 을 자동 으로 사용 합 니 다.물론 우리 도 다른 연결 탱크 를 사용 할 수 있다.https://www.cnblogs.com/gslblog/p/7169481.html (springBoot 데이터베이스 연결 탱크 상용 설정)https://www.cnblogs.com/xiaosiyuan/p/6255292.html (SpringBoot 사용 c3p 0)
STS 도구 ctrl + shift + o 리 셋 단축 키 실효
해결 방법: preference - > genel - > keys, Organize Imports 를 찾 은 다음 When 에서 Editing Java Source 를 선택 하 십시오.
총결산
1 SpringDataJPA 는 JPA 개발 을 간소화 하 는 프레임 워 크 이 고, SpringBoot 는 프로젝트 개발 을 간소화 하 는 프레임 워 크 다.2 spring - boot - starter - parent 는 SpringBoot 프로젝트 의 표지 입 니 다. 3 SpringBootApplication 주 해 는 SpringBoot 프로젝트 의 입구 4 SpringData 는 키워드 조회 와 @ Query 주 해 를 통 해 데이터 베 이 스 를 방문 합 니 다.
원본 주소:https://github.com/ITDragonBlog/daydayup/tree/master/SpringBoot/SpringData
여기까지 SpringData 는 SpringBoot 를 기반 으로 빠 른 입문 이 끝 났 습 니 다. 문제 가 있 으 면 가르쳐 주세요. 괜 찮 으 면 추천 을 눌 러 보 세 요.