尝试使用Spring Boot JPA
JPA(Spring Data JPA)是什么?
概括而言,这是用于创建能够访问数据库的应用程序的Spring Boot工具。
根据SpringBoot官方网站上的「使用JPA进行数据访问(英文文章)」,我自己查找并理解了其中的内容,然后写下来。
执行环境
• 温馨提示:为了构建Java程序,需要使用一个名为Maven的工具,请确保已经安装好了,若尚未安装请进行安装。
(Translation:
• Friendly reminder: In order to build Java programs, you will need to use a tool called Maven. Please ensure that it is already installed, and if not, please proceed with the installation.)
马上开始吧
首先,我们下载SpringBoot。
让我们打开Spring Initializr。
我将使用这个内容来创建。
点击右侧的Dependencies(依赖关系)选项卡,添加“Spring Data JPA”和“H2 Database”,然后通过GENERATE来创建应用程序。
我会在VSCode或任何其他编辑器中打开创建的应用程序。
我会检查pom文件。pom文件是一个记录应用程序所使用的各种功能依赖关系的文件。
如果按照步骤创建,应该具有以下内容。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>accessing-data-jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>accessing-data-jpa</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
课堂的定义
在这个应用程序中,我们将把顾客信息注册到数据库中,并将符合条件的顾客信息输出到控制台。
首先,让我们创建一个名为Customer的类。我们将添加Customer.java文件。(src/main/java/com/example/accessingdatajpa/Customer.java)
package com.example.accessingdatajpa;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
//JPAのためのコンストラクタ。使うことはないためprotectedを指定。
protected Customer() {}
//データベースに保存する Customer のインスタンスを作成するためのコンストラクタ。
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
public Long getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
我们创造了一个名为Customer的类,它具有id、firstName和LastName这三个属性。
@Entity
Customer类被标记为@Entity注解。
@Entity是为了将数据存入数据库,这里是与Customer表相关联的意思。
“Entity”一词似乎具有实际存在、存在、实体、主体等含义。
顾客对象的id属性将带有@Id,以使JPA能够识别它作为对象的ID。
.@GeneratedValue
id属性上有一个名为@GeneratedValue的注解。
它会自动生成id。
toString() 方法会输出客户信息。
创建存储库。
下一步,我们将创建一个名为CustomerRepository.java的文件来记录客户信息。(文件路径为 Customersrc/main/java/com/example/accessingdatajpa/CustomerRepository.java)
package com.example.accessingdatajpa;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
public interface CustomerRepository extends CrudRepository<Customer, Long> {
List<Customer> findByLastName(String lastName);
Customer findById(long id);
}
CustomerRepository继承了CrudRepository的接口。
Crud是系统所需的四个主要功能的缩写,即“Create(创建)”,“Read(读取)”,“Update(更新)”,“Delete(删除)”。因此,CrudRepository具有这些功能,将CrudRepository引入CustomerRepository将使其可以使用这些功能。
创建一个应用程序类
在应用程序创建时,Initializr会向创建的类中添加内容。
(src/main/java/com/example/accessingdatajpa/AccessingDataJpaApplication.java)
请用中文原生地转述以下内容,只需要提供一种选项:
以下是原文内容。
package com.example.accessingdatajpa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccessingDataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class, args);
}
}
以下是添加了内容的版本
package com.example.accessingdatajpa;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class AccessingDataJpaApplication {
private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class);
public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class);
}
@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// save a few customers
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
// fetch all customers
log.info("Customers found with findAll():");
log.info("-------------------------------");
for (Customer customer : repository.findAll()) {
log.info(customer.toString());
}
log.info("");
// fetch an individual customer by ID
Customer customer = repository.findById(1L);
log.info("Customer found with findById(1L):");
log.info("--------------------------------");
log.info(customer.toString());
log.info("");
// fetch customers by last name
log.info("Customer found with findByLastName('Bauer'):");
log.info("--------------------------------------------");
repository.findByLastName("Bauer").forEach(bauer -> {
log.info(bauer.toString());
});
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }
log.info("");
};
}
}
@SpringBootApplication包含以下的注解。
@Configuration: 将类标记为用于应用程序上下文的Bean定义源。
@EnableAutoConfiguration: 将类标记为应用程序上下文的Bean定义源。根据类路径设置,其他Bean和各种属性设置,指示Spring Boot开始添加Bean。例如,如果类路径上存在spring-webmvc,此注解将标记应用程序为Web应用程序,并激活主要操作,例如DispatcherServlet的配置。
@ComponentScan: 指示Spring在包内查找其他组件、配置等,以找到控制器。
@Bean是用于返回通过@Bean注解的方法实例化的类的注解。
对于添加@Component、@Service、@Repository、@Controller注解的类,当添加这些注解时,它们会被自动注册为Bean,所以无需添加@Bean注解。
主()方法启动应用程序。
logger是用来将结果输出到控制台的工具。
我们将设置客户信息并将其输出到日志中进行测试。
我们可以在AccessingDataJpaApplication类中添加内容。(src/main/java/com/example/accessingdatajpa/AccessingDataJpaApplication.java)。
package com.example.accessingdatajpa;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class AccessingDataJpaApplication {
//logにAccessingDataJpaApplicationクラスに書かれた内容を出す
private static final Logger log = LoggerFactory.getLogger(AccessingDataJpaApplication.class);
//SpringApplicationを起動させる
public static void main(String[] args) {
SpringApplication.run(AccessingDataJpaApplication.class);
}
@Bean
public CommandLineRunner demo(CustomerRepository repository) {
return (args) -> {
// 顧客情報を設定する
repository.save(new Customer("Jack", "Bauer"));
repository.save(new Customer("Chloe", "O'Brian"));
repository.save(new Customer("Kim", "Bauer"));
repository.save(new Customer("David", "Palmer"));
repository.save(new Customer("Michelle", "Dessler"));
// 全ての顧客情報を取り出す
log.info("Customers found with findAll():");
log.info("-------------------------------");
for (Customer customer : repository.findAll()) {
log.info(customer.toString());
}
log.info("");
// 一致するIDを持った顧客情報を取り出す
Customer customer = repository.findById(1L);
log.info("Customer found with findById(1L):");
log.info("--------------------------------");
log.info(customer.toString());
log.info("");
// 一致するLastNameを持った顧客情報を取り出す
log.info("Customer found with findByLastName('Bauer'):");
log.info("--------------------------------------------");
repository.findByLastName("Bauer").forEach(bauer -> {
log.info(bauer.toString());
});
// for (Customer bauer : repository.findByLastName("Bauer")) {
// log.info(bauer.toString());
// }
log.info("");
};
}
}
试着去做
在终端输入./mvnw spring-boot:run并执行一下,这样应该会得到以下的执行结果。
完成
使用Spring Data JPA,我们现在可以创建一个简单的应用程序来将对象保存到数据库中,或者从数据库中检索数据。