springboot+JPA의 구축 굵은 절차와 튜토리얼(지속적인 업데이트)
45309 단어 필기
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의 특유한 실현이다.
@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 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);
}
**
* nativeQuery=true SQL
* @return
*/
@Query(value = "SELECT count(id) FROM jpa_persons", nativeQuery = true)
long getTotalCount();
스프링 데이터 JPA에서는 신규 및 업데이트 작업이 모두 save() 방식으로 진행되는데, JPA는 어떤 방법으로 우리가 insert를 진행할지 업데이트를 진행할지 알 수 있을까?테스트를 통해 JPA가 프로그램에서 호출한save () 방법으로 updata나 insert 조작을 판단하는 근거는 실체 대상의 키가 부여되었는지 여부입니다.JPA는 우선 메인 키를 통해 데이터베이스에 이 ID가 있는지 확인합니다. 찾지 못하면 insert 방법을 실행하고, 반대로 찾으면 업데이트 방법을 실행합니다.
따라서 업데이트 부분 필드에서 JPA는 insert를 실행하는지 업데이트를 실행하는지 판단할 수 있을 뿐 일부 필드를 업데이트하는지 판단할 수 없습니다.따라서 값이 지정되지 않은 필드는 NULL로 덮어씁니다.따라서 솔리드 객체를 통해 업데이트하는 것은 바람직하지 않습니다.JPA의 필드를 업데이트하는 방법은 다음과 같습니다.
여기서 두 번째 방법을 사용하고 코드를 직접 보겠습니다.
@Modifying
@Query(value = "UPDATE Admin set adminToken = :adminToken where id = :id")
int updateAdminToken(@Param("adminToken") String adminToken ,@Param("id")Long id);
여기 점이 몇 개 있어요.
@Transactional//
@RunWith(SpringRunner.class)
@SpringBootTest
@Rollback(value = false)// springboot , Rollback false
public class DemoApplicationTests {
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
static 간단한 설명static 방법은 일반적으로 정적 방법이라고 부른다. 정적 방법은 어떠한 대상에 의존하지 않고 접근할 수 있기 때문에 정적 방법에 있어this는 없다. 왜냐하면 그 어떠한 대상에도 의존하지 않기 때문이다. 대상이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.