SpringBoot开发Restful风格的接口实现CRUD功能
基于SpringBoot开发一个Restful接口
- 前言
- 一、什么是SpringBoot?
- 二、实战---基于SpringBoot开发一个Restful接口
- 1.开发前的准备工作
- 1.1 添加相关依赖 (pom文件)
- 1.2 创建相关数据库和表
- 1.3 数据库配置文件
- 2.实战开发---代码逻辑
- 2.1 实体类
- 2.2 Dao层代码逻辑
- 2.3 Service 层逻辑层
- 2.4 Controller 控制层代码逻辑
- 2.5 Application 主程序
- 三、测试
- 总结
前言
什么是Restful风格接口
Restful(Representational State Transfer)风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
在Restful风格中,用户请求的url使用同一个url而用请求方式:get,post,delete,put…等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口。
Restful风格接口的规定如下
GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。POST(CREATE):在服务器新建一个资源,调用insert操作。
PUT(UPDATE):在服务器更新资源,调用update操作。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源,调用delete语句。
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是SpringBoot?
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。假如我们想简单的开发一个对外的接口,那么只需要以下代码就可以了。
一个主程序启动springBoot----核心
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
控制层代码:
@RestController
public class HelloController {@RequestMapping("/hello")public String hello() { return "Hello World";}}
成功启动主程序之后,编写控制层,然后在浏览器输入 http://localhost:8080//hello 便可以查看信息。
二、实战—基于SpringBoot开发一个Restful接口
1.开发前的准备工作
1.1 添加相关依赖 (pom文件)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.springboot</groupId><artifactId>springbootdemo</artifactId><version>0.0.1-SNAPSHOT</version><name>springbootdemo</name><description>Demo project for Spring Boot</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring Boot Mybatis 依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.2.0</version></dependency><!-- MySQL 连接驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency></dependencies><build><plugins><!--运用SpringBoot 插件 使用spring-boot-devtools模块的应用,当classpath中的文件有改变时,会自动重启!--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork></configuration></plugin></plugins></build>
</project>
1.2 创建相关数据库和表
首先,需要在MySql中创建一个数据库和一张数据库的名称为jdbc,表名称为 user,建表语句脚本如下:
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',`email` varchar(255) NOT NULL COMMENT '邮箱',`password` varchar(255) NOT NULL COMMENT '密码',`username` varchar(255) NOT NULL COMMENT '姓名',PRIMARY KEY (`id`),UNIQUE KEY `email` (`email`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
表中插入数据:
INSERT INTO `user` VALUES ('1', '1@qq.com', '123456', '张三');
INSERT INTO `user` VALUES ('2', '2@qq.com', '234567', '李四');
INSERT INTO `user` VALUES ('3', '3@qq.com', '345678', '王五');
1.3 数据库配置文件
接着需要使用application.properties进行一些自定义的配置,例如数据源的连接配置等等。我这里的配置文件如下:
## 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver## Mybatis 配置
# 配置为 com.pancm.bean 指向实体类包路径。
mybatis.typeAliasesPackage=com.springboot.bean
# 配置为 classpath 路径下 mapper 包下,* 代表会扫描所有 xml 文件。
mybatis.mapperLocations=classpath\:mapper/*.xml
2.实战开发—代码逻辑
成功创建好数据库、数据表以及下载好相应jar包、配置文件等这些准备工作之后。接下来正式进行SpringBoot项目的开发。
2.1 实体类
前面在数据库中创建了一张user表,这里先创建一个bean包然后该包下创建一个对应该表的User实体类,里面的字段对应user表的字段,代码如下:
package com.springboot.springbootdemo.bean;public class User {private long id;private String email;private String password;private String username;public long getId() {return id;}public void setId(int id) {this.id = id;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}}
2.2 Dao层代码逻辑
在dao层的逻辑,hibernate和mybatis一般都有两种方式实现数据库的CRUD:
第一种是xml的mapper配置。
第二种是使用注解,@Insert、@Select、@Update、@Delete 这些来完成。
首先新建一个dao包并在dao包下新建一个接口,命名为UserDao,代码如下:
package com.springboot.springbootdemo.dao;import com.springboot.springbootdemo.bean.User;
import org.apache.ibatis.annotations.*;import java.util.List;/**在接口上添加了这个注解表示这个接口是基于注解实现的CRUD**/
@Mapper
public interface UserDao {/*** 新增数据*/@Insert("insert into user(id,email,password,username) values (#{id},#{email},#{password},#{username})")void addUser(User user);/*** 修改数据*/@Update("update user set username=#{username},password=#{password} where id=#{id}")void updateUser(User user);/*** 删除数据*/@Delete("delete from user where id=#{id}")void deleteUser(int id);/*** 根据id查询数据**/@Select("select id,email,password,username from user where username=#{userName}")User findByName(@Param("userName") String userName);/*** 查询所有数据*/@Select("select id,email,password,username FROM user")List<User> findAll();
}
说明:
mapper : 在接口上添加了这个注解表示这个接口是基于注解实现的CRUD。
Results: 返回的map结果集,property 表示User类的字段,column 表示对应的数据库的字段。
Param:sql条件的字段。
Insert、Select、Update、Delete:对应数据库的增、查、改、删。
2.3 Service 层逻辑层
接着新建一个service包,然后在service包下新建一个userservice接口和UserServiceImpl类实现userservice接口,代码分别如下:代码如下:
UserService接口:
package com.springboot.springbootdemo.service;import com.springboot.springbootdemo.bean.User;import java.util.List;public interface UserService {/*** 新增用户* @param user* @return*/boolean addUser(User user);/*** 修改用户* @param user* @return*/boolean updateUser(User user);/*** 删除用户* @param id* @return*/boolean deleteUser(int id);/*** 根据名字查询用户信息* @param userName*/User findUserByName(String userName);/*** 查询所有数据* @return*/List<User> findAll();
}
UserServiceImpl实现类:
package com.springboot.springbootdemo.service;import com.springboot.springbootdemo.bean.User;
import com.springboot.springbootdemo.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;import java.util.List;public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic boolean addUser(User user) {boolean flag=false;try{userDao.addUser(user);flag=true;}catch(Exception e){e.printStackTrace();}return flag;}@Overridepublic boolean updateUser(User user) {boolean flag=false;try{userDao.updateUser(user);flag=true;}catch(Exception e){e.printStackTrace();}return flag;}@Overridepublic boolean deleteUser(int id) {boolean flag=false;try{userDao.deleteUser(id);flag=true;}catch(Exception e){e.printStackTrace();}return flag;}@Overridepublic User findUserByName(String userName) {return userDao.findByName(userName);}@Overridepublic List<User> findAll() {return userDao.findAll();}
}
2.4 Controller 控制层代码逻辑
新建一个controller包,然后新建一个usercontroller类,具体代码如下:
package com.springboot.springbootdemo.controller;
import com.springboot.springbootdemo.bean.User;
import com.springboot.springbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping(value = "/do/user")
public class UserController {@Autowired
private UserService userService;@RequestMapping(value = "/user", method = RequestMethod.POST)public boolean addUser(@RequestBody User user) {return userService.addUser(user);}@RequestMapping(value = "/user", method = RequestMethod.PUT)public boolean updateUser(@RequestBody User user) {return userService.updateUser(user);}@RequestMapping(value = "/user", method = RequestMethod.DELETE)public boolean delete(@RequestParam(value = "userId", required = true) int userId) {return userService.deleteUser(userId);}@RequestMapping(value = "/user", method = RequestMethod.GET)public User findByUserName(@RequestParam(value = "userName", required = true) String userName) {return userService.findUserByName(userName);}@RequestMapping(value = "/userAll", method = RequestMethod.GET)public List<User> findByUserAge() {return userService.findAll();}
}
说明:
RestController:默认类中的方法都会以json的格式返回。
RequestMapping: 接口路径配置。
method : 请求格式。
RequestParam: 请求参数。
RequestBody:该注解用于定义请求正文内容类型,将参数自动解析成该类的一个实例。
2.5 Application 主程序
在创建springboot项目的时候下面的代码就默认生成:
package com.springboot.springbootdemo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.springboot.springbootdemo.dao")
public class SpringbootdemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootdemoApplication.class, args);}
}
说明:
SpringApplication从main方法启动Spring应用的类。 默认,它会执行以下步骤:
1.创建一个合适的ApplicationContext实例 (取决于classpath)。
2.注册一个CommandLinePropertySource,以便将命令行参数作为Spring properties。
3.刷新application context,加载所有单例beans。
4.激活所有CommandLineRunner beans。直接使用main启动该类,SpringBoot便自动化配置了。该类的一些注解说明:
SpringBootApplication:开启组件扫描和自动配置。
MapperScan: mapper 接口类扫描包配置
三、测试
开发完上述代码之后,进行下代码测试,看是否实现了效果。先启动启动Application类,然后这里使用postman工具进行接口的测试,就不写前端代码了,在实际的开发过程中,现在很多的项目都是实现了前后端分离,所以一般前后端分开开发,通常后台的逻辑就需要自己进行接口测试,一般我们则使用postman。
敲黑板首先启动postman,然后新建一个一个url地址,将测试地址输入进去。
【测试一】先来验证查询所有的数据逻辑:
http://localhost:8080/do/user/userAll
【测试二】 接下来测试删除数据:
http://localhost:8080/do/user/user?id=3
id为3的数据已经被删除了:
【测试三】测试根据姓名查询数据:
http://localhost:8080/do/user/user?userName=张三
【测试四】测试更新数据:
http://localhost:8080/do/user/user
数据库中id为2的数据已被更新:
【测试五】测试新增数据:
http://localhost:8080/do/user/user
数据库中新增了id为3的数据:
总结
以上就是springboot如何开发一个具有Restful风格的接口的全部内容,最后如果觉得本文写得不错,就点下赞和再看推荐给更多的人呗。
相关文章:

SpringBoot开发Restful风格的接口实现CRUD功能
基于SpringBoot开发一个Restful接口 前言一、什么是SpringBoot?二、实战---基于SpringBoot开发一个Restful接口1.开发前的准备工作1.1 添加相关依赖 (pom文件) 1.2 创建相关数据库和表1.3 数据库配置文件 2.实战开发---代码逻辑2.1 实体类2.2…...

【Servlet学习三】实现一个内存版本的简易计算器~
目录 一、方式1:使用form表单的形式(不推荐) 🌈1、前端代码:HTML文件 🌈2、后端代码:Calculator_form.java文件 🌈3、最终效果 二、方式2:使用ajax形式(…...
Linux c语言获取本机网关 ip 地址
文章目录 前言一、获取本机网关 ip 地址1.1 代码示例1.2 代码详解介绍 二、使用Netlink套接字实时监控网络事件2.1 简介2.2 示例代码 前言 这篇文章写了获取本机的ip地址和子网掩码:Linux c语言获取本机 ip、子网掩码 一、获取本机网关 ip 地址 使用Netlink套接字…...

nginx部署本地项目如何让异地公网访问?服务器端口映射配置!
接触过IIS或apache的小伙伴们,对nginx是比较容易理解的,nginx有点类似,又有所差异,在选择使用时根据自己本地应用场景来部署使用即可。通过一些对比可能会更加清楚了解: 1.nginx是轻量级,比apache占用更少…...

云时代已至,新一代数据分析平台是如何实现的?
2023 年 5 月,由 Stackoverflow 发起的 2023 年度开发者调查数据显示,PostgreSQL 已经超越 MySQL 位居第一,成为开发人员首选。PostgreSQL 在国内的热度也越来越高。6 月 17 日,PostgreSQL 数据库技术峰会在成都顺利召开。本次大会…...

【C#】简单聊下Framework框架下的事务
框架用的多了,之前版本的事务都忘记了。本次简单聊下.net framework 4.8框架下本身的事务 目录 1、SqlClient2、TransactionScope3、引用 1、SqlClient 在 C# 中,使用 using 块可以方便地实现对资源的自动释放,但它不适用于实现事务处理。为…...
asyncPool并发执行请求函数
asyncPool应用场景 一个不太常见的极端场景,当我们为了某个操作需要发生异步请求的时候,等待所有异步请求都完成时进行某些操作。这个时候我们不在简简单单的发送 1 - 2 个请求而是 5 - 10个(其实极端场景式 很多很多个请求,这个…...
Ubuntu 22.04上安装NFS服务
1、使用如下命令安装NFS服务端软件: # 在主机上运行以下命令 orangepiorangepi5:~$ sudo apt install nfs-server 2、在配置NFS时需要使用用户uid和组gid,可以使用id命令查看 # 在主机上运行id命令 orangepiorangepi5:~$ id uid1000(orangepi) gid100…...

数据结构--双链表
数据结构–双链表 单链表 VS 双链表 单链表:无法逆向检索,有时候不太方便 双链表:可进可退,存储密度更低一丢丢 双链表的定义 typedef struct DNode {ElemType data;struct DNode *prior, *next; }DNode, *DLinkList;双链表的初…...
javassist 动态修改 jar 包中 class
Javassist(Java Programming Assistant)是一个用于在运行时操作字节码的库,它可以用于动态修改和操作Java类。使用Javassist,可以通过修改现有的类或创建新的类来实现动态修改Jar包中的类。 下面是一个简单的示例,展示…...
什么是CC攻击?
CC攻击:DDOS(分布式拒绝服务攻击)的一种。黑客利用代理服务器或者控制的肉鸡,向目标web网页发送大量的请求,致使CPU处理不过来这么多的请求,长期处于100%的状态。造成通过该页面访问的端口堵塞,正常请求进不来。 怎么…...
LeetCode解法汇总253. 重构 2 行二进制矩阵
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个 2 行 n 列的二进制数组: 矩阵是一个二进制矩阵࿰…...

ChatGPT实战:生成演讲稿
当众发言(演讲)是一种传达信息、观点和情感的重要方式。通过演讲,人们可以在公共场合表达自己的观点,向观众传递自己的知识和经验,激发听众的思考和行动。无论是商务演讲、学术讲座还是政治演说,演讲稿的写…...

在线搭建K8S,kubernetes集群v1.23.9,docker支持的最后一个版本
1. 部署环境主机(条件说明) master 192.168.186.128 CentOS Linux release 7.9.2009 (Core) node1 192.168.186.129 CentOS Linux release 7.9.2009 (Core) node2 192.168.186.130 CentOS Linux release 7.9.2009 (Core)2. 系统初始化-所有节点&am…...
http自动跳转https的配置方法
要将HTTP自动重定向到HTTPS,您需要在Web服务器上进行以下配置: 在Web服务器上安装SSL证书。 打开Web服务器配置文件(如Apache的httpd.conf或Nginx的nginx.conf)。 找到监听HTTP请求的端口(通常是80端口)。…...
重新初始化k8s集群
执行如下命令,所有节点都执行 kubeadm reset初始化集群,仅在master(centos01)上执行 [rootcentos01 opt]# kubeadm init --apiserver-advertise-address 192.168.109.130 --image-repository registry.aliyuncs.com/google_containers --kubernetes-ve…...

JetBrains编程IDE将具备Ai助手功能,或将提高开发速度
近日JetBrains发布博客文章宣布,本周所有基于IntelliJ的IDE和.NET工具的EAP版本都将具备AI助手功能。而这些操作或许将提高开发效率,并且这些AI助手也是使用自家的**ERP**模型和OpenAI服务。 JetBrains表示,当下AI助手功能主要体现在IDE的两…...

【网络原理】TCP/IP协议五层模型
🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 本期讲解协议、OSI七层模型、TCP/IP五层模型、网络设备所在的分层、数据的封装和分佣。 目录 …...
【备战秋招】每日一题:2023.05.10-华为OD机试(第二题)-解密
为了更好的阅读体检,可以查看我的算法学习博客 在线评测链接:P1307 题目内容 在全球恐怖主义危机下,一组间谍团队接收到了来自地下工作者的一串神秘代码。这组代码可以帮助他们访问恐怖分子的服务器,但是他们需要先解密代码才能使用它。代…...
【华为OD机试】矩阵最大值(python, java, c++, js)
矩阵最大值 前言:本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于OD机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:nansun0903@163.com;备注:CSDN。 题目描述 给定…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...