springboot+JPA의 구축 굵은 절차와 튜토리얼(지속적인 업데이트)

45309 단어 필기
세우다
  • idea 선택 mysql JPA 모듈
  • entity 클래스 작성
    package com.gdou.survey.demo.entity;
    
    import javax.persistence.*;
    import java.io.Serializable;
    import java.util.Date;
    
    //   
    @Entity//        ,         javax.persistence.* 
    @Table(name="tb_user")//          
    public class User implements Serializable {
        //  ID
        @Id//       
        @GeneratedValue(strategy = GenerationType.AUTO)//      
        private Integer userId;
        //    
        @Column(name = "creat_time")//             
        private Date creatTime;
        //    
        @Column(name = "user_name")
        private String userName;
        //       
        @Column(name = "user_q1")
        private String userQ1;
        //       
        @Column(name = "user_q2")
        private String userQ2;
        //       
        @Column(name = "user_q3")
        private String userQ3;
        //       
        @Column(name = "user_q4")
        private String userQ4;
        //       
        @Column(name = "user_q5")
        private String userQ5;
        //       
        @Column(name = "user_q6")
        private String userQ6;
        //       
        @Column(name = "user_q7")
        private String userQ7;
        //    
        @Column(name = "user_tel")
        private String userTel;
        //         
        @Column(name = "admin_info")
        private String adminInfo;
    
        public User() {
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "userId=" + userId +
                    ", creatTime=" + creatTime +
                    ", userName='" + userName + '\'' +
                    ", userQ1='" + userQ1 + '\'' +
                    ", userQ2='" + userQ2 + '\'' +
                    ", userQ3='" + userQ3 + '\'' +
                    ", userQ4='" + userQ4 + '\'' +
                    ", userQ5='" + userQ5 + '\'' +
                    ", userQ6='" + userQ6 + '\'' +
                    ", userQ7='" + userQ7 + '\'' +
                    ", userTel='" + userTel + '\'' +
                    ", adminInfo='" + adminInfo + '\'' +
                    '}';
        }
    
        public Integer getUserId() {
            return userId;
        }
    
        public void setUserId(Integer userId) {
            this.userId = userId;
        }
    
        public Date getCreatTime() {
            return creatTime;
        }
    
        public void setCreatTime(Date creatTime) {
            this.creatTime = creatTime;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getUserQ1() {
            return userQ1;
        }
    
        public void setUserQ1(String userQ1) {
            this.userQ1 = userQ1;
        }
    
        public String getUserQ2() {
            return userQ2;
        }
    
        public void setUserQ2(String userQ2) {
            this.userQ2 = userQ2;
        }
    
        public String getUserQ3() {
            return userQ3;
        }
    
        public void setUserQ3(String userQ3) {
            this.userQ3 = userQ3;
        }
    
        public String getUserQ4() {
            return userQ4;
        }
    
        public void setUserQ4(String userQ4) {
            this.userQ4 = userQ4;
        }
    
        public String getUserQ5() {
            return userQ5;
        }
    
        public void setUserQ5(String userQ5) {
            this.userQ5 = userQ5;
        }
    
        public String getUserQ6() {
            return userQ6;
        }
    
        public void setUserQ6(String userQ6) {
            this.userQ6 = userQ6;
        }
    
        public String getUserQ7() {
            return userQ7;
        }
    
        public void setUserQ7(String userQ7) {
            this.userQ7 = userQ7;
        }
    
        public String getUserTel() {
            return userTel;
        }
    
        public void setUserTel(String userTel) {
            this.userTel = userTel;
        }
    
        public String getAdminInfo() {
            return adminInfo;
        }
    
        public void setAdminInfo(String adminInfo) {
            this.adminInfo = adminInfo;
        }
    
        public User(Integer userId, Date creatTime, String userName, String userQ1, String userQ2, String userQ3, String userQ4, String userQ5, String userQ6, String userQ7, String userTel, String adminInfo) {
            this.userId = userId;
            this.creatTime = creatTime;
            this.userName = userName;
            this.userQ1 = userQ1;
            this.userQ2 = userQ2;
            this.userQ3 = userQ3;
            this.userQ4 = userQ4;
            this.userQ5 = userQ5;
            this.userQ6 = userQ6;
            this.userQ7 = userQ7;
            this.userTel = userTel;
            this.adminInfo = adminInfo;
        }
    }
    
    

    Repository 작성
    package com.gdou.survey.demo.repository;
    
    import com.gdou.survey.demo.entity.User;
    import org.springframework.data.repository.PagingAndSortingRepository;
    
    public interface UserRepository extends PagingAndSortingRepository<User, Integer> {
    
    }
    

    User Repository 클래스를 작성하여 Paging And Sorting Repository(페이지 나누기 및 정렬 기능이 있는 Repository) 또는 Crud Repository(일반 CRUD 기능이 있는 Repository)를 계승하고 그 중에서 범주를 사용합니다.
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package org.springframework.data.repository;
    
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.domain.Sort;
    //  T   Repository   entity,ID      
    @NoRepositoryBean
    public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
        Iterable<T> findAll(Sort var1);
    
        Page<T> findAll(Pageable var1);
    }
    
    

    Controller 작성
    package com.gdou.survey.demo.controller;
    
    import com.gdou.survey.demo.entity.User;
    import com.gdou.survey.demo.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
    
    import java.util.Date;
    import java.util.Optional;
    
    @RestController
    @RequestMapping(path = "/demo")
    public class UserController {
        //      
        @Autowired
        private UserRepository userRepository;
    
        @GetMapping(value = "/user/{id}")
        public User getUser(@PathVariable("id")Integer id ){
            //      Optional
            Optional<User> user = userRepository.findById(id);
            if(user.isPresent()){
                return user.get();
            }
            return null;
        }
        @RequestMapping(value = "/save")
        public User addNewUser(@RequestBody User user){
            user.setCreatTime(new Date());
            userRepository.save(user);
            return user;
        }
    }
    

    관련 구성
    spring을 구성합니다.데이터소스 데이터,yml 설정 사용
    spring:
      datasource:
        username: root
        password: admin
        driver-class-name: com.mysql.cj.jdbc.Driver
        url:  jdbc:mysql://localhost:3306/surveysystem?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
      jpa:
        show-sql: true #  JSP    SQL  
    
    

    여기에 여러 시간대 설정이 설정되어 있습니다. 필자가 뛰고 나서 오류가 발생했기 때문입니다. 이 설정만 추가하면 오류가 발생하지 않습니다.
    2019-04-01 업데이트
    @Query 메모 정보
    JPA에서 @Query 메모 질의를 지원하므로 질의하는 데이터가 키워드 질의를 통해 결과를 얻을 수 없는 질의에 적용됩니다.이런 조회는 키워드 조회와 같은 제약에서 벗어나 조회를 상응하는 인터페이스 방법에서 직접 설명하고 구조를 더욱 명확하게 할 수 있다. 이것은 Spring Data의 특유한 실현이다.
  • 인덱스 매개 변수와 명칭 매개 변수
  • 인덱스 매개 변수는 다음과 같습니다. 인덱스 값은 1부터 시작하고 검색에서 **"?X"** 개수는 방법이 정의한 매개 변수의 개수와 일치하며 순서도 일치해야 합니다.
    @Query("SELECT p FROM Person p WHERE p.lastName = ?1 AND p.email = ?2")
    List<Person> testQueryAnnotationParams1(String lastName, String email);
    
    //  @Query         1:    
    @Query("SELECT p FROM Person p WHERE p.lastName = :lastName AND p.email = :email")
    List<Person> testQueryAnnotationParams2(@Param("email") String email, @Param("lastName") String lastName);
    

  • LIKE 키워드가 포함된 쿼리
  • 자리 표시자에'%'를 추가하면 조회 방법에'%'
    // like   Spring Date          %
     @Query("SELECT p FROM Person p WHERE p.lastName LIKE %?1% OR p.email LIKE %?2%")
     List<Person> testQueryAnnotationLikeParam(String lastName, String email);
    
    @Test
    public void testAnnoationParams3() {
    List<Person> persons = personRepsitory.testQueryAnnotationLikeParam("A", "[email protected]");
     System.out.println(persons);
    }
    
  • 를 추가하지 않아도 됩니다.
  • 기본 SQL 쿼리 사용
       **
         *   nativeQuery=true         SQL    
         * @return
         */
        @Query(value = "SELECT count(id) FROM jpa_persons", nativeQuery = true)
        long getTotalCount();
    
  • 여기서 주의해야 할 몇 가지 사항은 다음과 같습니다.
  • JPA의query 주석을 사용한다면 sql문장의 표, 필드는entity류의 필드가 아니라 데이터베이스의 필드로 작성해야 JPA가 데이터베이스 필드로 비춘다
  • 똑같아요. 네이티브 Query()=true 즉 원생 SQL을 사용한다면 테이블과 필드를 데이터베이스 테이블에 대응하는 필드로 작성하는 것을 기억하세요. 틀리기 쉬워요
  • JPA의 매개 변수 주입 즉 (:param), 주입된 매개 변수는 자동으로''''를 가져와 sql 주입을 피한다
  • 부분 필드 업데이트 정보
    스프링 데이터 JPA에서는 신규 및 업데이트 작업이 모두 save() 방식으로 진행되는데, JPA는 어떤 방법으로 우리가 insert를 진행할지 업데이트를 진행할지 알 수 있을까?테스트를 통해 JPA가 프로그램에서 호출한save () 방법으로 updata나 insert 조작을 판단하는 근거는 실체 대상의 키가 부여되었는지 여부입니다.JPA는 우선 메인 키를 통해 데이터베이스에 이 ID가 있는지 확인합니다. 찾지 못하면 insert 방법을 실행하고, 반대로 찾으면 업데이트 방법을 실행합니다.
    따라서 업데이트 부분 필드에서 JPA는 insert를 실행하는지 업데이트를 실행하는지 판단할 수 있을 뿐 일부 필드를 업데이트하는지 판단할 수 없습니다.따라서 값이 지정되지 않은 필드는 NULL로 덮어씁니다.따라서 솔리드 객체를 통해 업데이트하는 것은 바람직하지 않습니다.JPA의 필드를 업데이트하는 방법은 다음과 같습니다.
  • 메인 키를 설정해서save()를 저장합니다.save () 방법으로 필드를 업데이트하려면 Repository를 통해 실체 대상을 가져와야 합니다. 이 대상에서 업데이트 작업을 해야 합니다.
  • @Query 주석을 통해 복잡한 sql 문장을 구현합니다.업데이트나 delete 방법을 실행할 때 @Modifying과 @Transactional을 주석해야 합니다.

  • 여기서 두 번째 방법을 사용하고 코드를 직접 보겠습니다.
        @Modifying
        @Query(value = "UPDATE Admin set adminToken = :adminToken where id = :id")
        int updateAdminToken(@Param("adminToken") String adminToken ,@Param("id")Long id);
    

    여기 점이 몇 개 있어요.
  • 업데이트 작업은 @Modifying 주석을 추가해야 합니다. @Query 주석에서 JPQL이 DELETE와 UPDATE 작업을 수행할 때 @modifying 주석을 붙여서 Spring Data가 DELETE나 UPDATE 작업이라는 것을 알려야 합니다.
  • UPDATE 또는 DELETE 작업에는 트랜잭션이 필요합니다. 이때 서비스 계층을 정의하고 서비스 계층의 방법에 트랜잭션 작업을 추가해야 합니다.필자는test를 사용하여JUNIT4 테스트를 진행한다.springboot의 기본 설정에서test류는 데이터베이스 업데이트와 삭제 작업을 하면 스크롤 작업을 하기 때문에 주석을 붙여야 한다.
    @Transactional//    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Rollback(value = false)//  springboot                ,           Rollback   false
    public class DemoApplicationTests {
    
  • 좋은 웹페이지 즐겨찾기