前言

之前一段时间学习了一些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. Selenium对浏览器支持的版本【2019/10/25更新】

    最新的selenium与几种常用浏览器的版本兼容情况:(以下驱动,点击直接跳转官方下载地址) 尽量选择最新版本-1的浏览器,比如最新的是60,那就使用59.(建议Chrome更新至72+版本.Fire ...

  2. 为什么Map桶中个数超过8才转为红黑树

    这是笔者一个好友面试阿里时,被问及的一个问题,应该不少人看到这个问题都会一面懵逼.因为,大部分的文章都是分析链表是怎么转换成红黑树的,但是并没有说明为什么当链表长度为8的时候才做转换动作.笔者第一反应 ...

  3. 【转】怎么去阅读Chromium的源码?

    同样路过一下. 从初学者角度的话,如果是刚开始研究chromium,建议找个老版本chromium来看.新版太大太复杂了. 我建议从github搜下chromium.bb这个项目,是个chromium ...

  4. spring源码的设计模式

    转:https://blog.csdn.net/huyang0304/article/details/82928900 接下来我们只介绍在Spring中常用的设计模式. 1.1.简单工厂模式(Fact ...

  5. MySql分区后创建索引加速单表查询和连表查询

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/konkon2012/article/de ...

  6. 使用 Spring Cloud Sleuth、Elastic Stack 和 Zipkin 做微服务监控

    关于迁移微服务架构,最常被提及的挑战莫过于监控.每个微服务应独立于其他服务的运行环境,所以他们之间不会共享如数据源.日志文件等资源. 然而,较容易的查看服务的调用历史,并且能够查看多个微服务的请求传播 ...

  7. 【Java】Spring之基于注释的容器配置(四)

    注释是否比配置Spring的XML更好? 基于注释的配置的引入引发了这种方法是否比XML“更好”的问题.答案是每种方法都有其优点和缺点,通常,由开发人员决定哪种策略更适合他们.由于它们的定义方式,注释 ...

  8. LeetCode_405. Convert a Number to Hexadecimal

    405. Convert a Number to Hexadecimal Easy Given an integer, write an algorithm to convert it to hexa ...

  9. VS2013+OpenCV3.4.2编译

    一.准备工作: (1)在OpenCV官网下载3.4.2版本(注意选择Win pack),https://opencv.org/releases.html. (2)下载Contrib模块,https:/ ...

  10. Quartus ii 设计中的差分信号在例化时的命名规则

    在Quartus中做设计,如果使用了差分信号的,如DDR的IP中的mem_ck与mem_ck_n,mem_dqs与mem_dqs_n,将其引入输出端口时,对其命名有一定的规则,否则就会出现错误. 如下 ...