数据准备
数据库使用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,更加方便