Spring JPA CURD

12654 단어 SpringJPACURD
1. Spring Data JPA 는 자바 Persistence API 를 재 패 키 징 하 는 프레임 워 크 입 니 다.Java Persistence API 는 Java EE 의 규범 으로 그 실현 제품 은 Hibernate, Eclipse Link 등 가장 유명한 ORM 프레임 워 크 입 니 다.ORM 의 본질은 JDBC 를 봉인 한 것 이다.ORM 은 프로그래머 로 하여 금 OO 의 사고 로 관계 데이터 베 이 스 를 조작 하 게 할 수 있다.
Spring Data JPA 를 사용 하면 다음 과 같은 장점 이 있 습 니 다.
더 이상 수 동 으로 표를 만 들 필요 가 없습니다. SQL 을 삽입 할 필요 가 없습니다. 수정 SQL 을 쓸 필요 가 없습니다. SQL 을 삭제 하 는 간단 한 조회 SQL 을 쓸 필요 가 없습니다. 쓰 지 마 십시오. (모든 기록 을 찾 고 찾 습 니 다) 복잡 한 쓰기 2 핵심 기술 은 Spring Data JPA 를 어떻게 사용 합 니까?
첫 번 째 단 계 는 Spring boot 프로젝트 에 의존 도 를 도입 합 니 다.org. springframework. boot spring - boot - starter - data - jpa 두 번 째 단 계 는 데이터 베 이 스 를 만 들 고 데이터 베 이 스 를 방문 하 는 사용자 이름과 비밀 번 호 를 만 들 며 데이터 베이스 접근 권한 을 설정 합 니 다.과정 략.
세 번 째 단 계 는 데이터베이스 연결 속성 을 설정 합 니 다.application. properties 프로필 에 다음 설정 을 추가 합 니 다:
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/liyongzhendb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.datasource.username=liyongzhendb spring.datasource.password=liyongzhendb
#Spring Boot 2.0 includes HikariDataSource by default spring.datasource.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.connection-timeout=20000 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.maximum-pool-size=12 spring.datasource.hikari.idle-timeout=300000 spring.datasource.hikari.max-lifetime=1200000 spring.datasource.hikari.auto-commit=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect spring.jpa.properties.hibernate.id.new_generator_mappings=false spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true spring.jpa.properties.hibernate.format_sql = true spring. jpa. hibenate. ddl - auto = update spring. jpa. open - in - view = false spring. jpa. show - sql = true 설정 은 알 기 쉽다.spring. jpa. hibenate. ddl - auto 만 소개 합 니 다. 값 은 update 입 니 다. 실체 가 변동 이 있다 는 뜻 입 니 다. 실체 가 속성 을 추가 하면 표 에 해당 하 는 필드 를 추가 합 니 다.
더 많은 application. properties 설정 은 공식 문서 참조https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
다섯 번 째 단계, 실 체 를 만 듭 니 다.실 체 는 경량급 지속 대상 영역 입 니 다.일반적으로 실 체 는 관계 데이터베이스 에 있 는 표를 나타 내 고 모든 실체 인 스 턴 스 는 이 표 의 한 줄 에 대응 합 니 다.더 많은 이론 적 매개 변수 자바 EE 공식 문서https://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html
만 든 실 체 는 다음 과 같 습 니 다:
package com.wangshenghua.model;
import java.time.LocalDate; import java.util.Arrays;
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.validation.constraints.Email; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size;
import org.springframework.format.annotation.DateTimeFormat;
@Entity @Table(name = “user”) public class User {
@NotNull
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@NotNull(message = "     ")
@Size(min = 2, max = 30, message = "   2~30     ")
private String name;

@NotNull(message = "     ")
@Min(message = "    15 ", value = 15)
private Integer age;

@NotNull(message = "     ")
private String gender;

@NotNull
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate dateOfBirth;

@NotEmpty(message = "     ")
@Email(message = "      ")
private String email;

@NotNull
@Size(min = 1, max = 5, message = "    ")
private String[] course;

@NotEmpty(message = "     ")
private String hometown;

@NotEmpty(message = "       ")
private String[] hobbies;

private String memo;

public User() {
}

public User(@NotNull long id,
        @NotNull(message = "     ") @Size(min = 2, max = 30, message = "   2~30     ") String name,
        @NotNull(message = "     ") @Min(message = "    15 ", value = 15) Integer age,
        @NotNull(message = "     ") String gender,
        @NotEmpty(message = "     ") @Email(message = "      ") String email) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.gender = gender;
    this.email = email;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Integer getAge() {
    return age;
}

public void setAge(Integer age) {
    this.age = age;
}

public String getGender() {
    return gender;
}

public void setGender(String gender) {
    this.gender = gender;
}

public LocalDate getDateOfBirth() {
    return dateOfBirth;
}

public void setDateOfBirth(LocalDate dateOfBirth) {
    this.dateOfBirth = dateOfBirth;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String[] getCourse() {
    return course;
}

public void setCourse(String[] course) {
    this.course = course;
}

public String getHometown() {
    return hometown;
}

public void setHometown(String hometown) {
    this.hometown = hometown;
}

public String[] getHobbies() {
    return hobbies;
}

public void setHobbies(String[] hobbies) {
    this.hobbies = hobbies;
}

public String getMemo() {
    return memo;
}

public void setMemo(String memo) {
    this.memo = memo;
}

@Override
public String toString() {
    return "User [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", dateOfBirth="
            + dateOfBirth + ", email=" + email + ", course=" + Arrays.toString(course) + ", hometown=" + hometown
            + ", hobbies=" + Arrays.toString(hobbies) + ", memo=" + memo + "]";
}

} 실 체 는 세 가지 관건 이 있 습 니 다. 하나의 주석 @ Entity 는 이러한 것 을 하나의 실체 로 지정 합 니 다.두 번 째 주석 @ Table 은 이 실체 가 관계 데이터베이스 에 비 친 표를 지정 합 니 다.세 번 째 주석 @ Id 와 @ Generated Value 는 메 인 키 와 메 인 키 생 성 정책 을 지정 하 는 데 사 용 됩 니 다.
여섯 번 째 단 계 는 CrudRepository 인 터 페 이 스 를 실현 하 는 인 터 페 이 스 를 만 듭 니 다.CrudRepository 인 터 페 이 스 를 실현 하면 CURD 의 능력 을 갖 출 수 있다.
package com.wangshenghua.dao;
import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository;
import com.wangshenghua.model.User;
@Repository public interface UserRepository extends CrudRepository {
} Spring 프레임 워 크 는 층 을 나 누 어 계획 하 는 것 이 좋 습 니 다.데이터베이스 접근 층, 주석 @ Repository 를 사용 합 니 다.@ Controller 나 @ Service 를 사용 하지 마 세 요.
CrudRepository 인 터 페 이 스 는 범 형 입 니 다. 구체 적 인 실체 이름 User 와 실체의 메 인 키 유형 Long 을 대 입 해 야 합 니 다.
일곱 번 째 단계, 컨트롤 러 층 은 어떻게 UserRepository 를 호출 합 니까?
package com.wangshenghua.controller;
import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional;
import javax.validation.Valid;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping;
import com.wangshenghua.dao.UserRepository; import com.wangshenghua.model.User;
@Controller public class UserController {
private static final Logger log = LoggerFactory.getLogger(UserController.class);

final static Map RADIO_GENDER = Collections.unmodifiableMap(new LinkedHashMap() {
    private static final long serialVersionUID = 1L;
    {
        put(" ", " ");
        put(" ", " ");
    }
});

final static Map CHECK_COURSE = Collections.unmodifiableMap(new LinkedHashMap() {
    private static final long serialVersionUID = 1L;

    {
        put("Java    ", "java");
        put("Spring", "spring");
        put("MySQL", "mysql");
        put("HTML", "html");
    }
});

final static Map SELECT_HOMETOWN = Collections.unmodifiableMap(new LinkedHashMap() {
    private static final long serialVersionUID = 1L;
    {
        put("  ", "  ");
        put("  ", "  ");
        put("  ", "  ");
    }
});

final static Map SELECT_HOBBIES = Collections.unmodifiableMap(new LinkedHashMap() {
    private static final long serialVersionUID = 1L;
    {
        put("  ", "  ");
        put("  ", "  ");
        put("   ", "   ");
        put("   ", "   ");
        put("   ", "   ");
    }
});

@Autowired
private UserRepository userDao;

/**        **/

@GetMapping("/")
public String index() {
    return "redirect:/allUser";
}

@GetMapping("/allUser")
public String allUser(Model model) {
    model.addAttribute("users", userDao.findAll());
    return "list-user";
}

@GetMapping("/adduser")
public String showAddUserForm(Model model) {
    User user = new User();
    model.addAttribute("user", user);
    model.addAttribute("radioItems", RADIO_GENDER);
    model.addAttribute("checkItems", CHECK_COURSE);
    model.addAttribute("selectItems", SELECT_HOMETOWN);
    model.addAttribute("multipleItems", SELECT_HOBBIES);
    return "add-user";
}

@PostMapping("/adduser")
public String addUser(@Valid User user, BindingResult bindingResult, Model model) {

    if (bindingResult.hasErrors()) {
        model.addAttribute("user", user);
        model.addAttribute("radioItems", RADIO_GENDER);
        model.addAttribute("checkItems", CHECK_COURSE);
        model.addAttribute("selectItems", SELECT_HOMETOWN);
        model.addAttribute("multipleItems", SELECT_HOBBIES);
        return "add-user";
    }

    userDao.save(user);
    return "redirect:/allUser";
}

@GetMapping("/edit/{id}") // {id}    
public String showUpdateForm(@PathVariable("id") long id, Model model) { // @PathVariable     
    Optional user = userDao.findById(id);
    model.addAttribute("user", user);
    return "update-user";
}

@PostMapping("/update/{id}")
public String updateUser(@PathVariable("id") long id, @Valid User user, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "update-user";
    }
    userDao.save(user);
    return "redirect:/allUser";
}

@GetMapping("/delete/{id}")
public String deleteUser(@PathVariable("id") long id, Model model) {
    userDao.deleteById(id);
    return "redirect:/allUser";
}

} 코드 가 많 지만 키 코드 는 몇 줄 에 불과 합 니 다.
@Autowired private UserRepository userDao;자동 주입 방식 으로 UserRepository 인 스 턴 스 를 주입 합 니 다.
userDao. findAll () 에서 모든 것 을 찾 고 실제 적 으로 CrudRepository 인 터 페 이 스 를 호출 하 는 방법 Iterable findAll ();
userDao. findById (id) 는 메 인 키 에 따라 실 체 를 찾 고, 실제로는 CrudRepository 인 터 페 이 스 를 호출 하 는 방법 Optional findById (ID id)
userDao. deleteById (id) 는 메 인 키 에 따라 실 체 를 삭제 하고 실제 적 으로 CrudRepository 인 터 페 이 스 를 호출 하 는 방법 void deleteById (ID id);
여덟 번 째 단 계 는 Spring boot 프로젝트 의 메 인 프로그램 @ SpringBootApplication 에 실체 가 있 는 가방 과 Repository 가 있 는 가방 의 설정 을 추가 합 니 다.다음 과 같다.
@ EnableTransactionManagement @ EnableJpaRepositories (basePackages = "com. wangshenghua. dao") @ EntityScan (basePackages = "com. wangshenghua. model", basePackageClasses = {application. class, Jsr310JpaConverters. class}) @ EnableTransactionManagement 는 사무 관리 사용 을 표시 합 니 다.
@ EnableJpaRepositories 는 Repository 작업 데이터 베 이 스 를 사용 합 니 다.
@ EntityScan 은 스 캔 실 체 를 표시 합 니 다.
3. 본 과정 을 정리 하고 우 리 는 Spring Data JPA 조작 관계 데이터 베 이 스 를 배 워 서 삭제 와 검사 기능 을 실현 합 니 다.Spring Data JPA 를 사용 하여 관계 데이터 베 이 스 를 조작 하 는 것 은 매우 간단 하 다 (JDBC 에 비해).관건 적 인 절 차 는 8 단계 에 불과 하 다.
간단 한 동 동 을 사용 할 수록 바 텀 코드 는 복잡 하 다.Spring 이 밑바닥 을 추상 적 으로 포장 하 는 것 뿐만 아니 라 자바 EE 조직 은 JDBC 에 대한 추상 과 포장 을 멈 추 지 않 았 다.바로 이 조직 과 개인 을 제외 하고 자바 의 오늘 의 지위 가 있 습 니 다.
이 과정의 원본 코드 는 github 에 업로드 되 어 다운로드 하 러 갈 수 있 습 니 다.

좋은 웹페이지 즐겨찾기