Spring Boot + Spring Data JPA + MySQL + Spring RESTful
在本教程中,我们将介绍如何创建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删除员工

