还不会用springboot写接口?快看这里,手把手操作,一发入魂~

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 还不会用springboot写接口?快看这里,手把手操作,一发入魂~

1、springboot简介



Spring Boot 可以轻松创建可以“直接运行”的独立的、生产级的基于 Spring 的应用程序。


特征


创建独立的 Spring 应用程序

直接嵌入 Tomcat、Jetty 或 Undertow(无需部署 WAR 文件)

提供强壮的“入门”依赖项以简化您的构建配置

尽可能自动配置 Spring 和第三方中间件

提供生产就绪功能,例如指标、健康检查和外部化配置

完全无需代码生成,无需 XML 配置


2、新建springboot web项目



按以下步骤依次操作


image.png

image.png

image.png


初始化项目完整的结构


image.png


3、基本配置



3.1 引入相关依赖


mysql连接依赖


<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>


mybatis-plus


MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。


特性


无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作


<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>


knife4j


Knife4j的前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一个纯swagger-ui的ui皮肤项目。

一开始项目初衷是为了写一个增强版本的swagger的前端ui,但是随着项目的发展,面对越来越多的个性化需求,不得不编写后端Java代码以满足新的需求,在swagger-bootstrap-ui的1.8.5~1.9.6版本之间,采用的是后端Java代码和Ui都混合在一个Jar包里面的方式提供给开发者使用.这种方式虽说对于集成swagger来说很方便,只需要引入jar包即可,但是在微服务架构下显得有些臃肿。

因此,项目正式更名为knife4j,取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍,更名也是希望把她做成一个为Swagger接口文档服务的通用性解决方案,不仅仅只是专注于前端Ui前端.


<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>


完整pom.xml文件


<?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.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yinfeng</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>test</name>
    <description>test</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>


3.2 完成application.yml文件配置


server:
  # 服务端口
  port: 8888
spring:
  application:
    name: yinfeng-test
  # 数据库相关配置
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: yinfeng
    driver-class-name: com.mysql.cj.jdbc.Driver


image.png


3.3 配置knife4j


/**
 * @author yinfeng
 * @description knife4j配置
 * @since 2022/3/12 21:49
 */
@Configuration
@EnableSwagger2
public class Knife4jConfig {
    @Bean
    public Docket buildDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder().title("隐风 API文档").version("1.0").build())
                .select()
                .apis(RequestHandlerSelectors
                        .basePackage("com.yinfeng.test.controller"))
                .paths(PathSelectors.any())
                .build();
    }
}


/**
 * @author yinfeng
 * @description web配置
 * @since 2022/3/12 21:57
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}


3.4 配置mybatis plus插件


/**
 * @author yinfeng
 * @description Mybatis plus配置
 * @since 2022/3/12 22:29
 */
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 加入分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }
}


4、创建测试表



4.1 连接数据库


可以通过idea的数据库工具直接连接数据库


  1. 创建数据源


image.png


  1. 配置连接信息


image.png


  1. 执行建表sql


CREATE TABLE `menus` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单id',
  `level` int(11) NOT NULL DEFAULT '1' COMMENT '菜单等级',
  `name` varchar(11) NOT NULL DEFAULT '' COMMENT '菜单名',
  `note` varchar(500) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标志',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `menus_id_uindex` (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单表';


image.png


  1. 创建测试数据


INSERT INTO `menus` (`id`, `level`, `name`, `update_time`, `note`, `create_time`, `deleted`) VALUES (1, 1, '首页', '2021-08-22 13:44:51', '首页', '2021-08-22 13:44:51', 0);
INSERT INTO `menus` (`id`, `level`, `name`, `update_time`, `note`, `create_time`, `deleted`) VALUES (1444693273867198466, 1, '科室管理', '2021-10-03 15:58:38', '科室管理科室管理', '2021-10-03 15:58:16', 0);


image.png


image.png


5、接口开发



5.1 创建菜单表对应的实体类


/**
 * @author yinfeng
 * @description 菜单表
 * @TableName menus
 * @since 2022年3月12日 下午9:40:48
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("菜单表")
@TableName("menus")
public class Menus {
    /**
     * 菜单id
     */
    @TableId(type = IdType.ASSIGN_ID)
    @JsonSerialize(using = ToStringSerializer.class)
    @ApiModelProperty(value = "菜单id", example = "")
    private Long id;
    /**
     * 菜单等级
     */
    @TableField("level")
    @ApiModelProperty(value = "菜单等级", example = "")
    private Integer level;
    /**
     * 菜单名
     */
    @TableField("name")
    @ApiModelProperty(value = "菜单名", example = "")
    private String name;
    /**
     * 备注
     */
    @TableField("note")
    @ApiModelProperty(value = "备注", example = "")
    private String note;
    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "创建时间", example = "")
    private Date createTime;
    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "更新时间", example = "")
    private Date updateTime;
    /**
     * 删除标志
     */
    @TableField("deleted")
    @TableLogic
    @JsonIgnore
    @ApiModelProperty(value = "删除标志", example = "")
    private Integer deleted;
    /**
     * 当前页
     */
    @ApiModelProperty(value = "当前页", example = "1")
    @TableField(exist = false)
    private Integer currentPage;
    /**
     * 分页页数
     */
    @ApiModelProperty(value = "分页页数", example = "20")
    @TableField(exist = false)
    private Integer pageSize;
}


5.2 创建菜单表对应的controller


包含基本的增删改查接口


/**
 * @author yinfeng
 * @since 2022年3月12日 下午9:40:48
 * @description 菜单表
 */
@Api(tags = "菜单表")
@RestController
@RequestMapping("/menus")
public class MenusController{
    @Resource
    private MenusService menusService;
    @PostMapping("/list")
    @ApiOperation(value = "列表", notes = "菜单表")
    public IPage<Menus> list(@RequestBody Menus menus) {
        return menusService.list(menus);
    }
    @PostMapping("/getOne")
    @ApiOperation(value = "单个查询", notes = "菜单表")
    public Menus getOne(@RequestBody Menus menus) {
        return menusService.getOne(menus);
    }
    @PostMapping("/save")
    @ApiOperation(value = "新增或编辑", notes = "菜单表")
    public boolean save(@RequestBody Menus menus) {
        return menusService.saveOrUpdate(menus);
    }
    @PostMapping("/delete")
    @ApiOperation(value = "删除", notes = "菜单表")
    public boolean delete(@RequestBody Menus menus) {
        return menusService.delete(menus);
    }
}


5.3 创建菜单表对应的service


/**
 * @author yinfeng
 * @since 2022年3月12日 下午9:40:48
 * @description 菜单表
 * @TableName menus
 */
public interface MenusService extends IService<Menus> {
    /**
     * 查询列表
     *
     * @param vo vo
     * @return IPage<Menus>
     */
    IPage<Menus> list(Menus vo);
    /**
     * 单个查询
     *
     * @param vo vo
     * @return Menus
     */
    Menus getOne(Menus vo);
    /**
     * 保存
     *
     * @param vo vo
     * @return 是否保存成功
     */
    @Override
    boolean saveOrUpdate(Menus vo);
    /**
     * 删除
     *
     * @param vo vo
     * @return 是否删除成功
     */
    boolean delete(Menus vo);
}
/**
 * @author yinfeng
 * @since 2022年3月12日 下午9:40:48
 * @description 菜单表
 * @TableName menus
 */
@Service
public class MenusServiceImpl extends ServiceImpl<MenusMapper, Menus>
    implements MenusService{
    @Override
    public IPage<Menus> list(Menus vo){
        final QueryWrapper<Menus> wrapper = new QueryWrapper<>();
        wrapper.eq(ObjectUtils.isNotEmpty(vo.getId()), "id", vo.getId());
        return super.page(new Page<>(vo.getCurrentPage(), vo.getPageSize()), wrapper);
    }
    @Override
    public Menus getOne(Menus vo){
        final QueryWrapper<Menus> wrapper = new QueryWrapper<>();
        wrapper.eq(ObjectUtils.allNotNull(vo.getId()), "id", vo.getId());
        return super.getOne(wrapper);
    }
    @Override
    public boolean saveOrUpdate(Menus vo) {
        return super.saveOrUpdate(vo);
    }
    @Override
    public boolean delete(Menus vo) {
        final QueryWrapper<Menus> wrapper = new QueryWrapper<>();
        wrapper.eq(ObjectUtils.allNotNull(vo.getId()), "id", vo.getId());
        return super.remove(wrapper);
    }
}


由于使用mybatis plus框架,帮我们简化了很多简单的增删改查,所以这里的service和mapper代码就写得很清爽,但也可实现咱们的功能


6、接口测试



6.1 启动项目


image.png


6.2 通过knife4j测试接口


  1. 在浏览器打开测试地址


http://127.0.0.1:8888/doc.html#/home


image.png


  1. 测试列表接口


image.png


curl -X POST -H  "Accept:*/*" -H  "Content-Type:application/json" -d "{\"currentPage\":1,\"pageSize\":20}" "http://127.0.0.1:8888/menus/list"


  1. 测试新增接口


image.png


curl -X POST -H  "Accept:*/*" -H  "Content-Type:application/json" -d "{\"createTime\":\"2021-10-03 15:58:38\",\"level\":2,\"name\":\"用户管理\",\"note\":\"用户管理操作\",\"updateTime\":\"2021-10-03 15:58:38\"}" "http://127.0.0.1:8888/menus/save"


查看是否新增成功


image.png


4.测试详情接口


image.png


curl -X POST -H  "Accept:*/*" -H  "Content-Type:application/json" -d "{\"id\":1502651873142775800}" "http://127.0.0.1:8888/menus/getOne"


5.测试删除接口


image.png


curl -X POST -H  "Accept:*/*" -H  "Content-Type:application/json" -d "{\"id\":1502651873142775800}" "http://127.0.0.1:8888/menus/delete"


查看是否删除成功


image.png


7、源码地址



https://gitee.com/yinfeng-code/test.git


8、总结



这篇只是springboot入门项目,后面咱们可根据该项目逐步开发更多高深的企业级功能,包括starter的封装、数据操作变更日志、响应体包装等,欢迎老铁们追更。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
Dubbo JavaScript Java
SpringBoot 调用外部接口的三种方式
SpringBoot不仅继承了Spring框架原有的特性,还简化了应用搭建与开发流程。在SpringBoot项目中,有时需要访问外部接口或URL。本文介绍三种不使用Dubbo的方式:一是利用原生`httpClient`发起请求;二是使用`RestTemplate`,支持GET和POST请求,包括`getForEntity`、`getForObject`及`postForEntity`等方法;三是采用`Feign`客户端简化HTTP请求,需引入相关依赖并在启动类上启用Feign客户端。这三种方式均能有效实现对外部服务的调用。
159 0
|
19天前
|
Java 开发者 Spring
精通SpringBoot:16个扩展接口精讲
【10月更文挑战第16天】 SpringBoot以其简化的配置和强大的扩展性,成为了Java开发者的首选框架之一。SpringBoot提供了一系列的扩展接口,使得开发者能够灵活地定制和扩展应用的行为。掌握这些扩展接口,能够帮助我们写出更加优雅和高效的代码。本文将详细介绍16个SpringBoot的扩展接口,并探讨它们在实际开发中的应用。
37 1
|
25天前
|
存储 安全 Java
|
25天前
|
存储 算法 安全
SpringBoot 接口加密解密实现
【10月更文挑战第18天】
|
24天前
|
监控 Java 开发者
掌握SpringBoot扩展接口:提升代码优雅度的16个技巧
【10月更文挑战第20天】 SpringBoot以其简化配置和快速开发而受到开发者的青睐。除了基本的CRUD操作外,SpringBoot还提供了丰富的扩展接口,让我们能够更灵活地定制和扩展应用。以下是16个常用的SpringBoot扩展接口,掌握它们将帮助你写出更加优雅的代码。
43 0
|
2月前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
2月前
|
存储 前端开发 Java
springboot文件上传和下载接口的简单思路
本文介绍了在Spring Boot中实现文件上传和下载接口的简单思路。文件上传通过`MultipartFile`对象获取前端传递的文件并存储,返回对外访问路径;文件下载通过文件的uuid名称读取文件,并通过流的方式输出,实现文件下载功能。
springboot文件上传和下载接口的简单思路
|
2月前
|
存储 数据采集 Java
Spring Boot 3 实现GZIP压缩优化:显著减少接口流量消耗!
在Web开发过程中,随着应用规模的扩大和用户量的增长,接口流量的消耗成为了一个不容忽视的问题。为了提升应用的性能和用户体验,减少带宽占用,数据压缩成为了一个重要的优化手段。在Spring Boot 3中,通过集成GZIP压缩技术,我们可以显著减少接口流量的消耗,从而优化应用的性能。本文将详细介绍如何在Spring Boot 3中实现GZIP压缩优化。
312 6
|
1月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
37 0
|
2月前
|
Java 网络架构
springboot配合thymeleaf,调用接口不跳转页面只显示文本
springboot配合thymeleaf,调用接口不跳转页面只显示文本
125 0