Spring boot 综合案例-增删改查并使用接口文档

数据准备

数据库使用Mysql ,准备了部门表和员工表

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 80030
 Source Host           : localhost:3306
 Source Schema         : qy168

 Target Server Type    : MySQL
 Target Server Version : 80030
 File Encoding         : 65001

 Date: 21/08/2023 10:15:18
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tbl_dept
-- ----------------------------
DROP TABLE IF EXISTS `tbl_dept`;
CREATE TABLE `tbl_dept`  (
  `id` int(0) NOT NULL COMMENT '编号',
  `d_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称',
  `loc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '位置',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tbl_dept
-- ----------------------------
INSERT INTO `tbl_dept` VALUES (1, '市场部', '上海');
INSERT INTO `tbl_dept` VALUES (2, '人事部', '杭州');
INSERT INTO `tbl_dept` VALUES (3, '财务部', '郑州');

SET FOREIGN_KEY_CHECKS = 1;
/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 80030
 Source Host           : localhost:3306
 Source Schema         : qy168

 Target Server Type    : MySQL
 Target Server Version : 80030
 File Encoding         : 65001

 Date: 21/08/2023 10:14:38
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for tbl_emp
-- ----------------------------
DROP TABLE IF EXISTS `tbl_emp`;
CREATE TABLE `tbl_emp`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
  `salary` double(10, 2) NULL DEFAULT NULL COMMENT '薪水',
  `birthday` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '出生日期',
  `dept_id` int(0) NULL DEFAULT NULL COMMENT '部门id 关联部门表',
  `headImg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '头像地址',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 36 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of tbl_emp
-- ----------------------------
INSERT INTO `tbl_emp` VALUES (9, '黎明', 6000.00, '2023-05-16', 3, '\r\nhttps://qy165.oss-cn-qingdao.aliyuncs.com/1.jpg');
INSERT INTO `tbl_emp` VALUES (10, '张学友', 5500.00, '2023-05-08', 2, '\r\nhttps://qy165.oss-cn-qingdao.aliyuncs.com/1.jpg');
INSERT INTO `tbl_emp` VALUES (11, '郭富城', 8500.00, '2023-05-09', 3, '\r\nhttps://qy165.oss-cn-qingdao.aliyuncs.com/1.jpg');
INSERT INTO `tbl_emp` VALUES (15, '333', 333.00, '2023-05-02', 1, 'https://qy165.oss-cn-qingdao.aliyuncs.com/ef3a99c9-8720-4d4f-b534-48bc6410345adocker.jpg');
INSERT INTO `tbl_emp` VALUES (19, 'aaa', 2222.00, '2023-05-16', 2, 'https://qy165.oss-cn-qingdao.aliyuncs.com/1.jpg');
INSERT INTO `tbl_emp` VALUES (20, 'aaaw', 22222.00, '2023-05-16', 2, 'https://qy165.oss-cn-qingdao.aliyuncs.com/86b21d63-e69e-4f23-847e-7af76e6111862.jpg');
INSERT INTO `tbl_emp` VALUES (21, '333', 9999.00, '2000-10-10 00:00:00', 3, '2.jpg');
INSERT INTO `tbl_emp` VALUES (22, '222', 222.00, '2023-05-16', 1, 'https://qy165.oss-cn-qingdao.aliyuncs.com/1.jpg');
INSERT INTO `tbl_emp` VALUES (25, '于清晨', 65000.00, '2004-10-01', 2, 'aaa.jpg');
INSERT INTO `tbl_emp` VALUES (26, '庞全林', 66666.00, '2003-10-11 00:00:00', 1, 'a.jpg');
INSERT INTO `tbl_emp` VALUES (27, '咯咯咯', 9000.00, '2023-08-18 08:00:00.0', 1, '1.jpg');
INSERT INTO `tbl_emp` VALUES (31, '嘿嘿嘿', 9000.00, '2023-08-18 08:00:00.0', 2, '1.jpg');
INSERT INTO `tbl_emp` VALUES (32, '哈哈哈', 9000.00, '2023-08-18 08:00:00.0', 1, '1.jpg');
INSERT INTO `tbl_emp` VALUES (33, '嘻嘻嘻', 9000.00, '2023-08-18 08:00:00.0', 3, '1.jpg');
INSERT INTO `tbl_emp` VALUES (35, '哈哈哈', 1000000.00, '2022-10-10 08:00:00.0', 2, 'mv.jpg');

SET FOREIGN_KEY_CHECKS = 1;

引入依赖

<?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.aaa</groupId>
    <artifactId>springboot-crud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-crud</name>
    <description>springboot-crud</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.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>


        <!--引入swagger2依赖-->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.9.1.RELEASE</version>
        </dependency>
        <!--图形化依赖-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</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>

springboot属性文件

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.url=jdbc:mysql://localhost:3306/qy168?serverTimezone=Asia/Shanghai

mybatis.mapper-locations=classpath:/mapper/*.xml

创建实体类


@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("部门实体类")
public class Dept {

  @ApiModelProperty(name="did",value = "部门编号",required = true,dataType = "Integer")
  private Integer did;
  @ApiModelProperty(name="dname",value = "部门名称",required = true,dataType = "String")
  private String dname;
  @ApiModelProperty(name="loc",value = "部门所在地",required = true,dataType = "String")
  private String loc;


}
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "员工实体类")
public class Emp {

    @ApiModelProperty(name="id",value = "员工编号",required = true,dataType = "Integer")
    private Integer id;
    @ApiModelProperty(name="name",value = "员工姓名",required = true,dataType = "String")
    private String name;
    @ApiModelProperty(name="salary",value = "员工薪水",required = true,dataType = "double")
    private double salary;
    @ApiModelProperty(name="birthday",value = "初始日期",required = true,dataType = "Date")
    private Date birthday;
    @ApiModelProperty(name="deptId",value = "所在部门编号",required = true,dataType = "Integer")
    private Integer deptId;
    @ApiModelProperty(name="headImg",value = "头像",required = true,dataType = "String")
    private String headImg;
    @ApiModelProperty(name="dept",value = "所在部门名称",required = true,dataType = "Dept")
    private Dept dept;

}

@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("统一json对象")
public class Result {

    public Result(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    @ApiModelProperty(value = "状态码:200表示成功 500表示失败")
    private Integer code;
    @ApiModelProperty(value = "提示的消息内容")
    private String msg;
    @ApiModelProperty(value = "响应的数据")
    private Object data;

}

注解说明

@Data                   //实时增加get set方法
@AllArgsConstructor     //自动创建全参构造器
@NoArgsConstructor      //自动创建无参构造器
@ApiModel("统一json对象") //接口文档上对实体类的解释说明
//接口文档上对实体类中属性的解释说明
@ApiModelProperty(name="did",value = "部门编号",required = true,dataType = "Integer") 

项目完成后再对接口文档做详细的解释

创建Dao层和映射文件

@Mapper
public interface EmpDao {
    //增加
    public int insert(Emp emp);

    //删除
    public int deleteById(Integer id);

    //修改
    public int update(Emp emp);

    //根据id查询员工信息
    public Emp selectById(Integer id);

    //查询所有
    public List<Emp> selectAll(String name);

}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aaa.dao.EmpDao">

    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into tbl_emp values(null,#{name},#{salary},#{birthday},#{deptId},#{headImg})
    </insert>

    <update id="update">
        update tbl_emp set name=#{name},salary=#{salary},birthday=#{birthday},dept_id=#{deptId},headImg=#{headImg}
        where id=#{id}
    </update>

    <delete id="deleteById">
        delete from tbl_emp where id=#{id}
    </delete>


    <!--sql片段-->
    <sql id="empSql">
        id,name,salary,birthday,dept_id deptId,headImg
    </sql>
    <select id="selectById" resultType="com.aaa.entity.Emp">
        select
        <include refid="empSql"/>
        from tbl_emp where id=#{id}
    </select>



    <!--查询所有员工携带部门信息-->
    <resultMap id="baseEmpMapper" type="com.aaa.entity.Emp" autoMapping="true">
        <id property="id" column="id"/>
        <result property="deptId" column="dept_id"/>
        <association property="dept" javaType="com.aaa.entity.Dept" autoMapping="true">
            <id property="did" column="id"/>
            <result property="dname" column="d_name"/>
        </association>
    </resultMap>
    <select id="selectAll" resultMap="baseEmpMapper">
        select * from tbl_emp e join tbl_dept d on e.dept_id=d.id
        <where>
            <if test="name!=null and name!=''">
                and  name like concat('%',#{name},'%')
            </if>
        </where>
    </select>


</mapper>

创建Service层


public interface EmpService {
    public Result deleteById(int id);

    public Result update(Emp emp);

    public Result insert(Emp emp);

    public Result findById(Integer id);

    public Result findAll(Integer current, Integer pageSize,String name);
}
@Service
public class EmpServiceImpl implements EmpService{
    @Autowired
    private EmpDao empDao;
    @Override
    @Transactional
    public Result deleteById(int id) {
        int row = empDao.deleteById(id);
        return row>0?new Result(200,"删除成功",null):new Result(500,"删除失败",null);
    }

    @Override
    public Result update(Emp emp) {
        int row = empDao.update(emp);
        return row>0?new Result(200,"更新成功",null):new Result(500,"更新失败",null);
    }

    @Override
    public Result insert(Emp emp) {
        int row = empDao.insert(emp);
        return row>0?new Result(200,"添加成功",emp):new Result(500,"添加失败",null);
    }

    @Override
    public Result findById(Integer id) {
        Emp emp = empDao.selectById(id);
        return new Result(200,"查询成功",emp);
    }

    @Override
    public Result findAll(Integer current, Integer pageSize,String name) {
        PageHelper.startPage(current,pageSize);
        List<Emp> emps = empDao.selectAll(name);
        PageInfo<Emp> pageInfo=new PageInfo<>(emps);
        return new Result(200,"查询成功",pageInfo);
    }
}

创建Controller层

@RestController
@RequestMapping("/emp")
@Api//加在接口上 对整个接口类加以说明
public class EmpController {
    @Autowired
    private EmpService empService;

    @ApiOperation(value = "根据id删除员工")//加在接口方法上
    @ApiImplicitParams(
            value = {
                    @ApiImplicitParam(name="id",value = "员工编号",required = true,dataType = "integer",paramType = "integer")
            }
    )
    @DeleteMapping
    public Result deleteById(Integer id){
        return empService.deleteById(id);
    }

    @ApiOperation(value = "添加员工")//加在接口方法上
    @PostMapping
    public Result insert(@RequestBody Emp emp){
        return empService.insert(emp);
    }

    @ApiOperation(value = "修改员工信息")//加在接口方法上
    @PutMapping
    public Result update(@RequestBody Emp emp){
        return empService.update(emp);
    }

    @ApiOperation(value = "根据id查找员工")//加在接口方法上
    @ApiImplicitParams(
            value = {
                    @ApiImplicitParam(name="id",value = "员工编号",required = true,dataType = "integer",paramType = "integer")
            }
    )

    @GetMapping("/get")
    public Result getById(Integer id){
        return empService.findById(id);
    }

    @ApiOperation(value = "查询所有员工")//加在接口方法上
    @ApiImplicitParams(
            value = {
                    @ApiImplicitParam(name="current",value = "当前页",required = true,dataType = "Integer",paramType = "Integer"),
                    @ApiImplicitParam(name="pageSize",value = "当前页大小",required = true,dataType = "Integer",paramType = "Integer"),
                    @ApiImplicitParam(name="name",value = "条件查询:员工名称",required = true,dataType = "String",paramType = "String")
            }
    )
    @GetMapping("/getAll")
    public Result getAll(Integer current,Integer pageSize,String name){
        return empService.findAll(current, pageSize, name);
    }


}

注解说明

@Api//加在接口上 对整个接口类加以说明
@ApiOperation(value = "方法解释")//在方法上使用,在接口文档上解释方法功能
@ApiImplicitParams(
        value = {
                @ApiImplicitParam(name="参数名",value = "参数名解释",required = true,dataType = "类型说明",paramType = "参数类型")
        }
)//在方法上使用,在接口文档上解释方法使用的参数信息

启动类

@MapperScan(basePackages = "com.aaa.dao")
@SpringBootApplication
@EnableSwagger2
public class SpringbootCrudApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootCrudApplication.class, args);
    }

}

注解说明

@EnableSwagger2//使接口文档生效
@MapperScan(basePackages = "com.aaa.dao")//包扫描

创建接口文档


@Configuration
public class SwaggerConfig {

    @Bean
    public Docket docket(){
        Docket docket=new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(getInfo())//设置文档信息
                .select()//指定哪些包生成接口文档
                .apis(RequestHandlerSelectors.basePackage("com.aaa.controller"))
                .build();
        return docket;
    }

    private ApiInfo getInfo(){
        Contact DEFAULT_CONTACT = new Contact("姚军燕", "http://www.wjy.com", "110@qq.com");
        ApiInfo info = new ApiInfo("项目名称", "项目简介,接口文档测试", "自定义版本号", "termsOfServiceUrl:http://www.jd.com",
                DEFAULT_CONTACT, "Apache 2.0", "http://www.baidu.com", new ArrayList<VendorExtension>());
        return info;

    }



}

此时已经使用springboot完成了增删改查的功能并添加了接口文档

启动项目输入接口文档的访问路径 http://localhost:8080/doc.html

我们可以看到如下内容

 可以看到项目中的@Api、@ApiImplicitParams等注解作用就在于此,解释方法,目的是为了让前端开发工程使明白方法功能和如何使用。

接口文档不止只有解释说明的功能,用它可以发送请求、调试、可代替postman,更加方便

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值