SpringData 기반 SpringBoot 빠 른 입문

21525 단어 SpringDataJPA
이 장 에 서 는 SpringData 와 SpringBoot 관련 지식 을 배 워 서비스 구조 (SOA) 를 위 한 단일 로그 인 시스템 (SSO) 에 필요 한 코드 를 구현 한다.이렇게 하면 실전 에서 두 프레임 워 크 의 지식 을 배 울 수 있 고 단일 로그 인 시스템 에 기반 을 다 질 수 있다.이 장 을 통 해 SpringBoot 프로젝트 의 구축, Starter pom 의 사용, 전역 파일 설정, 핵심 주해 SpringBootApplication 소개 및 단원 테스트 SpringBootTest 주해 의 사용 을 파악 할 수 있 습 니 다.SpringData 의 입문 사용, Repository 인터페이스의 사용, 조회 방법 키워드 의 규칙 정의, @ Query, @ Modifying 주해 의 사용, 마지막 으로 개발 중의 건의 와 문제 입 니 다.글 밑 에 원본 코드 를 제공 합 니 다.
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 를 기반 으로 빠 른 입문 이 끝 났 습 니 다. 문제 가 있 으 면 가르쳐 주세요. 괜 찮 으 면 추천 을 눌 러 보 세 요.

좋은 웹페이지 즐겨찾기