[写在翻译前]
这篇文章是我准备用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 教程