0


还不会用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"?><projectxmlns="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:8888spring: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@EnableSwagger2publicclassKnife4jConfig{@Beanpublic Docket buildDocket(){returnnewDocket(DocumentationType.SWAGGER_2).apiInfo(newApiInfoBuilder().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
 */@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddResourceHandlers(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
 */@ConfigurationpublicclassMybatisPlusConfig{@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor =newMybatisPlusInterceptor();// 加入分页插件
        interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.H2));return interceptor;}}

4、创建测试表

4.1 连接数据库

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

  1. 创建数据源在这里插入图片描述
  2. 配置连接信息在这里插入图片描述
  3. 执行建表sql
CREATETABLE`menus`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'菜单id',`level`int(11)NOTNULLDEFAULT'1'COMMENT'菜单等级',`name`varchar(11)NOTNULLDEFAULT''COMMENT'菜单名',`note`varchar(500)DEFAULTNULLCOMMENT'备注',`create_time`datetimeNOTNULLCOMMENT'创建时间',`update_time`datetimeNOTNULLCOMMENT'更新时间',`deleted`tinyint(4)NOTNULLDEFAULT'0'COMMENT'删除标志',PRIMARYKEY(`id`)USINGBTREE,UNIQUEKEY`menus_id_uindex`(`id`)USINGBTREE)ENGINE=InnoDBDEFAULTCHARSET=utf8 COMMENT='菜单表';

在这里插入图片描述

  1. 创建测试数据
INSERTINTO`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);INSERTINTO`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")publicclassMenus{/**
     * 菜单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")publicclassMenusController{@Resourceprivate 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 ="菜单表")publicbooleansave(@RequestBody Menus menus){return menusService.saveOrUpdate(menus);}@PostMapping("/delete")@ApiOperation(value ="删除", notes ="菜单表")publicbooleandelete(@RequestBody Menus menus){return menusService.delete(menus);}}

5.3 创建菜单表对应的service

/**
 * @author yinfeng
 * @since 2022年3月12日 下午9:40:48
 * @description 菜单表
 * @TableName menus
 */publicinterfaceMenusServiceextendsIService<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 是否保存成功
     */@OverridebooleansaveOrUpdate(Menus vo);/**
     * 删除
     *
     * @param vo vo
     * @return 是否删除成功
     */booleandelete(Menus vo);}
/**
 * @author yinfeng
 * @since 2022年3月12日 下午9:40:48
 * @description 菜单表
 * @TableName menus
 */@ServicepublicclassMenusServiceImplextendsServiceImpl<MenusMapper, Menus>implementsMenusService{@Overridepublic IPage<Menus>list(Menus vo){final QueryWrapper<Menus> wrapper =newQueryWrapper<>();
        wrapper.eq(ObjectUtils.isNotEmpty(vo.getId()),"id", vo.getId());returnsuper.page(newPage<>(vo.getCurrentPage(), vo.getPageSize()), wrapper);}@Overridepublic Menus getOne(Menus vo){final QueryWrapper<Menus> wrapper =newQueryWrapper<>();
        wrapper.eq(ObjectUtils.allNotNull(vo.getId()),"id", vo.getId());returnsuper.getOne(wrapper);}@OverridepublicbooleansaveOrUpdate(Menus vo){returnsuper.saveOrUpdate(vo);}@Overridepublicbooleandelete(Menus vo){final QueryWrapper<Menus> wrapper =newQueryWrapper<>();
        wrapper.eq(ObjectUtils.allNotNull(vo.getId()),"id", vo.getId());returnsuper.remove(wrapper);}}

5.3 创建菜单表对应的mapper,相当于直接操作数据库的类

/**
* @author yinfeng
* @since 2022年3月12日 下午9:40:48
* @description 菜单表
* @TableName menus
*/@MapperpublicinterfaceMenusMapperextendsBaseMapper<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的封装、数据操作变更日志、响应体包装等,欢迎老铁们追更。

肝文不易,最后希望老铁们给波三连(点赞、收藏、评论)加关注,非常感谢大家支持~~

标签: spring boot java spring

本文转载自: https://blog.csdn.net/a1774381324/article/details/123450245
版权归原作者 隐 风 所有, 如有侵权,请联系我们删除。

“还不会用springboot写接口?快看这里,手把手操作,一发入魂~”的评论:

还没有评论