Spring JPA CURD
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 에 업로드 되 어 다운로드 하 러 갈 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.