還不會用springboot寫接口?快看這里,手把手操作,一發入魂~


1、springboot簡介

Spring Boot 可以輕松創建可以“直接運行”的獨立的、生產級的基於 Spring 的應用程序。

特征

創建獨立的 Spring 應用程序

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

提供強壯的“入門”依賴項以簡化您的構建配置

盡可能自動配置 Spring 和第三方中間件

提供生產就緒功能,例如指標、健康檢查和外部化配置

完全無需代碼生成,無需 XML 配置

2、新建springboot web項目

按以下步驟依次操作
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
初始化項目完整的結構
在這里插入圖片描述

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

在這里插入圖片描述

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. 創建數據源
    在這里插入圖片描述

  2. 配置連接信息
    在這里插入圖片描述

  3. 執行建表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='菜單表';

在這里插入圖片描述

  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);

在這里插入圖片描述
在這里插入圖片描述

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);
    }

}

5.3 創建菜單表對應的mapper,相當於直接操作數據庫的類

/**
* @author yinfeng
* @since 2022年3月12日 下午9:40:48
* @description 菜單表
* @TableName menus
*/
@Mapper
public interface MenusMapper extends BaseMapper<Menus> {
}

由於使用mybatis plus框架,幫我們簡化了很多簡單的增刪改查,所以這里的service和mapper代碼就寫得很清爽,但也可實現咱們的功能

6、接口測試

6.1 啟動項目

在這里插入圖片描述

6.2 通過knife4j測試接口

  1. 在瀏覽器打開測試地址
http://127.0.0.1:8888/doc.html#/home

在這里插入圖片描述

  1. 測試列表接口

在這里插入圖片描述

curl -X POST -H  "Accept:*/*" -H  "Content-Type:application/json" -d "{\"currentPage\":1,\"pageSize\":20}" "http://127.0.0.1:8888/menus/list"
  1. 測試新增接口
    在這里插入圖片描述
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"

查看是否新增成功
在這里插入圖片描述

  1. 測試詳情接口
    在這里插入圖片描述
curl -X POST -H  "Accept:*/*" -H  "Content-Type:application/json" -d "{\"id\":1502651873142775800}" "http://127.0.0.1:8888/menus/getOne"
  1. 測試刪除接口
    在這里插入圖片描述
curl -X POST -H  "Accept:*/*" -H  "Content-Type:application/json" -d "{\"id\":1502651873142775800}" "http://127.0.0.1:8888/menus/delete"

查看是否刪除成功
在這里插入圖片描述

7、源碼地址

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

8、總結

這篇只是springboot入門項目,后面咱們可根據該項目逐步開發更多高深的企業級功能,包括starter的封裝、數據操作變更日志、響應體包裝等,歡迎老鐵們追更。

肝文不易,最后希望老鐵們給波三連(點贊、收藏、評論)加關注,非常感謝大家支持~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM