前言

之前一段时间学习了一些springboot的一些基础使用方法和敲了一些例子,是时候写一个简单的crud来将之前学的东西做一个整合了 —— 一个员工列表的增删改查。

使用 restful api

这次的CRUD将使用restful api的风格,restful api的风格现在非常流行,那restful api和传统的api有什么区别呢?

举个例子来说吧

查找某个用户

  • 传统api: /getUserByID?id=123
  • restful api: 使用GET方法 /user/123

添加用户

  • 传统api:/addUser?xxx
  • restful api: 使用POST方法 /user

restful api 使用统一资源标识符(URI)来寻址资源。所带的参数直接用“/”跟在后面,“/”用来表示指示层级关系,而不会用?key=value的方式来定义URI。

另外,restful api中对http请求方法的使用也有讲究, GET:查询,POST:新增,PUT:更新,DELETE:删除。restful api用HTTP请求方式区分对资源CRUD操作

而在传统的api中一般简单的就用GET,复杂一点的就用POST,传统api使用crud来区分操作

下面我先定义一下这次实现restful crud 的请求架构

功能 请求URI 请求方式
查询所有员工 /emps GET
查询某个员工 /emp/{id} GET
来到添加页面 /emp GET
添加员工 /emp POST
修改员工 /emp PUT
删除员工 /emp/{id} DELETE

使用thymeleaf模板引擎

thymeleaf是springboot推荐使用的模板引擎,我用起来也是十分舒服的,再也不用像之前那样苦逼地在js中拼接字符串了。

同时,前端页面用的是基于bootstrap 的一套模板页面。

就先介绍这么多了,有其他要补充的就要下面的实践中说吧,下面,我们就开始一步步构建这个restful crud!!

开发环境:springboot2.1.6、maven3.3.6、jdk 8、IDEA 2018、mysql5.7


创建项目,引入依赖

<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--数据库依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency> <!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

在application.yml中进行数据库配置

spring:
#数据库配置
datasource:
url: jdbc:mysql://localhost:3306/restFulCrud?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver #mybatis配置
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.jotal.springboot08restfulcrud.entities

mapper-location就是放置mybatis映射文件的地方,classpath: 表示包名下 src->main->resources/

type-aliases-package 为实体类添加别名,方便使用

实体类

Employee员工类

package com.jotal.springboot08restfulcrud.entities;

public class Employee {

   private Integer emp_id;
private String lastName; private String email;
//1 male, 0 female
private Integer gender;
private Department department;
private Date birth; //getter、setter、constructor、toString
}

Department部门类

package com.jotal.springboot08restfulcrud.entities;

public class Department {
private Integer departmentId;
private String departmentName; //getter、setter、constructor、toString

User系统用户类

package com.jotal.springboot08restfulcrud.entities;

public class User {

    private String username;
private String password; //getter、setter、constructor、toString
}

创建数据库,添加数据

DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`departmentId` int(10) NOT NULL AUTO_INCREMENT,
`departmentName` varchar(50) NOT NULL,
PRIMARY KEY (`departmentId`)
) ENGINE=InnoDB AUTO_INCREMENT=104 DEFAULT CHARSET=utf8; INSERT INTO `department` VALUES ('101', 'A-A');
INSERT INTO `department` VALUES ('102', 'B-B');
INSERT INTO `department` VALUES ('103', 'C-C'); DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`emp_id` int(10) NOT NULL AUTO_INCREMENT,
`lastName` varchar(20) NOT NULL,
`email` varchar(100) NOT NULL,
`gender` tinyint(2) NOT NULL DEFAULT '1' COMMENT '0:女\r\n1:男',
`birth` date NOT NULL,
`department` int(10) DEFAULT NULL,
PRIMARY KEY (`emp_id`),
KEY `dept` (`department`),
CONSTRAINT `dept` FOREIGN KEY (`department`) REFERENCES `department` (`departmentId`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1008 DEFAULT CHARSET=utf8; INSERT INTO `employee` VALUES ('1001', 'AA01', '1001@j.com', '1', '2019-08-12', '101');
INSERT INTO `employee` VALUES ('1002', 'BB02', '1002@j.com', '1', '2019-08-17', '102');
INSERT INTO `employee` VALUES ('1003', 'CC03', '1003@j.com', '1', '2019-08-05', '103');
INSERT INTO `employee` VALUES ('1004', 'CC04', '1004@j.com', '0', '2019-08-12', '103');
INSERT INTO `employee` VALUES ('1005', 'jotal', '1066@qq.com', '1', '1997-10-07', '102'); DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `user` VALUES ('admin', '123');
INSERT INTO `user` VALUES ('jotal', '123');

其中创建数据库的时候我遇到了一个错误,特此记录一下。

employee表中的department存的是departmentId 部门ID,department设为外键,我设置如果父表department删除了该部门,employee中的department字段就设置为空,但是之前设计的时候employee的department字段我设置了not null,所以保存的时候会出错。解决办法就是department字段设置可以为空就可以了。

看一下外键约束的四种方式:

CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;

SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;

RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录 ; NO ACTION:同 RESTRICT,也是首先先检查外键;

今天我们先讲到这里,今天主要就是介绍了一下这个crud的一些要点,例如使用什么技术,是什么风格的。还有创建了项目,添加了数据,紧接着要做的就是写dao层,看能不能成功从数据库中取出数据。see you!

使用springboot实现一个简单的restful crud——01、项目简介以及创建项目的更多相关文章

  1. 使用springboot实现一个简单的restful crud——03、前端页面、管理员登陆(注销)功能

    前言 这一篇我们就先引入前端页面和相关的静态资源,再做一下管理员的登陆和注销的功能,为后续在页面上操作数据做一个基础. 前端页面 前端的页面是我从网上找的一个基于Bootstrap 的dashboar ...

  2. 使用springboot实现一个简单的restful crud——02、dao层单元测试,测试从数据库取数据

    接着上一篇,上一篇我们创建了项目.创建了实体类,以及创建了数据库数据.这一篇就写一下Dao层,以及对Dao层进行单元测试,看下能否成功操作数据库数据. Dao EmpDao package com.j ...

  3. 使用webpy创建一个简单的restful风格的webservice应用

    下载:wget http://webpy.org/static/web.py-0.38.tar.gz解压并进入web.py-0.38文件夹安装:easy_install web.py 这是一个如何使用 ...

  4. 使用springboot写一个简单的测试用例

    使用springboot写一个简单的测试用例 目录结构 pom <?xml version="1.0" encoding="UTF-8"?> < ...

  5. springboot搭建一个简单的websocket的实时推送应用

    说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...

  6. 【SpingBoot】 测试如何使用SpringBoot搭建一个简单后台1

    很久没写博客了,最近接到一个组内的测试开发任务是做一个使用SpringBoot 开发一个后台程序(还未完成),特写感想记录一下 1. 为什么选择SpringBoot ? 首先是目前很多公司的后台还是J ...

  7. 基础项目构建,引入web模块,完成一个简单的RESTful API 转载来自翟永超

    简介 在您第一次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复粘贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot ...

  8. laravel 实现一个简单的 RESTful API

    创建一个 Article 资源 php artisan make:resource Article 你可以在 app/Http/Resources 目录下看到你刚刚生成的 Article 资源 当然我 ...

  9. 一、基础项目构建,引入web模块,完成一个简单的RESTful API

    一.Spring Boot的主要优点: 为所有Spring开发者更快的入门 开箱即用,提供各种默认配置来简化项目配置 内嵌式容器简化Web项目 没有冗余代码生成和XML配置的要求 二.使用maven构 ...

随机推荐

  1. hadoop 综合大作业

    作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 本次作业是在期中大作业的基础上利用hadoop和hive技术进行 ...

  2. 城东C位之路!探秘三线楼市板块崛起3大核心基因

    等着咧!伍家篇什么时候出?这就出. 城东C位之路!- 诸葛磊 好几个粉丝已经在催了,诸葛磊决定改变下写作策略,伍家岗篇分版块用小篇幅来写,这样文章不至于太长,否则又是一篇洋洋洒洒上万字的文章,粉丝看着 ...

  3. Java-JUC(十二):有3个线程。线程A和线程B并行执行,线程C需要A和B执行完成后才能执行。可以怎么实现?

    方案(一)CountDownLatch: 使用CountDownLatch+Semaphore方式实现: import java.util.concurrent.CountDownLatch; imp ...

  4. F12修改html进行本地js操作页面元素

    F12修改html进行本地js操作页面元素

  5. html页面自适应宽度

    html页面实现响应式的方式有很多,本篇介绍懒人必备一招见效的方法. 在head标签中加入 <meta name="viewport" content="width ...

  6. cmake find_package说明

    CMake中find_package功能演示 find_package可以被用来在系统中自动查找配置构建工程所需的程序库.在linux和unix类系统下这个命令尤其有用.CMake自带的模块文件里有大 ...

  7. [LeetCode] 232. Implement Queue using Stacks 用栈来实现队列

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...

  8. [LeetCode] 712. Minimum ASCII Delete Sum for Two Strings 两个字符串的最小ASCII删除和

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  9. .Net Core 1.1 + CentOs 7 环境配置

    centos7下使用yum安装mysql5.7.10 参考:http://www.cnblogs.com/hwd-cnblogs/p/5213337.html http://www.jb51.net/ ...

  10. Harbor的安装和基本使用

    Harbor是一个开源的云原生registry工程.Harbor对开源的Docker Distribution扩进行了扩展,支持registries之间镜像的复制功能,而且还提供了一些高级的安全方面的 ...