前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[翻译]Spring Boot,MySQL,JPA,Hibernate Restful CRUD API 教程

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

作者头像
用户2353021
发布2020-05-11 17:45:56
2K0
发布2020-05-11 17:45:56
举报
文章被收录于专栏:RFFAN实验室

[写在翻译前]

这篇文章是我准备用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 应用的入口点

代码语言:javascript
复制
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出身)叫做

代码语言:javascript
复制
@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 用它的账号密码你们可登陆不了。)

代码语言:javascript
复制
## 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 添加一下内容:

代码语言:javascript
复制
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中。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档