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删除员工