SpringBoot开发Restful风格的接口实现CRUD功能

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 我们都知道SpringBoot的出现使得在开发web项目的时候变得更加方便、快捷。之前写过一篇文章是如何快速搭建一个springboot项目:SpringBoot入门:使用IDEA和Eclipse构建第一个SpringBoot项目。本文则介绍下如何基于SpringBoot开发Restful风格的接口实现来CRUD功能。

一、前言


我们都知道SpringBoot的出现使得在开发web项目的时候变得更加方便、快捷。之前写过一篇文章是如何快速搭建一个springboot项目:SpringBoot入门:使用IDEA和Eclipse构建第一个SpringBoot项目。本文则介绍下如何基于SpringBoot开发Restful风格的接口实现来CRUD功能。


二、概念


什么是SpringBoot




Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。


简单的来说就是,只需几个jar和一些简单的配置,就可以快速开发项目。引用下SpringBoot实战这本书里面的话:


这里没有配置,没有web.xml,没有构建说明,甚至没有应用服务器,但这就是整个
应用程序了。SpringBoot会搞定执行应用程序所需的各种后勤工作,你只要搞定应
用程序的代码就好。
复制代码


假如我们想简单的开发一个对外的接口,那么只需要以下代码就可以了。


一个主程序启动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 便可以查看信息。


6d7b29e7af28449488e65f993e1dd244~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


什么是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开发一个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', '王五');
复制代码



3f6eef8887dd4d06a51490d92bd8b522~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


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 这些来完成。


在这里我使用spring的JPA来完成基本的增删改查,也是基于注解的使用。关于springboot如何整合jpa可以参考这篇文章,以前有详细介绍过:SpringBoot整合JPA进行数据访问


首先新建一个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 {
    @Autowired
    private UserDao userDao;
    @Override
    public boolean addUser(User user) {
        boolean flag=false;
        try{
            userDao.addUser(user);
            flag=true;
        }catch(Exception e){
            e.printStackTrace();
        }
        return flag;
    }
    @Override
    public boolean updateUser(User user) {
        boolean flag=false;
        try{
            userDao.updateUser(user);
            flag=true;
        }catch(Exception e){
            e.printStackTrace();
        }
        return flag;
    }
    @Override
    public boolean deleteUser(int id) {
        boolean flag=false;
        try{
            userDao.deleteUser(id);
            flag=true;
        }catch(Exception e){
            e.printStackTrace();
        }
        return flag;
    }
    @Override
    public User findUserByName(String userName) {
        return userDao.findByName(userName);
    }
    @Override
    public 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
复制代码


603f8effeb2e4717b695304c4ae2c861~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


   接下来测试删除数据:


http://localhost:8080/do/user/user?id=3
复制代码


a6bc0445dde24b5496d2488950369a72~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


id为3的数据已经被删除了:


33dc6fd24eab4e5dbd930c6c0cbaa201~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


测试根据姓名查询数据:


http://localhost:8080/do/user/user?userName=张三
复制代码


670c7ad048b84487b6d154845800f7be~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


测试更新数据:


http://localhost:8080/do/user/user
复制代码


64ad4084b65a425a9945ade807e999f8~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


数据库中id为2的数据已被更新:

49a78dc9614b4231812d8086a145dd4b~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


测试新增数据:


http://localhost:8080/do/user/user
复制代码


da993524865d430a9fc18bf9d110f364~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


   数据库中新增了id为3的数据:


11cb21dc56fe495b97b97630961e0ba9~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


四、尾声


以上就是springboot如何开发一个具有Restful风格的接口的全部内容,并且本文的源码已经同步至github,如果有需要可以下载。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
25天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
110 13
|
1月前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
JSON API 数据格式
探索后端开发:从零构建简易RESTful API
在数字时代的浪潮中,后端开发如同搭建一座桥梁,连接着用户界面与数据世界。本文将引导读者步入后端开发的殿堂,通过构建一个简易的RESTful API,揭示其背后的逻辑与魅力。我们将从基础概念出发,逐步深入到实际操作,不仅分享代码示例,更探讨如何思考和解决问题,让每一位读者都能在后端开发的道路上迈出坚实的一步。
|
2月前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
47 2
|
2月前
|
缓存 前端开发 API
深入浅出:后端开发中的RESTful API设计原则
【10月更文挑战第43天】在数字化浪潮中,后端开发如同搭建梦想的脚手架,而RESTful API则是连接梦想与现实的桥梁。本文将带你领略API设计的哲学之美,探索如何通过简洁明了的设计,提升开发效率与用户体验。从资源定位到接口约束,从状态转换到性能优化,我们将一步步构建高效、易用、可维护的后端服务。无论你是初涉后端的新手,还是寻求进阶的开发者,这篇文章都将为你的开发之路提供指引。让我们一起走进RESTful API的世界,解锁后端开发的新篇章。
|
2月前
|
安全 测试技术 API
构建高效RESTful API:后端开发的艺术与实践####
在现代软件开发的浩瀚星空中,RESTful API如同一座桥梁,连接着前端世界的绚丽多彩与后端逻辑的深邃复杂。本文旨在探讨如何精心打造一款既高效又易于维护的RESTful API,通过深入浅出的方式,剖析其设计原则、实现技巧及最佳实践,为后端开发者提供一份实用的指南。我们不深入晦涩的理论,只聚焦于那些能够即刻提升API品质与开发效率的关键点,让你的API在众多服务中脱颖而出。 ####
37 0
|
2月前
|
JSON 缓存 JavaScript
深入浅出:使用Node.js构建RESTful API
在这个数字时代,API已成为软件开发的基石之一。本文旨在引导初学者通过Node.js和Express框架快速搭建一个功能完备的RESTful API。我们将从零开始,逐步深入,不仅涉及代码编写,还包括设计原则、最佳实践及调试技巧。无论你是初探后端开发,还是希望扩展你的技术栈,这篇文章都将是你的理想指南。
|
1月前
|
JSON JavaScript 前端开发
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将引导您步入Node.js的奇妙世界,通过实践操作,掌握如何使用这一强大的JavaScript运行时环境构建高效、可扩展的RESTful API。我们将一同探索Express框架的使用,学习如何设计API端点,处理数据请求,并实现身份验证机制,最终部署我们的成果到云服务器上。无论您是初学者还是有一定基础的开发者,这篇文章都将为您打开一扇通往后端开发深层知识的大门。
50 12
|
2月前
|
XML JSON 缓存
深入理解RESTful API设计原则与实践
在现代软件开发中,构建高效、可扩展的应用程序接口(API)是至关重要的。本文旨在探讨RESTful API的核心设计理念,包括其基于HTTP协议的特性,以及如何在实际应用中遵循这些原则来优化API设计。我们将通过具体示例和最佳实践,展示如何创建易于理解、维护且性能优良的RESTful服务,从而提升前后端分离架构下的开发效率和用户体验。
|
2月前
|
监控 安全 API
深入浅出:构建高效RESTful API的最佳实践
在数字化时代,API已成为连接不同软件和服务的桥梁。本文将带你深入了解如何设计和维护一个高效、可扩展且安全的RESTful API。我们将从基础概念出发,逐步深入到高级技巧,让你能够掌握创建优质API的关键要素。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的指导和启示。让我们一起探索API设计的奥秘,打造出色的后端服务吧!