Spring boot JPA MySQL整合实现CRUD REST接口,在这篇文章中,我们将为简单的笔记应用程序构建一个Restful CRUD API。注释可以有标题和一些内容。我们将首先构建apis来创建,检索,更新和删除一个Note,然后使用POSTMAN测试它们。<h2 style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">1.前言</span></span></span></h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">Spring Boot将Spring框架提升到了一个新的水平。它极大地缩短了Spring项目所需的配置和设置时间。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">您可以设置几乎为零配置的项目,并开始构建对您的应用程序而言非常重要的事物。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">如果你是Spring的新手,想快速入门,那么这篇博文就是为你准备的。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">在这篇文章中,我们将为简单的笔记应用程序构建一个Restful CRUD API。注释可以有标题和一些内容。我们将首先构建apis来创建,检索,更新和删除一个Note,然后使用POSTMAN测试它们。</span></span></span></p>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">2.创建项目</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">Spring Boot提供了一个名为<a href="http://start.spring.io/" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">Spring Initializer</a>的Web工具来快速引导应用程序。只需访问<a href="http://start.spring.io/" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">http://start.spring.io</a>并按照以下步骤生成一个新项目。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>第1步</strong>:在<a href="http://start.spring.io/" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">http://start.spring.io</a>页面上单击<strong>切换到完整版本</strong>。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>第2步</strong>:输入详细信息如下 -</span></span></span></p>
<ul>
<li>Group : com.example</li>
<li>Artifact : easy-notes</li>
<li>Name : easy-notes</li>
<li>Description : Rest API for a Simple Note Taking Application</li>
<li>Package Name : com.example.easynotes</li>
<li>Packaging : jar (This is the default value)</li>
<li>Java Version : 1.8 (Default)</li>
<li>Dependencies : Web, JPA, MySQL, DevTools</li>
</ul>
<p style="margin-left:0px; margin-right:0px; text-align:start"><img alt="图1" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2018-04/d608951119e348f9b793ff4381442142.png" /><br />
<span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">输入完所有细节后,单击<strong>生成项目</strong>以生成并下载项目。Spring初始化程序将生成具有您输入的详细信息的项目并下载包含所有项目文件夹的zip文件。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">接下来,解压下载的zip文件并将其导入到您最喜欢的IDE中。</span></span></span><br />
<br />
</p>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">3.查看目录结构</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">以下是我们的笔记记录应用程序的目录结构 -</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><img alt="查看目录结构" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2018-04/cc41763f46504dea9b627c77cad4a9db.png" /><br />
让我们了解一些重要文件和目录的细节 -</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>1. EasyNotesApplication</strong></span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">这是我们的Spring Boot应用程序的主要入口点。</span></span></span></p>
<pre>
<code class="language-java">package com.example.easynotes;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EasyNotesApplication {
public static void main(String[] args) {
SpringApplication.run(EasyNotesApplication.class, args);
}
}</code></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">它包含一个简单的注释<code>@SpringBootApplication</code>,它是以下更具体的Spring注释的组合 -</span></span></span></p>
<ul>
<li><a href="https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">@Configuration</a>:用<code>@Configuration</code>Annotation注解的任何类由Spring引导,并且也被认为是其他bean定义的来源。</li>
<li><a href="https://docs.spring.io/spring-boot/docs/1.2.1.RELEASE/api/org/springframework/boot/autoconfigure/EnableAutoConfiguration.html" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">@EnableAutoConfiguration</a>:这个注解告诉Spring根据你添加到<code>pom.xml</code>文件中的依赖来自动配置你的应用程序。</li>
<li>例如,如果<code>spring-data-jpa</code>在类路径中,则它会自动尝试<code>DataSource</code>通过从<code>application.properties</code>文件中读取数据库属性来配置一个。</li>
<li><a href="https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">@ComponentScan</a>:它告诉Spring扫描并引导当前包(com.example.easynotes)和所有子包中定义的其他组件。</li>
</ul>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">该<code>main()</code>方法调用Spring Boot的<code>SpringApplication.run()</code>方法来启动应用程序。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>2.资源/</strong></span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">顾名思义,该目录专用于所有静态资源,模板和属性文件。</span></span></span></p>
<ul style="margin-left:30px; margin-right:0px">
<li>
<p style="margin-left:0px; margin-right:0px"><strong>资源/静态</strong> - 包含静态资源,如css,js和图像。</p>
</li>
<li>
<p style="margin-left:0px; margin-right:0px"><strong>资源/模板</strong> - 包含由Spring呈现的服务器端模板。</p>
</li>
<li>
<p style="margin-left:0px; margin-right:0px"><strong>resources / application.properties</strong> - 这个文件非常重要。它包含应用程序范围内的属性。Spring读取这个文件中定义的属性来配置你的应用程序。您可以在此文件中定义服务器的默认端口,服务器的上下文路径,数据库URL等。</p>
<p style="margin-left:0px; margin-right:0px">您可以参考<a href="https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">此页面</a>来了解Spring Boot中使用的常见应用程序属性。</p>
</li>
</ul>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>3. EasyNotesApplicationTests</strong> - 在这里定义单元和集成测试。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>4. pom.xml</strong> - 包含所有的项目依赖关系</span></span></span></p>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">4.配置MySQL数据库</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">正如我前面指出的那样,Spring Boot 通过从文件中读取数据库配置,尝试在类路径中自动配置<code>DataSource</code>if 。<code>spring-data-jpa</code><code>application.properties</code></span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">所以,我们只需要添加配置,而Spring Boot将负责其余部分。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">打开<code>application.properties</code>文件并向其中添加以下属性。</span></span></span></p>
<pre>
<code class="language-html">## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://localhost:3306/notes_app?useSSL=false
spring.datasource.username = root
spring.datasource.password = root
## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update</code></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">您需要在MySQL中创建一个名为<strong>notes_app</strong>的数据库,并根据您的MySQL安装更改<code>spring.datasource.username</code>&<code>spring.datasource.password</code>属性。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">在上面的属性文件中,最后两个属性用于休眠。Spring Boot使用Hibernate作为默认的JPA实现。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">该属性<code>spring.jpa.hibernate.ddl-auto</code>用于数据库初始化。我已经使用这个属性的值<strong>“update”</strong>。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">它做了两件事 -</span></span></span></p>
<ul>
<li>定义域模型时,将自动在数据库中创建一个表,并将域模型的字段映射到表中的相应列。</li>
<li>对域模型的任何更改也会触发表的更新。例如,如果您更改字段的名称或类型,或将其他字段添加到模型中,则所有这些更改也会反映在映射表中。</li>
</ul>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">使用<em>更新</em>的<code>spring.jpa.hibernate.ddl-auto</code>财产是好的发展。但是,对于生产,您应该保留此属性的值以<strong>“验证”</strong>,并使用像<a href="https://www.callicoder.com/spring-boot-flyway-database-migration-example/" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">Flyway</a>这样的数据库迁移工具来管理数据库模式中的更改。</span></span></span></p>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">6.创建Note模型</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">好吧!现在让我们来创建<code>Note</code>模型。我们的<code>Note</code>模型有以下领域 -</span></span></span></p>
<ul>
<li><strong><code>id</code></strong>:带自动递增的主键。</li>
<li><strong><code>title</code></strong>:备注的标题。(NOT NULL字段)</li>
<li><strong><code>content</code></strong>:笔记的内容。(NOT NULL字段)</li>
<li><strong><code>createdAt</code></strong>:<code>Note</code>创建时间。</li>
<li><strong><code>updatedAt</code></strong>:<code>Note</code>更新时间。</li>
</ul>
<br />
现在,让我们看看我们如何在Spring中对它进行建模。创建一个名为<code>model</code>inside 的新包,<code>com.example.easynotes</code>并添加一个名为<code>Note.java</code>以下内容的类-
<pre>
<code class="language-java">package com.example.easynotes.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.util.Date;
@Entity
@Table(name = "notes")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"},
allowGetters = true)
public class Note implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
private String title;
@NotBlank
private String content;
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
private Date createdAt;
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate
private Date updatedAt;
// Getters and Setters ... (Omitted for brevity)
}</code></pre>
<ul>
<li>您的所有域模型必须使用注释进行<strong><code>@Entity</code></strong>注释。它用于将该类标记为持久的Java类。</li>
<li><strong><code>@Table</code></strong> 注释用于提供此实体将映射到的表的详细信息。</li>
<li><strong><code>@Id</code></strong> 注释用于定义主键。</li>
<li><strong><code>@GeneratedValue</code></strong>注释用于定义主键生成策略。在上述情况下,我们宣布主键是一个<code>Auto Increment</code>字段。</li>
<li><strong><code>@NotBlank</code></strong>注释用于验证注释字段是否为<code>not null</code>空。</li>
<li><strong><code>@Column</code></strong>注释用于定义将映射到注释字段的列的属性。您可以定义多个属性,如名称,长度,可为空,可更新等。</li>
</ul>
<p style="margin-left:0px; margin-right:0px">默认情况下,名为的字段将<code>createdAt</code>映射到<code>created_at</code>数据库表中指定的列。即所有的骆驼案件都被下划线取代。</p>
<p style="margin-left:0px; margin-right:0px">如果您想将字段映射到不同的列,可以使用以下命令指定它 -</p>
<pre>
<code class="language-java">@Column(name = "created_on")
private String createdAt;</code></pre>
<ul>
<li><strong><code>@Temporal</code></strong>注释<code>java.util.Date</code>和<code>java.util.Calendar</code>类一起使用。它将Java Object中的日期和时间值转换为兼容的数据库类型,反之亦然。</li>
<li><strong><code>@JsonIgnoreProperties</code></strong>注释是杰克逊的注释。Spring Boot使用Jackson将JSON序列化和反序列化Java对象。</li>
<li>使用这个注解是因为我们不希望剩下的api的客户端提供<code>createdAt</code>和<code>updatedAt</code>值。如果他们提供这些值,那么我们会简单地忽略它们。但是,我们将在JSON响应中包含这些值。</li>
</ul>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">7.启用JPA审核</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">在我们的<code>Note</code>模型中,我们已经注解<code>createdAt</code>,并<code>updatedAt</code>与领域<code>@CreatedDate</code>,并<code>@LastModifiedDate</code>分别标注。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">现在,我们想要的是,只要我们创建或更新实体,这些字段就会自动填充。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">要做到这一点,我们需要做两件事 -</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>1.将Spring Data JPA添加<code>AuditingEntityListener</code>到域模型中。</strong></span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">我们已经在我们的<code>Note</code>模型中使用了注释<code>@EntityListeners(AuditingEntityListener.class)</code>。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>2.在主应用程序中启用JPA审核。</strong></span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">打开<code>EasyNotesApplication.java</code>并添加<code>@EnableJpaAuditing</code>注释。</span></span></span></p>
<pre>
<code class="language-java">@SpringBootApplication
@EnableJpaAuditing
public class EasyNotesApplication {
public static void main(String[] args) {
SpringApplication.run(EasyNotesApplication.class, args);
}
}</code></pre>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">8.创建NoteRepository以访问数据库中的数据</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">接下来我们要做的是创建一个存储库来访问数据库中的Note数据。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">那么,Spring Data JPA已经在这里介绍了我们。它带有一个<a href="https://docs.spring.io/autorepo/docs/spring-data-jpa/current/api/org/springframework/data/jpa/repository/JpaRepository.html" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank"><code>JpaRepository</code></a>接口,该接口定义实体上所有CRUD操作的方法,以及一个默认的<code>JpaRepository</code>调用实现<a href="http://docs.spring.io/autorepo/docs/spring-data-jpa/current/api/org/springframework/data/jpa/repository/support/SimpleJpaRepository.html" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank"><code>SimpleJpaRepository</code></a>。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">现在创建存储库。首先,创建一个<code>repository</code>在基础包内调用的新包<code>com.example.easynotes</code>。然后,创建一个接口<code>NoteRepository</code>并将其从<code>JpaRepository</code>-</span></span></span></p>
<pre>
<code class="language-java">package com.example.easynotes.repository;
import com.example.easynotes.model.Note;
import org.springframework.data.jpa.repository.JpaRepository;
@Repository
public interface NoteRepository extends JpaRepository<Note, Long> {
}</code></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">请注意,我们使用注释标注了界面<code>@Repository</code>。这告诉Spring在组件扫描期间引导存储库。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">大!这就是您在存储库层中必须做的所有事情。现在,您将能够使用JpaRepository的方法,如<code>save()</code>,<code>findOne()</code>,<code>findAll()</code>,<code>count()</code>,<code>delete()</code>等。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">你不需要实现这些方法。Spring Data JPA已经实现了它们<code>SimpleJpaRepository</code>。这个实现在运行时被Spring自动插入。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">检查<a href="http://docs.spring.io/autorepo/docs/spring-data-jpa/current/api/org/springframework/data/jpa/repository/support/SimpleJpaRepository.html" rel="external nofollow" style="box-sizing:border-box; color:#419be8; text-decoration:none; word-wrap:break-word" target="_blank">SimpleJpaRepository文档中</a>提供的所有方法。</span></span></span><br />
<br />
</p>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">9.创建自定义业务例外</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">我们将<code>Note</code>在下一节中定义用于创建,检索,更新和删除a的Rest API 。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><code>ResourceNotFoundException</code>只要在数据库中找不到<code>Note</code>给定的API,API就会抛出<code>id</code>。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">以下是定义<code>ResourceNotFoundException</code>。(我创建了一个名为<code>exception</code>inside 的包<code>com.example.easynotes</code>来存储这个异常类) -</span></span></span></p>
<pre>
<code class="language-java">package com.example.easynotes.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
private String resourceName;
private String fieldName;
private Object fieldValue;
public ResourceNotFoundException( String resourceName, String fieldName, Object fieldValue) {
super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue));
this.resourceName = resourceName;
this.fieldName = fieldName;
this.fieldValue = fieldValue;
}
public String getResourceName() {
return resourceName;
}
public String getFieldName() {
return fieldName;
}
public Object getFieldValue() {
return fieldValue;
}
}</code></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">注意<code>@ResponseStatus</code>在上述异常类中使用注释。这将导致Spring引导以指定的HTTP状态码进行响应,无论何时从您的控制器抛出此异常。</span></span></span></p>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">10.创建NoteController</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong>最后一步</strong> - 我们现在将创建REST API来创建,检索,更新和删除注释。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">首先,<code>controller</code>在里面创建一个新的包<code>com.example.easynotes</code>。然后,创建一个<code>NoteController.java</code>包含以下内容的新课程-</span></span></span></p>
<pre>
<code class="language-java">package com.example.easynotes.controller;
import com.example.easynotes.exception.ResourceNotFoundException;
import com.example.easynotes.model.Note;
import com.example.easynotes.repository.NoteRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
@RequestMapping("/api")
public class NoteController {
@Autowired
NoteRepository noteRepository;
// Get All Notes
// Create a new Note
// Get a Single Note
// Update a Note
// Delete a Note
}</code></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong><code>@RestController</code></strong>注释是Spring <code>@Controller</code>和<code>@ResponseBody</code>注释的组合。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">该<code>@Controller</code>注释被用来定义一个控制器和所述<code>@ResponseBody</code>注释被用于指示一个方法的返回值应作为所述请求的响应主体。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff"><strong><code>@RequestMapping("/api")</code></strong>声明此控制器中所有apis的url将以<code>/api</code>。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">现在我们来看看所有apis的执行情况。</span></span></span></p>
<h4 style="margin-left:0px; margin-right:0px; text-align:start">1.获取所有Notes(GET / api / notes)</h4>
<pre>
<code class="language-java">// Get All Notes
@GetMapping("/notes")
public List<Note> getAllNotes() {
return noteRepository.findAll();
}</code></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">上述方法非常简单。它调用JpaRepository的<code>findAll()</code>方法从数据库中检索所有注释并返回整个列表。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">此外,<code>@GetMapping("/notes")</code>注释是一种简短形式<code>@RequestMapping(value="/notes", method=RequestMethod.GET)</code>。</span></span></span></p>
<h4 style="margin-left:0px; margin-right:0px; text-align:start">2.创建一个新的Note(POST / api / notes)</h4>
<pre>
<code class="language-java">// Create a new Note
@PostMapping("/notes")
public Note createNote(@Valid @RequestBody Note note) {
return noteRepository.save(note);
}</code></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">该<code>@RequestBody</code>注释用于将请求主体与方法参数绑定。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">该<code>@Valid</code>注释可以确保请求主体是有效的。请记住,我们在模型中标注了注释的标题和<code>@NotBlank</code>注释内容<code>Note</code>?</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">如果请求主体没有标题或内容,那么spring会<code>400 BadRequest</code>向客户端返回错误。</span></span></span></p>
<h4 style="margin-left:0px; margin-right:0px; text-align:start">3.获取单个Note(Get / api / notes / {noteId})</h4>
<pre>
<code class="language-java">// Get a Single Note
@GetMapping("/notes/{id}")
public Note getNoteById(@PathVariable(value = "id") Long noteId) {
return noteRepository.findById(noteId)
.orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId));
}</code></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">的<code>@PathVariable</code>注释,顾名思义,是用来与方法参数路径变量绑定。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">在上面的方法中,我们抛出一个没有找到给定id的<code>ResourceNotFoundException</code>a <code>Note</code>。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">这将导致Spring Boot向客户端返回一个404 Not Found错误(请记住,我们已经<code>@ResponseStatus(value = HttpStatus.NOT_FOUND)</code>为<code>ResourceNotFoundException</code>该类添加了注释)。</span></span></span></p>
<h4 style="margin-left:0px; margin-right:0px; text-align:start">4.更新Note(PUT / api / notes / {noteId})</h4>
<pre>
<code class="language-java">// Update a Note
@PutMapping("/notes/{id}")
public Note updateNote(@PathVariable(value = "id") Long noteId,
@Valid @RequestBody Note noteDetails) {
Note note = noteRepository.findById(noteId)
.orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId));
note.setTitle(noteDetails.getTitle());
note.setContent(noteDetails.getContent());
Note updatedNote = noteRepository.save(note);
return updatedNote;
}</code></pre>
<h4 style="margin-left:0px; margin-right:0px; text-align:start">5.删除一个Note(DELETE / api / notes / {noteId})</h4>
<pre>
<code class="language-java">// Delete a Note
@DeleteMapping("/notes/{id}")
public ResponseEntity<?> deleteNote(@PathVariable(value = "id") Long noteId) {
Note note = noteRepository.findById(noteId)
.orElseThrow(() -> new ResourceNotFoundException("Note", "id", noteId));
noteRepository.delete(note);
return ResponseEntity.ok().build();
}</code></pre>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">运行应用程序</h2>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">我们已经成功为我们的应用程序构建了所有apis。现在运行该应用并测试apis。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">只需转到应用程序的根目录并输入以下命令即可运行它 -</span></span></span></p>
<pre style="margin-left:0px; margin-right:0px; text-align:left">
<span style="background-color:#f6f8fa"><span style="font-family:monospace,monospace"><span style="color:rgba(0, 0, 0, 0.9)"><code class="language-bash">$ mvn spring-boot:run
</code></span></span></span></pre>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">该应用程序将从Spring Boot的默认tomcat端口8080开始。</span></span></span></p>
<p style="margin-left:0px; margin-right:0px; text-align:start"><span style="color:rgba(0, 0, 0, 0.87)"><span style="font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif"><span style="background-color:#ffffff">大!现在,是时候用邮差测试我们的apis了。</span></span></span></p>
<h2 style="margin-left:0px; margin-right:0px; text-align:start">测试API</h2>
<h4 style="margin-left:0px; margin-right:0px; text-align:start"><strong>使用<code>POST /api/notes</code>API 创建新的note</strong></h4>
<img alt="使用POST /api/notesAPI 创建新的note" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2018-04/cb5cfce6fa5a4e48a68fbef46dccf83b.png" />
<h4 style="margin-left:0px; margin-right:0px; text-align:start"><strong>使用<code>GET /api/notes</code>API 检索所有Notes</strong></h4>
<img alt="使用GET /api/notesAPI 检索所有Notes" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2018-04/f04e78160b664266b9ae53ac746f0b16.png" />
<h4 style="margin-left:0px; margin-right:0px; text-align:start"><strong>使用<code>GET /api/notes/{noteId}</code>API 检索单个Note</strong></h4>
<img alt="使用GET /api/notes/{noteId}API 检索单个Note" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2018-04/aad1aebfe57b49429a81b7f00bae2e8d.png" />
<h4 style="margin-left:0px; margin-right:0px; text-align:start"><strong>使用<code>PUT /api/notes/{noteId}</code>API 更新note</strong></h4>
<img alt="使用PUT /api/notes/{noteId}API 更新note" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2018-04/b9926529dfaf4b6694043cc11afb2363.png" /><br />
<h4 style="margin-left:0px; margin-right:0px; text-align:start"><strong>使用<code>DELETE /api/notes/{noteId}</code>API 删除note</strong></h4>
<img alt="使用DELETE /api/notes/{noteId}API 删除note" class="img-thumbnail" src="/assets/upload/blog/thumbnail/2018-04/1e7f7a50e90b4889aa499b48ffbc3754.png" /><br />