[翻译]Spring Boot,MySQL,JPA,Hibernate Restful CRUD API 教程

[写在翻译前]

这篇文章是我准备用Java写一个RestAPI的时候,学习Spring boot用的。在看这篇文章的时候,我具备了用Python的Flask 和Golang 的beego 写应用的基础,并对MVC模式有很大的了解,同时,我也具有了Java的基础知识(虽然,仅仅是看了Java的基础书籍。)。所以,如果你并不具备以上的条件,你可能会有些看不懂。不过,我会尽量在翻译的时候夹带一些私货,以便能够让大家尽量能看懂。当然由于水平有限,翻译有可能不准确,请小伙伴们见谅,也请小伙伴们不吝斧正。另外,对于Java的又臭又长深有体会(毕竟作为Pythoner,Goer和半个swifter 更喜欢那些简洁的表达。由于想写Android应用,以及用Java编写后台应用的一条龙服务。当年还想用swift写后台应用,太天真了!Swift到现在写的还不如OC的性能,而且还大很多。)

[传送门]

同时,国内已经有一篇很好的Spring Boot教程了,有兴趣的小伙伴可以去看看

[传送门]

[翻译正文]

Spring Boot 已经让Spring框架进入到了另一个层次。它彻底的减少了Spring项目所需要的配置时间。

如果你以前并没有用过Spring Boot,而且想快速的开始Spring Boot开发,那么这篇博文将会是非常不错的选择。

这篇博文中,我们会创建一个简单的Restfull 风格的笔记应用的CRUD API。一篇笔记可以有一个标题和一些内容。我们将会首先建立api 用来创建,检索,更新和删除一篇笔记,然后用postman来测试这些api。

那么,我们开始吧!

新建项目

Spring Boot 给我们提供了一个网页工具 Spring Initializer 来快速创建一个应用。你只需要访问https://start.spring.io然后按照下面的步骤来生成一个新的项目就OK了。

步骤一:点击 http://start.spring.io 页面上的 Switch to full version 

步骤二:输入输入下面的详细信息

  • Group:com.example(例如我的网站应用我就会输入:com.rffanlab)
  • Artifact:easy-notes(这里是英文原文的内容,我这里就不更改了)
  • Description:Rest API for a Simple Note Taking Application (这里只是描述,可以随你写,英文原文我也不更改了)
  • Package Name:com.rffanlab.easy-notes
  • Packaging:jar (这是默认值,表示打包成jar包,还有打包成war包可选。如果打包成jar包,不需要tomcat之流就可以直接运行,比打包成war要好的多,建议直接用默认值。)
  • Java Version :1.8(这是默认值,目前截止翻译前,java版本是1.8,不过我风闻,java 1.9要出了?)

[译者:]你们可以看到,新版的start.spring.io 的full version 这里并不仅仅只有这么点东西,他下面还有很多需要你打勾的东西。但是这篇教程中不需要你全部打勾。看到上图上面绿色的选项了么?在这个教程中只需要打勾Web、JPA、MySQL、DevTools就OK了

[继续正文]

一旦所有的信息都已经填写完毕,那么点击 绿色的那个Generate Project  这个按钮就可以生成和下载你的项目了。Spring Initializer会自动生成具有你刚刚填写的详细信息的项目,并且打包成zip,然后给下载。

下一步,解压下载的zip文档,然后倒入到你喜欢的IDE中(文中的教程是用的Idea,建议新手小伙伴就直接用idea吧,不要用eclipse了。)

查看目录结构

下面就是Note taking 应用的目录结构(不要问我怎么不翻译项目名字了)

让我们来详细了解一下某些重要的文件和目录吧。

1、EasyNotesApplication

这个文档是整个Spring Boot 应用的入口点

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);
	}
}

它包含了一个简单的注解(可能翻译不准确,毕竟不是科班java出身)叫做

@SpringBootApplication

,这个注释是下面的几个特定的spring注解的集合。

  • @Configuration 任何拥有@Configuration注解的类将会随着Spring的启动而启动并且将会被识别为其他bean的资源
  • @EnableAutonConfiguration:这个注解告诉Spring当你在你的pom.xml中添加了依赖的时候自动配置应用。例如:如果spring-data-jpa这个包如果在classpath中,那么它将会自动通过application.properties文件自动关于数据库的配置属性来自动配置DataSource(数据源)
  • @ComponentScan: 它告诉Spring 搜索和启动其他定义在当前包和子包中的组件。

main() 方法调用了Spring Boot 的SpringApplication.run() 方法来启动整个应用。

2.resources/

这个目录,如名字所示,是独立的一个目录,存储着静态资源,模板还有属性文件。

  • resources/static – 存储着静态文件,像CSS,js和图片等。
  • resources/templates- 存储着服务端放模板,他们将会被Spring渲染成html温江。
  • resources/application.properties –  这个文件是非常重要的。它包含了应用的属性。Spring通过这个文件来定义文件文件属性。你可以在这个文件中定义服务 端口,服务器环境变量,数据库url等。你可以通过这个页面来了解Spring Boot的配置属性

3.EasyNotesApplicationTests – 定义和集成了测试单元。
4. pom.xml – 包含该了所有的项目依赖

  配置MySQL数据库

就像我刚刚说的那样,Spring Boot 试图自动配置一个数据库源(DataSource), 如果 spring-data-jpa 这个包已经在classpath中,那么它就会自动读取application.properties文件中的数据库相关的配置来配置数据源。

因此,我们必须添加数据库配置,然后Spring Boot会把剩下的做好。

打开application.properties 文件然后添加一下属性(不要忘记修改spring.datasource.username和spring.datasource.password 用它的账号密码你们可登陆不了。)

## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://localhost:3306/notes_app?useSSL=false
# 这行是数据库url,包:协议://地址(可以是ip也可以是域名):端口/数据库名?用ssl=不用&charset=utf8  看我这么翻译上面的,你应该能看的懂了吧
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.MySQL5Dialect
# 这个是hibernate 优化数据库查询语句的。因此带上就好。

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
# 当数据库结构发生变动的时候,会自动更新数据库结构,添加不存在的字段,不会删除缺少字段。

最下面的两个配置是给hibernate的。Spring Boot使用Hibernate 作为默认的JPA数据库集成。
配置spring.jpa.hibernate.ddl-auto 是用来给数据库初始化的。我给这个配置使用了值”update”
它能做一下事情:

  • 当你定义了一个模型,表会自动被创建,并且会自动创建相关的存储在模型中的字段。
  • 任何对于模型的改变都会引起表的改变。例如,你改变了一个字段的类型,或者添加了另一个字段到模型,那么这些改变也将会映射到数据的对应表中。

给spring.jpa.hibernate.ddl-auto使用update这个值对于开发来说非常方便。但是对于生产环境来说,你还是将这个值设置为”validate”然后使用数据库迁移工具例如Flyway来迁移数据库表的改变。

Creating the Note model(创建Note 模型)

好了。让我们创建Note 模型吧!我们的Note 模型有如下几个字段:

  • id:主键,并且自增
  • title:笔记的标题(不能为空)
  • content: 笔记的内容(不能为空)
  • createAt: 笔记创建的时间
  • updateAt: 笔记更新的时间

现在,让我们开始吧!创建一个包名字叫做model放在com.example.easynotes下面,添加一个类,名字叫做Note.java 添加一下内容:

package com.example.easynotes.model;

import org.hibernate.validator.constraints.NotBlank;
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 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.AUTO)
    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)
}
  •   所有你的域模型,必须有@Entity注解。有了这个注解你才能持久化这个类(持久化这个词,我不知道翻译准确不准确,目前来说,我只要用就OK了,所以如果小伙伴也是new to java的话,可以像我这样不求甚解,当然,有大佬读到也请指正。)
  • @Table注解是用来提供这个映射这个表的详情的。
  • @Id 这个注解是用来定义主键的
  • @GeneratedValue 这个注解是用来定义主键的生成策略的。在上面的例子中,我们定义了主键为自动增加。
  • @NotBlank 注解是用来验证声明的字段是否是空或者null
  • @Column注解是用来定义字段的属性。你可以定义多个属性,例如name(名字),length(长度),nullable(可为空),updateable(可更新)等等。默认,在数据库中一个属性createAt会被映射为create_at字段。所有的驼峰命名在数据库中都会被转换为下划线式的命名方式。如果你想给这个属性不同的字段名字,你也可以自己指定:
     @Column(name = "created_on")/* 这个name属性就是用来指定字段名字的 */
      private String createdAt;
  • @Temporal注解是需要java.util.Date和Java.util.Calendar类的。它能够通过versa将Java时间和日期对象转换为数据库能够使用的时间类型
  • @JsonIgnoreProperties 注解是一个Jackson注解.Spring Boot 使用Jackson作为序列化和初始化一个Java到JSON数据的类。有这个注解是因为我们不想让客户端提供createAt和updateAt 这个值。如果如果客户端提供了,那么我们就会无视。当然我们会把这些数据展现在返回的JSON中。

Updated at 2017-12-11 待续

 

 

未经允许不得转载:RffanLAB|Rffan实验室 » [翻译]Spring Boot,MySQL,JPA,Hibernate Restful CRUD API 教程

赞 (1) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏