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

1、springboot简介

Spring Boot 可以轻松创建可以“直接运行”的独立的、生产级的基于 Spring 的应用程序。
特征
创建独立的 Spring 应用程序
直接嵌入 Tomcat、Jetty 或 Undertow(无需部署 WAR 文件)
提供强壮的“入门”依赖项以简化您的构建配置
尽可能自动配置 Spring 和第三方中间件
提供生产就绪功能,例如指标、健康检查和外部化配置
完全无需代码生成,无需 XML 配置
2、新建springboot web项目 按以下步骤依次操作
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

初始化项目完整的结构
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

3、基本配置 3.1 引入相关依赖
mysql连接依赖
mysql mysql-connector-java

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 操作智能分析阻断,也可自定义拦截规则,预防误操作
com.baomidou mybatis-plus-boot-starter 3.5.1

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前端.
com.github.xiaoymin knife4j-spring-boot-starter 3.0.3

完整pom.xml文件
4.0.0org.springframework.boot spring-boot-starter-parent 2.6.4 com.yinfeng test 0.0.1-SNAPSHOT test test1.8 org.springframework.boot spring-boot-starter-web org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test mysql mysql-connector-java com.baomidou mybatis-plus-boot-starter 3.5.1 com.github.xiaoymin knife4j-spring-boot-starter 3.0.3 org.springframework.boot spring-boot-maven-plugin org.projectlombok lombok

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

还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

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. 创建数据源
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

  1. 配置连接信息
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

  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='菜单表';

还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

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

还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

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 = "https://www.it610.com/article/菜单id", example = "") private Long id; /** * 菜单等级 */ @TableField("level") @ApiModelProperty(value = "https://www.it610.com/article/菜单等级", example = "") private Integer level; /** * 菜单名 */ @TableField("name") @ApiModelProperty(value = "https://www.it610.com/article/菜单名", example = "") private String name; /** * 备注 */ @TableField("note") @ApiModelProperty(value = "https://www.it610.com/article/备注", example = "") private String note; /** * 创建时间 */ @TableField(value = "https://www.it610.com/article/create_time", fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @ApiModelProperty(value = "https://www.it610.com/article/创建时间", example = "") private Date createTime; /** * 更新时间 */ @TableField(value = "https://www.it610.com/article/update_time", fill = FieldFill.INSERT_UPDATE) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @ApiModelProperty(value = "https://www.it610.com/article/更新时间", example = "") private Date updateTime; /** * 删除标志 */ @TableField("deleted") @TableLogic @JsonIgnore @ApiModelProperty(value = "https://www.it610.com/article/删除标志", example = "") private Integer deleted; /** * 当前页 */ @ApiModelProperty(value = "https://www.it610.com/article/当前页", example = "1") @TableField(exist = false) private Integer currentPage; /** * 分页页数 */ @ApiModelProperty(value = "https://www.it610.com/article/分页页数", 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 = "https://www.it610.com/article/列表", notes = "菜单表") public IPage list(@RequestBody Menus menus) { return menusService.list(menus); }@PostMapping("/getOne") @ApiOperation(value = "https://www.it610.com/article/单个查询", notes = "菜单表") public Menus getOne(@RequestBody Menus menus) { return menusService.getOne(menus); }@PostMapping("/save") @ApiOperation(value = "https://www.it610.com/article/新增或编辑", notes = "菜单表") public boolean save(@RequestBody Menus menus) { return menusService.saveOrUpdate(menus); }@PostMapping("/delete") @ApiOperation(value = "https://www.it610.com/article/删除", 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 {/** * 查询列表 * * @param vo vo * @return IPage */ IPage 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 implements MenusService{@Override public IPage list(Menus vo){ final QueryWrapper 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 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 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 { }

由于使用mybatis plus框架,帮我们简化了很多简单的增删改查,所以这里的service和mapper代码就写得很清爽,但也可实现咱们的功能
6、接口测试 6.1 启动项目
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

6.2 通过knife4j测试接口
  1. 在浏览器打开测试地址
http://127.0.0.1:8888/doc.html#/home

还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

  1. 测试列表接口
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

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

  1. 测试新增接口
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

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"

查看是否新增成功
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

  1. 测试详情接口
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

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

  1. 测试删除接口
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

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

查看是否删除成功
还不会用springboot写接口(快看这里,手把手操作,一发入魂~)
文章图片

7、源码地址
https://gitee.com/yinfeng-code/test.git

8、总结
这篇只是springboot入门项目,后面咱们可根据该项目逐步开发更多高深的企业级功能,包括starter的封装、数据操作变更日志、响应体包装等,欢迎老铁们追更。
【还不会用springboot写接口(快看这里,手把手操作,一发入魂~)】肝文不易,最后希望老铁们给波三连(==点赞、收藏、评论==)加关注,非常感谢大家支持~~

    推荐阅读