Spring Boot + Spring Data JPA + MySQL + Spring RESTful

时间:2020-01-09 10:44:31  来源:igfitidea点击:

在本教程中,我们将介绍如何创建Spring Boot + Spring Data JPA + MySQL + Spring RESTful Web服务。 Spring Data JPA示例中已经有一个类似的示例。通过使用Spring Boot,我们将看到所需配置的显着减少。

如果我们想了解如何创建Maven项目,请查看此文章在Eclipse中使用Maven创建Java项目。

Maven依赖

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.theitroad</groupId>
  <artifactId>SpringBootProject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- MySQL Driver -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

在我们的配置中,Spring Boot版本为2.1.6,因此Spring Boot获得了支持该版本的依赖项。

对于Spring Data JPA,我们需要添加spring-boot-starter-data-jpa,它将获取Spring Data,Hibernate和JPA所需的其他jar。

由于我们正在开发Web服务,因此添加了spring-boot-starter-web依赖关系,该依赖关系添加了创建Spring Web应用程序所需的必需依赖关系。

还添加了spring-boot-maven-plugin,此插件提供了许多方便的功能

  • 它有助于创建可执行jar(über-jar),从而使执行和传输服务更加方便。

  • 它还搜索公共static void main()方法,以将具有此方法的类标记为可运行类。

通过添加这些依赖项,Spring Boot可以确保获得所需的jar依赖项,即使是嵌入式Web服务器(在本例中为Tomcat),也取决于起始Web依赖项。

数据库表查询

可以使用以下查询创建用于此Spring数据JPA的MySQL DB表。

CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(45) DEFAULT NULL,
  `last_name` varchar(45) DEFAULT NULL,
  `department` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

JPA实体类

映射到DB中的employee表的实体类。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="employee")
public class Employee {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;
  @Column(name="first_name")
  private String firstName;
  @Column(name="last_name")
  private String lastName;
  @Column(name="department")
  private String dept;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
  public String getDept() {
    return dept;
  }
  public void setDept(String dept) {
    this.dept = dept;
  }

  @Override
  public String toString() {
    return "Id= " + getId() + " First Name= " + 
           getFirstName() + " Last Name= " + getLastName() + 
           " Dept= "+ getDept();
  }
}

@Entity注释指定此模型类为实体。
@Table注释指定实体的主表。
@Id注释指定实体的主键。
@GeneratedValue指定主键生成策略,在这种情况下,该策略是自动递增的。
@Column注释指定该字段的映射表列名称。

Spring Data JPA示例–存储库

import java.util.List;
import org.springframework.data.repository.CrudRepository;
import com.theitroad.springbootproject.model.Employee;

public interface EmployeeRepository extends CrudRepository<Employee, Integer> {	
	List<Employee> findByLastName(String lastName);
}

EmployeeRepository接口扩展了CrudRepository,它使用域类来管理(在这种情况下为Employee),并且将域类的id类型作为类型参数。

这就是CRUD功能所需的所有数据访问代码,无需编写实现此接口的类。 Spring负责自动实现此存储库接口。

除了从CrudRepository继承的方法外,在存储库中还添加了一个方法findByLastName。定制查询可以自动生成,也可以将查询写为"命名查询",也可以在存储库中使用@Query注释。

要查看@Query注释的示例,请查看此文章Spring Data JPA @Query注释示例
要查看@NamedQuery注释的示例,请查看此文章Spring Data JPA @NamedQuery注释示例

Spring Data JPA示例–服务类

在服务层,我们将称为DAO层方法。由于我们只需要一个用于存储Spring数据的存储库,因此我们将从服务类中调用存储库的方法。请注意,必须将存储库实例注入服务类中。

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.theitroad.springbootproject.model.Employee;
import com.theitroad.springbootproject.repository.EmployeeRepository;

@Service
public class EmployeeService {
  @Autowired
  private EmployeeRepository repository;

  public Employee getEmployeeById(int id) {
    return repository.findById(id).get();
  }

  public List<Employee> getAllEmployees(){
    return (List<Employee>) repository.findAll();
  }

  public void deleteEmployeeById(int id){
    repository.deleteById(id);
  }

  public Employee addEmployee(Employee emp) {
    return repository.save(emp);
  }

  public List<Employee> getEmployeeByLastName(String lastName) {
    return repository.findByLastName(lastName);
  }
}

Spring Data JPA示例–控制器类

使用Rest控制器类,我们会将路径映射到要为请求调用的方法。

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import com.theitroad.springbootproject.model.Employee;
import com.theitroad.springbootproject.service.EmployeeService;

@RestController
@RequestMapping("/employee")
public class EmployeeController {
  @Autowired
  EmployeeService empService;

  @GetMapping("/{id}")
  public Employee getEmployeeById(@PathVariable int id) {
    return empService.getEmployeeById(id);
  }

  @GetMapping
  public List<Employee> getAllEmployees(){
    return empService.getAllEmployees();
  }

  @DeleteMapping("/{id}")
  @ResponseStatus(HttpStatus.OK)
  public void deleteEmployeeById(@PathVariable int id){
    empService.deleteEmployeeById(id);
  }
  @PostMapping
  @ResponseStatus(HttpStatus.CREATED)
  public Employee addEmployee(@RequestBody Employee emp) {
    return empService.addEmployee(emp);
  }
  @GetMapping("/lastname/{lastName}")
  public List<Employee> getEmployeeByLastName(@PathVariable String lastName) {
    return empService.getEmployeeByLastName(lastName);
  }
}

数据库配置

我们已经了解了Spring Data如何负责为查询方法派生查询,因此我们不必为CRUD功能编写样板代码。现在看一下Spring Boot的魔力和所需的配置减少。

默认情况下,Spring Boot在此位置src / main / resources / application.properties读取属性文件

我们必须在application.properties文件中定义数据库连接属性和与Hibernate相关的属性。

spring.datasource.url=jdbc:mysql://localhost:3306/theitroad
spring.datasource.username=
spring.datasource.password=

spring.jpa.properties.hibernate.sqldialect=org.hibernate.dialect.MySQLInnoDBDialect
spring.jpa.properties.hibernate.showsql=true

请注意存储在属性文件中的键/值对中使用的键,请确保使用相同的键。

使用此属性文件以及Hibernate和MySQL的类路径中的jar,Spring Boot可以自动将Hibernate配置为JPA供应商,并使用application.properties文件中定义的DB连接属性设置DataSource。

创建Spring Boot应用程序类

这是一个应用程序类,其中的main方法是Spring Boot应用程序的入口点。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class JPAApp {
  public static void main(String[] args) {
    SpringApplication.run(JPAApp.class, args);
  }
}

@SpringBootApplication是一个方便注释,它添加了以下所有注释

1 @ Configuration注释将类标记为应用程序上下文的Bean定义的源。

2 @ EnableAutoConfiguration告诉Spring Boot启用自动配置,以便基于类路径设置,其他bean和各种属性设置自动创建bean。例如,starter spring-boot-starter-web添加了Tomcat和Spring MVC,因此自动配置假定我们正在开发Web应用程序并相应地设置Spring,其中包括设置DispatcherServlet。

3 @ ComponentScan告诉Spring递归查找此包中的其他组件,配置和服务,并注册它们。

主要方法是应用程序入口点,该入口点通过调用run委托给Spring Boot的SpringApplication类。 SpringApplication引导此Spring Data JPA应用程序,启动Spring,该Spring又启动嵌入式Tomcat Web服务器。

运行应用程序

1通过使用Eclipse IDE本身的main方法(JPAApp.java)运行类,可以将其作为独立的Java应用程序运行。

右键单击JPAApp.java –运行方式– Java应用程序

如果一切正常,我们应该在控制台上看到类似于以下内容的消息(部分内容涉及初始化WebApplicationContext,Hibernate配置)

Tomcat started on port(s): 8080 (http) with context path ''
com.theitroad.springbootproject.JPAApp     : Started JPAApp

2dependency spring-boot-starter-parent还提供了一个运行目标,我们可以用来启动应用程序。从根项目目录键入mvn spring-boot:run以启动应用程序。

F:\theitroad\Spring WorkSpace\SpringBootProject>mvn spring-boot:run
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------------------------------------------------------
[INFO] Building SpringBootProject 0.0.1-SNAPSHOT
[INFO] -----------------------------------------------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.1.6.RELEASE:run (default-cli) > test-compile @ SpringBootProject >>>

2019-09-23 19:08:36.733  INFO 8476 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-09-23 19:08:36.748  INFO 8476 --- [           main] com.theitroad.springbootproject.JPAApp     : Started JPAApp in 4.958 seconds (JVM running for 22.892)

3我们还可以从命令行使用run mvn软件包创建一个完全独立的可执行jar文件。

F:\theitroad\Spring WorkSpace\SpringBootProject>mvn package

[INFO]
[INFO] --- maven-jar-plugin:3.1.2:jar (default-jar) @ SpringBootProject --
[INFO] Building jar: F:\theitroad\Spring WorkSpace\SpringBootProject\target\SpringBootProject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.6.RELEASE:repackage (repackage) @ SpringBootProject --
[INFO] Replacing main artifact with repackaged archive
[INFO] -----------------------------------------------------------------------
[INFO] BUILD SUCCESS

要使用创建的jar运行应用程序,请使用java -jar命令,如下所示:

java -jar target\SpringBootProject-0.0.1-SNAPSHOT.jar

一旦使用上面提供的任何选项将应用程序部署到Tomcat服务器上,就可以使用Postman客户端测试Web服务。

新增员工

请注意,所选的请求是POST,URL是http:// localhost:8080 / SpringJPAProject / employee

数据以JSON格式作为请求正文发送。在响应中添加了员工数据回发。

获取所有员工

按姓获取员工

我们也可以直接从浏览器发送请求,就像完成此请求一样。

通过ID删除员工