尝试使用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。

スクリーンショット 2020-07-01 15.42.41.png

我将使用这个内容来创建。
点击右侧的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并执行一下,这样应该会得到以下的执行结果。

スクリーンショット 2020-07-01 14.19.05.png

完成

使用Spring Data JPA,我们现在可以创建一个简单的应用程序来将对象保存到数据库中,或者从数据库中检索数据。

广告
将在 10 秒后关闭
bannerAds