网站建设企业云市场/宝鸡网站seo
目录
一、准备工作
1.1 需求
1.2 环境搭建
1.2.1 准备数据库&表
1.2.2 创建springboot工程
1.2.3 配置application.properties & 准备对应实体类
1.2.3.1 application.properties
1.2.3.2 实体类
1.2.3.2.1 Emp类
1.2.3.2.2 Dept类
1.2.4 准备对应的Mapper、Service(接口实现类)、Controller基础结构
1.2.4.1 Mapper
1.2.4.1.1 DeptMapper接口
1.2.4.1.2 EmpMapper接口
1.2.4.2 Service(接口实现类)
1.2.4.2.1 DeptService接口
1.2.4.2.2 EmpService接口
1.2.4.2.1 DeptServiceImpl实现类
1.2.4.2.2 EmpServiceImpl实现类
1.2.4.3 Controller基础结构
1.2.4.3.1 Deptcontroller
1.2.4.3.2 EmpController
1.2.5 pom.xml
1.2.6 完成效果
1.3 开发规范
编辑
1.3.1 接口文档
1.3.1.1 部门管理
1.3.1.1.1 部门列表查询
1.3.1.1.1.1 基本信息
1.3.1.1.1.2 请求参数
1.3.1.1.1.3 响应数据
1.3.1.1.2 删除部门
1.3.1.1.2.1 基本信息
1.3.1.1.2.2 请求参数
1.3.1.1.2.3 响应数据
1.3.1.1.3 添加部门
1.3.1.1.3 1 基本信息
1.3.1.1.3 .2 请求参数
1.3.1.1.3 .3 响应数据
1.3.1.1.4 根据ID查询
1.3.1.1.4.1 基本信息
1.3.1.1.4..2 请求参数
1.3.1.1.4.3 响应数据
1.3.1.1.5 修改部门
1.3.1.1.5.1 基本信息
1.3.1.1.5.2 请求参数
1.3.1.1.5.3 响应数据
1.3.1.2 员工管理
1.3.1.2.1 员工列表查询
1.3.1.2.1.1 基本信息
1.3.1.2.1.2 请求参数
1.3.1.2.1.3 响应数据
1.3.1.2.2 删除员工
1.3.1.2.2.1 基本信息
1.3.1.2.2.2 请求参数
1.3.1.2.2.3 响应数据
1.3.1.2.3 添加员工
1.3.1.2.3.1 基本信息
1.3.1.2.3.2 请求参数
1.3.1.2.3.3 响应数据
1.3.1.2.4 根据ID查询
1.3.1.2.4.1 基本信息
1.3.1.2.4.2 请求参数
1.3.1.2.4.3 响应数据
1.3.1.2.5 修改员工
1.3.1.2.5.1 基本信息
1.3.1.2.5.2 请求参数
1.3.1.2.5.3 响应数据
1.3.1.2.6 文件上传
1.3.1.2.6.1 基本信息
1.3.1.2.6.2 请求参数
1.3.1.2.6.3 响应数据
1.3.1.3. 其他接口
1.3.1.3.1 登录
1.3.1.3.1.1 基本信息
1.3.1.3.1.2 请求参数
1.3.1.3.1.3 响应数据
1.3.1.3.1.4 备注说明
1.3.2 Resful风格
1.3.3 统一响应结果
1.3.4 思路
二、部门管理
2.1 查询部门
2.1.1 思路
2.1.2 DeptController
2.1.3 DeptService
2.1.4 DeptServiceImpl
2.1.5 DeptMapper
2.1.6 启动服务测试
2.1.7 前后端联调
2.1.8 总结
2.2 删除部门
2.2.1 思路
2.2.2 DeptController
2.2.3 DeptService
2.2.4 DeptServiceImpl
2.2.5 DeptMapper
2.1.6 启动服务 测试
2.2.7 前后端联调
2.3 新增部门
2.3.1 思路
2.3.2 DeptController
2.3.3 DeptService
2.3.4 DeptServiceImpl
2.3.5 DeptMapper
2.3.6 启动服务-测试
2.3.7 前后端联调
2.4 优化DeptController的路径
2.5 根据id查询部门
2.5.1 DeptController
2.5.2 DeptService
2.5.3 DeptServiceImpl
2.5.4 DeptMapper
2.5.5 启动服务-测试
2.5.6 前后端联调
2.6 修改部门
2.6.1 DeptController
2.6.2 DeptService
2.6.3 DeptServiceImpl
2.6.4 DeptMapper
2.6.5 启动服务-测试
2.6.6 前后端联调
三、员工管理
3.1 分页查询
3.1.1 思路
3.1.2 PageBean分页查询结果实体类
3.1.3 EmpController
3.1.4 EmpService
3.1.5 EmpServiceImpl
3.1.6 EmpMapper
3.1.7 启动服务-测试
3.1.8 前后端联调
3.1.9 总结
3.1.10 使用分页插件 PageHelper优化代码
3.1.10.1 引入 PageHelper依赖
3.1.10.2 EmpMapper
3.1.10.3 EmpServiceImpl
3.1.10.4 启动服务-测试
3.1.10.5 前后端联调
3.1.10.6 总结
3.2 分页查询(带条件)
3.2.1 思路
3.2.2 EmpController
3.2.3 EmpService
3.2.4 EmpServiceImpl
3.2.5 EmpMapper
3.2.6 EmpMapper.xml
3.2.7 启动服务-测试
3.2.8 前后端联调
3.2.9 总结
编辑 3.3 删除员工
3.3.1 思路
3.3.2 EmpController
3.3.3 EmpService
3.3.4 EmpServiceImpl
3.3.5 EmpMapper.xml
3.3.6 EmpMapper
3.3.7 启动服务-测试
3.3.8 前后端联调
3.4 新增员工
3.4.1 思路
3.4.2 EmpController
3.4.3 EmpService
3.4.4 EmpServiceImpl
3.4.5 EmpMapper
3.4.6 启动服务-测试
3.4.7 前后端联调
3.5 文件上传
3.5.1 简介
3.5.1.1 upload.html
3.5.1.2 UploadController
3.5.1.3 启动服务-测试
3.5.1.4 总结
3.5.2 本地存储
3.5.2.1 UploadController
3.5.2.2 启动服务-测试
3.5.2.3 优化(确保存储文件名唯一UUID)UploadController
3.5.2.4 优化配置文件上传大小application.properties
3.5.2.5 扩展
3.5.3 阿里云OSS
3.5.3.1 通用思路
3.5.3.2 阿里云OSS准备工作
3.5.3.3 安装依赖
3.5.3.4 示例代码
3.6 新增页面集成文件上传阿里云OOS
3.6.1 思路
3.6.2 引人阿里云上传OSS上传文件工具类
3.6.3 UploadController
3.6.4 启动服务-测试
3.6.5 前后端联调
3.6.6 总结
3.7 修改员工
3.7.1 思路
3.7.2 查询回显
3.7.2.1 思路
3.7.2.2 EmpController
3.7.2.3 EmpService
3.7.2.4 EmpServiceImpl
3.7.2.5 EmpMapper
3.7.2.6 启动服务-测试
3.7.2.7 前后端联调
3.7.3 修改员工
3.7.3.1 思路
3.7.3.2 EmpController
3.7.3.3 EmpService
3.7.3.4 EmpServiceImpl
3.7.3.5 EmpMapper
3.7.3.6 EmpMapper.xml
3.7.3.7 启动服务-测试
3.7.3.8 前后端联调
前言:学习了前面知识,开始后端开发的实战教程,参照之前的原型进行设计、编码
一、准备工作
1.1 需求
1.2 环境搭建
1.2.1 准备数据库&表
-- 部门管理
create table dept(id int unsigned primary key auto_increment comment '主键ID',name varchar(10) not null unique comment '部门名称',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '部门表';insert into dept (id, name, create_time, update_time) values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()), (4,'就业部',now(),now()),(5,'人事部',now(),now());-- 员工管理(带约束)
create table emp (id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32) default '123456' comment '密码',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',image varchar(300) comment '图像',job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',entrydate date comment '入职时间',dept_id int unsigned comment '部门ID',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '员工表';INSERT INTO emp(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
1.2.2 创建springboot工程
1.2.3 配置application.properties & 准备对应实体类
1.2.3.1 application.properties
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true
1.2.3.2 实体类
1.2.3.2.1 Emp类
package com.runa.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;/*** 员工实体类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id; //IDprivate String username; //用户名private String password; //密码private String name; //姓名private Short gender; //性别 , 1 男, 2 女private String image; //图像urlprivate Short job; //职位 , 1 班主任 , 2 讲师 , 3 学工主管 , 4 教研主管 , 5 咨询师private LocalDate entrydate; //入职日期private Integer deptId; //部门IDprivate LocalDateTime createTime; //创建时间private LocalDateTime updateTime; //修改时间
}
1.2.3.2.2 Dept类
package com.runa.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;/*** 部门实体类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {private Integer id; //IDprivate String name; //部门名称private LocalDateTime createTime; //创建时间private LocalDateTime updateTime; //修改时间
}
1.2.4 准备对应的Mapper、Service(接口实现类)、Controller基础结构
1.2.4.1 Mapper
1.2.4.1.1 DeptMapper接口
package com.runa.mapper;import org.apache.ibatis.annotations.Mapper;/*** 部门管理*/
@Mapper
public interface DeptMapper {
}
1.2.4.1.2 EmpMapper接口
package com.runa.mapper;import org.apache.ibatis.annotations.Mapper;/*** 员工管理*/
@Mapper
public interface EmpMapper {
}
1.2.4.2 Service(接口实现类)
1.2.4.2.1 DeptService接口
package com.runa.service;public interface DeptService {
}
1.2.4.2.2 EmpService接口
package com.runa.service;public interface EmpService {
}
1.2.4.2.1 DeptServiceImpl实现类
package com.runa.service.impl;import com.runa.service.DeptService;
import org.springframework.stereotype.Service;@Service
public class DeptServiceImpl implements DeptService {
}
1.2.4.2.2 EmpServiceImpl实现类
package com.runa.service.impl;import com.runa.service.EmpService;
import org.springframework.stereotype.Service;@Service
public class EmpServiceImpl implements EmpService {
}
1.2.4.3 Controller基础结构
1.2.4.3.1 Deptcontroller
package com.runa.controller;import org.springframework.web.bind.annotation.RestController;/*** 部门管理Controller*/
@RestController
public class Deptcontroller {
}
1.2.4.3.2 EmpController
package com.runa.controller;import org.springframework.web.bind.annotation.RestController;/*** 员工管理Controller*/
@RestController
public class EmpController {
}
1.2.5 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>3.1.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.runa</groupId><artifactId>spring-boot-project-test</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-project-test</name><description>spring-boot-project-test</description><properties><java.version>17</java.version></properties><dependencies><!-- web 起步依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mybatis起步依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.2</version></dependency><!-- mysql驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- springboot 单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>3.0.2</version><scope>test</scope></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>
1.2.6 完成效果
1.3 开发规范
1.3.1 接口文档
tlias智能学习辅助系统接口文档-V1.0
1.3.1.1 部门管理
1.3.1.1.1 部门列表查询
1.3.1.1.1.1 基本信息
请求路径:/depts
请求方式:GET
接口描述:该接口用于部门列表数据查询
1.3.1.1.1.2 请求参数
无
1.3.1.1.1.3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object[ ] | 非必须 | 返回的数据 |
|- id | number | 非必须 | id |
|- name | string | 非必须 | 部门名称 |
|- createTime | string | 非必须 | 创建时间 |
|- updateTime | string | 非必须 | 修改时间 |
响应数据样例:
{"code": 1,"msg": "success","data": [{"id": 1,"name": "学工部","createTime": "2022-09-01T23:06:29","updateTime": "2022-09-01T23:06:29"},{"id": 2,"name": "教研部","createTime": "2022-09-01T23:06:29","updateTime": "2022-09-01T23:06:29"}] }
1.3.1.1.2 删除部门
1.3.1.1.2.1 基本信息
请求路径:/depts/{id}
请求方式:DELETE
接口描述:该接口用于根据ID删除部门数据
1.3.1.1.2.2 请求参数
参数格式:路径参数
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | 部门ID |
请求参数样例:
/depts/1
1.3.1.1.2.3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{"code":1,"msg":"success","data":null }
1.3.1.1.3 添加部门
1.3.1.1.3 1 基本信息
请求路径:/depts
请求方式:POST
接口描述:该接口用于添加部门数据
1.3.1.1.3 .2 请求参数
格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
name | string | 必须 | 部门名称 |
请求参数样例:
{"name": "教研部" }
1.3.1.1.3 .3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{"code":1,"msg":"success","data":null }
1.3.1.1.4 根据ID查询
1.3.1.1.4.1 基本信息
请求路径:/depts/{id}
请求方式:GET
接口描述:该接口用于根据ID查询部门数据
1.3.1.1.4..2 请求参数
参数格式:路径参数
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | 部门ID |
请求参数样例:
/depts/1
1.3.1.1.4.3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
|- id | number | 非必须 | id |
|- name | string | 非必须 | 部门名称 |
|- createTime | string | 非必须 | 创建时间 |
|- updateTime | string | 非必须 | 修改时间 |
响应数据样例:
{"code": 1,"msg": "success","data": {"id": 1,"name": "学工部","createTime": "2022-09-01T23:06:29","updateTime": "2022-09-01T23:06:29"} }
1.3.1.1.5 修改部门
1.3.1.1.5.1 基本信息
请求路径:/depts
请求方式:PUT
接口描述:该接口用于修改部门数据
1.3.1.1.5.2 请求参数
格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | 部门ID |
name | string | 必须 | 部门名称 |
请求参数样例:
{"id": 1,"name": "教研部" }
1.3.1.1.5.3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{"code":1,"msg":"success","data":null }
1.3.1.2 员工管理
1.3.1.2.1 员工列表查询
1.3.1.2.1.1 基本信息
请求路径:/emps
请求方式:GET
接口描述:该接口用于员工列表数据的条件分页查询
1.3.1.2.1.2 请求参数
参数格式:queryString
参数说明:
参数名称 | 是否必须 | 示例 | 备注 |
---|---|---|---|
name | 否 | 张 | 姓名 |
gender | 否 | 1 | 性别 , 1 男 , 2 女 |
begin | 否 | 2010-01-01 | 范围匹配的开始时间(入职日期) |
end | 否 | 2020-01-01 | 范围匹配的结束时间(入职日期) |
page | 是 | 1 | 分页查询的页码,如果未指定,默认为1 |
pageSize | 是 | 10 | 分页查询的每页记录数,如果未指定,默认为10 |
请求数据样例:
/emps?name=张&gender=1&begin=2007-09-01&end=2022-09-01&page=1&pageSize=10
1.3.1.2.1.3 响应数据
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | number | 必须 | 响应码, 1 成功 , 0 失败 | ||
msg | string | 非必须 | 提示信息 | ||
data | object | 必须 | 返回的数据 | ||
|- total | number | 必须 | 总记录数 | ||
|- rows | object [] | 必须 | 数据列表 | item 类型: object | |
|- id | number | 非必须 | id | ||
|- username | string | 非必须 | 用户名 | ||
|- name | string | 非必须 | 姓名 | ||
|- password | string | 非必须 | 密码 | ||
|- entrydate | string | 非必须 | 入职日期 | ||
|- gender | number | 非必须 | 性别 , 1 男 ; 2 女 | ||
|- image | string | 非必须 | 图像 | ||
|- job | number | 非必须 | 职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师 | ||
|- deptId | number | 非必须 | 部门id | ||
|- createTime | string | 非必须 | 创建时间 | ||
|- updateTime | string | 非必须 | 更新时间 |
响应数据样例:
{"code": 1,"msg": "success","data": {"total": 2,"rows": [{"id": 1,"username": "jinyong","password": "123456","name": "金庸","gender": 1,"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg","job": 2,"entrydate": "2015-01-01","deptId": 2,"createTime": "2022-09-01T23:06:30","updateTime": "2022-09-02T00:29:04"},{"id": 2,"username": "zhangwuji","password": "123456","name": "张无忌","gender": 1,"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg","job": 2,"entrydate": "2015-01-01","deptId": 2,"createTime": "2022-09-01T23:06:30","updateTime": "2022-09-02T00:29:04"}]} }
1.3.1.2.2 删除员工
1.3.1.2.2.1 基本信息
请求路径:/emps/{ids}
请求方式:DELETE
接口描述:该接口用于批量删除员工的数据信息
1.3.1.2.2.2 请求参数
参数格式:路径参数
参数说明:
参数名 | 类型 | 示例 | 是否必须 | 备注 |
---|---|---|---|---|
ids | 数组 array | 1,2,3 | 必须 | 员工的id数组 |
请求参数样例:
/emps/1,2,3
1.3.1.2.2.3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{"code":1,"msg":"success","data":null }
1.3.1.2.3 添加员工
1.3.1.2.3.1 基本信息
请求路径:/emps
请求方式:POST
接口描述:该接口用于添加员工的信息
1.3.1.2.3.2 请求参数
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 备注 |
---|---|---|---|
username | string | 必须 | 用户名 |
name | string | 必须 | 姓名 |
gender | number | 必须 | 性别, 说明: 1 男, 2 女 |
image | string | 非必须 | 图像 |
deptId | number | 非必须 | 部门id |
entrydate | string | 非必须 | 入职日期 |
job | number | 非必须 | 职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师 |
请求数据样例:
{"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg","username": "linpingzhi","name": "林平之","gender": 1,"job": 1,"entrydate": "2022-09-18","deptId": 1 }
1.3.1.2.3.3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{"code":1,"msg":"success","data":null }
1.3.1.2.4 根据ID查询
1.3.1.2.4.1 基本信息
请求路径:/emps/{id}
请求方式:GET
接口描述:该接口用于根据主键ID查询员工的信息
1.3.1.2.4.2 请求参数
参数格式:路径参数
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | 部门ID |
请求参数样例:
/emps/1
1.3.1.2.4.3 响应数据
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | number | 必须 | 响应码, 1 成功 , 0 失败 | ||
msg | string | 非必须 | 提示信息 | ||
data | object | 必须 | 返回的数据 | ||
|- id | number | 非必须 | id | ||
|- username | string | 非必须 | 用户名 | ||
|- name | string | 非必须 | 姓名 | ||
|- password | string | 非必须 | 密码 | ||
|- entrydate | string | 非必须 | 入职日期 | ||
|- gender | number | 非必须 | 性别 , 1 男 ; 2 女 | ||
|- image | string | 非必须 | 图像 | ||
|- job | number | 非必须 | 职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师 | ||
|- deptId | number | 非必须 | 部门id | ||
|- createTime | string | 非必须 | 创建时间 | ||
|- updateTime | string | 非必须 | 更新时间 |
响应数据样例:
{"code": 1,"msg": "success","data": {"id": 2,"username": "zhangwuji","password": "123456","name": "张无忌","gender": 1,"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-53B.jpg","job": 2,"entrydate": "2015-01-01","deptId": 2,"createTime": "2022-09-01T23:06:30","updateTime": "2022-09-02T00:29:04"} }
1.3.1.2.5 修改员工
1.3.1.2.5.1 基本信息
请求路径:/emps
请求方式:PUT
接口描述:该接口用于修改员工的数据信息
1.3.1.2.5.2 请求参数
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | id |
username | string | 必须 | 用户名 |
name | string | 必须 | 姓名 |
gender | number | 必须 | 性别, 说明: 1 男, 2 女 |
image | string | 非必须 | 图像 |
deptId | number | 非必须 | 部门id |
entrydate | string | 非必须 | 入职日期 |
job | number | 非必须 | 职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师 |
请求数据样例:
{"id": 1,"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg","username": "linpingzhi","name": "林平之","gender": 1,"job": 1,"entrydate": "2022-09-18","deptId": 1 }
1.3.1.2.5.3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{"code":1,"msg":"success","data":null }
1.3.1.2.6 文件上传
1.3.1.2.6.1 基本信息
请求路径:/upload
请求方式:POST
接口描述:上传图片接口
1.3.1.2.6.2 请求参数
参数格式:multipart/form-data
参数说明:
参数名称 | 参数类型 | 是否必须 | 示例 | 备注 |
---|---|---|---|---|
image | file | 是 |
1.3.1.2.6.3 响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据,上传图片的访问路径 |
响应数据样例:
{"code": 1,"msg": "success","data": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2022-09-02-00-27-0400.jpg" }
1.3.1.3. 其他接口
1.3.1.3.1 登录
1.3.1.3.1.1 基本信息
请求路径:/login
请求方式:POST
接口描述:该接口用于员工登录Tlias智能学习辅助系统,登录完毕后,系统下发JWT令牌。
1.3.1.3.1.2 请求参数
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 备注 |
---|---|---|---|
username | string | 必须 | 用户名 |
password | string | 必须 | 密码 |
请求数据样例:
{"username": "jinyong","password": "123456" }
1.3.1.3.1.3 响应数据
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 |
---|---|---|---|---|---|
code | number | 必须 | 响应码, 1 成功 ; 0 失败 | ||
msg | string | 非必须 | 提示信息 | ||
data | string | 必须 | 返回的数据 , jwt令牌 |
响应数据样例:
{"code": 1,"msg": "success","data": "eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6YeR5bq4IiwiaWQiOjEsInVzZXJuYW1lIjoiamlueW9uZyIsImV4cCI6MTY2MjIwNzA0OH0.KkUc_CXJZJ8Dd063eImx4H9Ojfrr6XMJ-yVzaWCVZCo" }
1.3.1.3.1.4 备注说明
用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,都需要在请求头header中携带到服务端,请求头的名称为 token ,值为 登录时下发的JWT令牌。
如果检测到用户未登录,则会返回如下固定错误信息:
{"code": 0,"msg": "NOT_LOGIN","data": null }
1.3.2 Resful风格
1.3.3 统一响应结果
package com.runa.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private Integer code;//响应码,1 代表成功; 0 代表失败private String msg; //响应信息 描述字符串private Object data; //返回的数据//增删改 成功响应public static Result success(){return new Result(1,"success",null);}//查询 成功响应public static Result success(Object data){return new Result(1,"success",data);}//失败响应public static Result error(String msg){return new Result(0,msg,null);}
}
1.3.4 思路
二、部门管理
2.1 查询部门
2.1.1 思路
2.1.2 DeptController
package com.runa.controller;import com.runa.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;/*** 部门管理Controller*/
@Slf4j
@RestController
public class Deptcontroller {// private static Logger log = LoggerFactory.getLogger(Deptcontroller.class);// @RequestMapping(value = "/depts", method = RequestMethod.GET) //指定请求方式为GET@GetMapping("/depts") //public Result list(){log.info("查询全部部门数据");return Result.success();}
}
可以启动服务测试一下
继续优化
package com.runa.controller;import com.runa.pojo.Dept;
import com.runa.pojo.Result;
import com.runa.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 部门管理Controller*/
@Slf4j
@RestController
public class Deptcontroller {@Autowiredprivate DeptService deptService;// private static Logger log = LoggerFactory.getLogger(Deptcontroller.class);
// @RequestMapping(value = "/depts", method = RequestMethod.GET) //指定请求方式为GET@GetMapping("/depts") //public Result list(){log.info("查询全部部门数据");// 调用 service查询部门数据List<Dept> deptList = deptService.list();return Result.success(deptList);}
}
2.1.3 DeptService
package com.runa.service;import com.runa.pojo.Dept;import java.util.List;public interface DeptService {/*** 查询全部 部门数据* @return*/List<Dept> list();
}
2.1.4 DeptServiceImpl
package com.runa.service.impl;import com.runa.mapper.DeptMapper;
import com.runa.pojo.Dept;
import com.runa.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Overridepublic List<Dept> list() {return deptMapper.list();}
}
2.1.5 DeptMapper
package com.runa.mapper;import com.runa.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 部门管理*/
@Mapper
public interface DeptMapper {/*** 查询全部部门* @return*/@Select("select * from springbootproject.dept")List<Dept> list();
}
2.1.6 启动服务测试
2.1.7 前后端联调
前端 代码下载
2.1.8 总结
2.2 删除部门
2.2.1 思路
2.2.2 DeptController
package com.runa.controller;import com.runa.pojo.Dept;
import com.runa.pojo.Result;
import com.runa.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 部门管理Controller*/
@Slf4j
@RestController
public class Deptcontroller {@Autowiredprivate DeptService deptService;/*** 查询部门数据* @return*/
// private static Logger log = LoggerFactory.getLogger(Deptcontroller.class);
// @RequestMapping(value = "/depts", method = RequestMethod.GET) //指定请求方式为GET@GetMapping("/depts") //public Result list(){log.info("查询全部部门数据");// 调用 service查询部门数据List<Dept> deptList = deptService.list();return Result.success(deptList);}/*** 删除部门* @return*/@DeleteMapping("/depts/{id}")public Result delete(@PathVariable Integer id){log.info("根据id删除部门:{}", id);// 调用service删除部门deptService.delete(id);return Result.success();}
}
2.2.3 DeptService
package com.runa.service;import com.runa.pojo.Dept;import java.util.List;public interface DeptService {/*** 查询全部 部门数据* @return*/List<Dept> list();/*** 依据id删除部门* @param id*/void delete(Integer id);
}
2.2.4 DeptServiceImpl
package com.runa.service.impl;import com.runa.mapper.DeptMapper;
import com.runa.pojo.Dept;
import com.runa.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;/*** 查询部门* @return*/@Overridepublic List<Dept> list() {return deptMapper.list();}/*** 根据ID删除部门* @param id*/@Overridepublic void delete(Integer id) {deptMapper.deleteById(id);}
}
2.2.5 DeptMapper
package com.runa.mapper;import com.runa.pojo.Dept;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 部门管理*/
@Mapper
public interface DeptMapper {/*** 查询全部部门* @return*/@Select("select * from springbootproject.dept")List<Dept> list();/*** 根据id删除部门*/@Delete("delete from dept where id = #{id}")void deleteById(Integer id);
}
2.1.6 启动服务 测试
2.2.7 前后端联调
2.3 新增部门
2.3.1 思路
2.3.2 DeptController
package com.runa.controller;import com.runa.pojo.Dept;
import com.runa.pojo.Result;
import com.runa.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 部门管理Controller*/
@Slf4j
@RestController
public class Deptcontroller {@Autowiredprivate DeptService deptService;/*** 查询部门数据* @return*/
// private static Logger log = LoggerFactory.getLogger(Deptcontroller.class);
// @RequestMapping(value = "/depts", method = RequestMethod.GET) //指定请求方式为GET@GetMapping("/depts") //public Result list(){log.info("查询全部部门数据");// 调用 service查询部门数据List<Dept> deptList = deptService.list();return Result.success(deptList);}/*** 删除部门* @return*/@DeleteMapping("/depts/{id}")public Result delete(@PathVariable Integer id){log.info("根据id删除部门:{}", id);// 调用service删除部门deptService.delete(id);return Result.success();}/*** 添加部门* @return*/@PostMapping("/depts")public Result add(@RequestBody Dept dept){log.info("新增部门:{}",dept);// // 调用service新增部门deptService.add(dept);return Result.success();}
}
2.3.3 DeptService
package com.runa.service;import com.runa.pojo.Dept;import java.util.List;public interface DeptService {/*** 查询全部 部门数据* @return*/List<Dept> list();/*** 依据id删除部门* @param id*/void delete(Integer id);/*** 新增部门* @param dept*/void add(Dept dept);
}
2.3.4 DeptServiceImpl
package com.runa.service.impl;import com.runa.mapper.DeptMapper;
import com.runa.pojo.Dept;
import com.runa.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.List;@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;/*** 查询部门* @return*/@Overridepublic List<Dept> list() {return deptMapper.list();}/*** 根据ID删除部门* @param id*/@Overridepublic void delete(Integer id) {deptMapper.deleteById(id);}/*** 新增部门* @param dept*/@Overridepublic void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.insert(dept);}
}
2.3.5 DeptMapper
package com.runa.mapper;import com.runa.pojo.Dept;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 部门管理*/
@Mapper
public interface DeptMapper {/*** 查询全部部门* @return*/@Select("select * from springbootproject.dept")List<Dept> list();/*** 根据id删除部门*/@Delete("delete from dept where id = #{id}")void deleteById(Integer id);/*** 新增部门*/@Insert("insert into dept(name,create_time,update_time) values (#{name}, #{createTime}, #{updateTime})")void insert(Dept dept);
}
2.3.6 启动服务-测试
2.3.7 前后端联调
2.4 优化DeptController的路径
package com.runa.controller;import com.runa.pojo.Dept;
import com.runa.pojo.Result;
import com.runa.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 部门管理Controller*/
@Slf4j
@RequestMapping("/depts")
@RestController
public class Deptcontroller {@Autowiredprivate DeptService deptService;/*** 查询部门数据* @return*/
// private static Logger log = LoggerFactory.getLogger(Deptcontroller.class);
// @RequestMapping(value = "/depts", method = RequestMethod.GET) //指定请求方式为GET@GetMapping //public Result list(){log.info("查询全部部门数据");// 调用 service查询部门数据List<Dept> deptList = deptService.list();return Result.success(deptList);}/*** 删除部门* @return*/@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id){log.info("根据id删除部门:{}", id);// 调用service删除部门deptService.delete(id);return Result.success();}/*** 添加部门* @return*/@PostMappingpublic Result add(@RequestBody Dept dept){log.info("新增部门:{}",dept);// // 调用service新增部门deptService.add(dept);return Result.success();}
}
2.5 根据id查询部门
2.5.1 DeptController
package com.runa.controller;import com.runa.pojo.Dept;
import com.runa.pojo.Result;
import com.runa.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 部门管理Controller*/
@Slf4j
@RestController
@RequestMapping("/depts")
public class Deptcontroller {@Autowiredprivate DeptService deptService;/*** 查询部门数据* @return*/
// private static Logger log = LoggerFactory.getLogger(Deptcontroller.class);
// @RequestMapping(value = "/depts", method = RequestMethod.GET) //指定请求方式为GET@GetMapping //public Result list(){log.info("查询全部部门数据");// 调用 service查询部门数据List<Dept> deptList = deptService.list();return Result.success(deptList);}/*** 删除部门* @return*/@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id){log.info("根据id删除部门:{}", id);// 调用service删除部门deptService.delete(id);return Result.success();}/*** 添加部门* @return*/@PostMappingpublic Result add(@RequestBody Dept dept){log.info("新增部门:{}",dept);// // 调用service新增部门deptService.add(dept);return Result.success();}/*** 根据ID查询部门* @return*/@GetMapping("/{id}")public Result getById(@PathVariable Integer id){log.info("根据id查询部门:{}", id);// 调用service查询部门Dept dept = deptService.getById(id);return Result.success(dept);}
}
2.5.2 DeptService
package com.runa.service;import com.runa.pojo.Dept;import java.util.List;public interface DeptService {/*** 查询全部 部门数据* @return*/List<Dept> list();/*** 依据id删除部门* @param id*/void delete(Integer id);/*** 新增部门* @param dept*/void add(Dept dept);/*** 根据id查询部门* @param id* @return*/Dept getById(Integer id);
}
2.5.3 DeptServiceImpl
package com.runa.service.impl;import com.runa.mapper.DeptMapper;
import com.runa.pojo.Dept;
import com.runa.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.List;@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;/*** 查询部门* @return*/@Overridepublic List<Dept> list() {return deptMapper.list();}/*** 根据ID删除部门* @param id*/@Overridepublic void delete(Integer id) {deptMapper.deleteById(id);}/*** 新增部门* @param dept*/@Overridepublic void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.insert(dept);}/*** 根据id查询部门* @param id* @return*/@Overridepublic Dept getById(Integer id) {return deptMapper.getById(id);}
}
2.5.4 DeptMapper
package com.runa.mapper;import com.runa.pojo.Dept;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 部门管理*/
@Mapper
public interface DeptMapper {/*** 查询全部部门* @return*/@Select("select * from springbootproject.dept")List<Dept> list();/*** 根据id删除部门*/@Delete("delete from dept where id = #{id}")void deleteById(Integer id);/*** 新增部门*/@Insert("insert into dept(name,create_time,update_time) values (#{name}, #{createTime}, #{updateTime})")void insert(Dept dept);/*** 根据id查询部门* @return*/@Select("select * from springbootproject.dept where id = #{id}")Dept getById(Integer id);
}
2.5.5 启动服务-测试
2.5.6 前后端联调
2.6 修改部门
2.6.1 DeptController
package com.runa.controller;import com.runa.pojo.Dept;
import com.runa.pojo.Result;
import com.runa.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 部门管理Controller*/
@Slf4j
@RestController
@RequestMapping("/depts")
public class Deptcontroller {@Autowiredprivate DeptService deptService;/*** 查询部门数据* @return*/
// private static Logger log = LoggerFactory.getLogger(Deptcontroller.class);
// @RequestMapping(value = "/depts", method = RequestMethod.GET) //指定请求方式为GET@GetMapping //public Result list(){log.info("查询全部部门数据");// 调用 service查询部门数据List<Dept> deptList = deptService.list();return Result.success(deptList);}/*** 删除部门* @return*/@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id){log.info("根据id删除部门:{}", id);// 调用service删除部门deptService.delete(id);return Result.success();}/*** 添加部门* @return*/@PostMappingpublic Result add(@RequestBody Dept dept){log.info("新增部门:{}",dept);// // 调用service新增部门deptService.add(dept);return Result.success();}/*** 根据ID查询部门* @return*/@GetMapping("/{id}")public Result getById(@PathVariable Integer id){log.info("根据id查询部门:{}", id);// 调用service查询部门Dept dept = deptService.getById(id);return Result.success(dept);}/*** 编辑部门* @return*/@PutMappingpublic Result update(@RequestBody Dept dept){log.info("编辑部门:{}==={}", dept.getId(),dept.getName());// 调用service编辑部门deptService.update(dept);return Result.success();}
}
2.6.2 DeptService
package com.runa.service;import com.runa.pojo.Dept;import java.util.List;public interface DeptService {/*** 查询全部 部门数据* @return*/List<Dept> list();/*** 依据id删除部门* @param id*/void delete(Integer id);/*** 新增部门* @param dept*/void add(Dept dept);/*** 根据id查询部门* @param id* @return*/Dept getById(Integer id);/*** 编辑用户*/void update(Dept dept);}
2.6.3 DeptServiceImpl
package com.runa.service.impl;import com.runa.mapper.DeptMapper;
import com.runa.pojo.Dept;
import com.runa.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.List;@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;/*** 查询部门* @return*/@Overridepublic List<Dept> list() {return deptMapper.list();}/*** 根据ID删除部门* @param id*/@Overridepublic void delete(Integer id) {deptMapper.deleteById(id);}/*** 新增部门* @param dept*/@Overridepublic void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.insert(dept);}/*** 根据id查询部门* @param id* @return*/@Overridepublic Dept getById(Integer id) {return deptMapper.getById(id);}/*** 编辑部门* @param dept*/@Overridepublic void update(Dept dept) {dept.setUpdateTime(LocalDateTime.now());deptMapper.update(dept);}}
2.6.4 DeptMapper
package com.runa.mapper;import com.runa.pojo.Dept;
import org.apache.ibatis.annotations.*;import java.util.List;/*** 部门管理*/
@Mapper
public interface DeptMapper {/*** 查询全部部门* @return*/@Select("select * from springbootproject.dept")List<Dept> list();/*** 根据id删除部门*/@Delete("delete from dept where id = #{id}")void deleteById(Integer id);/*** 新增部门*/@Insert("insert into dept(name,create_time,update_time) values (#{name}, #{createTime}, #{updateTime})")void insert(Dept dept);/*** 根据id查询部门* @return*/@Select("select * from springbootproject.dept where id = #{id}")Dept getById(Integer id);/*** 编辑部门*/@Update("update dept set name = #{name}, update_time = #{updateTime} where id = #{id}")void update(Dept dept);
}
2.6.5 启动服务-测试
2.6.6 前后端联调
三、员工管理
3.1 分页查询
3.1.1 思路
3.1.2 PageBean分页查询结果实体类
package com.runa.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** 分页查询的结果类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {// 这里的定义名称要与接口文档一致性private long total; // 总记录数private List rows; //数据列表}
3.1.3 EmpController
package com.runa.controller;import com.runa.pojo.PageBean;
import com.runa.pojo.Result;import com.runa.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** 员工管理Controller*/
@Slf4j
@RequestMapping("/emps")
@RestController
public class EmpController {@Autowiredprivate EmpService empService;@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer pageSize){log.info("分页查询,参数:开始页 {}, 每页显示:{}", page, pageSize);// 调用Service方法进行查询PageBean pageBean = empService.page(page,pageSize);return Result.success(pageBean);}
}
3.1.4 EmpService
package com.runa.service;import com.runa.pojo.PageBean;public interface EmpService {/*** 分页查询* @param page* @param pageSize* @return*/PageBean page(Integer page, Integer pageSize);}
3.1.5 EmpServiceImpl
package com.runa.service.impl;import com.runa.mapper.EmpMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 分页查询* @param page* @param pageSize* @return*/@Overridepublic PageBean page(Integer page, Integer pageSize) {// 1 获取总记录数Long count = empMapper.count();// 2 获取分页查询结果列表Integer start = (page - 1) * pageSize;List<Emp> empList = empMapper.page(start, pageSize);// 3 封装PangeBean对象PageBean pageBean = new PageBean(count,empList);return pageBean;}
}
3.1.6 EmpMapper
package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 员工管理*/
@Mapper
public interface EmpMapper {/*** 查询总记录数* @return*/@Select("select count(*) from emp")public Long count();/*** 分页查询 获取列表数据* @param start* @param pageSize* @return*/@Select("select * from emp limit #{start}, #{pageSize}")public List<Emp> page(Integer start, Integer pageSize);
}
3.1.7 启动服务-测试
控制台没有看到这个,就说明pagehelper版本有问题
3.1.8 前后端联调
3.1.9 总结
3.1.10 使用分页插件 PageHelper优化代码
3.1.10.1 引入 PageHelper依赖
使用1.4.2版本没有成功,换成1.4.6就OK了
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency>
3.1.10.2 EmpMapper
package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** 员工管理*/
@Mapper
public interface EmpMapper {/*** 查询总记录数* @return*/
// @Select("select count(*) from emp")
// public Long count();/*** 分页查询 获取列表数据* @param start* @param pageSize* @return*/
// @Select("select * from emp limit #{start}, #{pageSize}")
// public List<Emp> page(Integer start, Integer pageSize);/*** 使用pagehelper的员工信息查询* @return*/@Select("select * from emp")public List<Emp> list();}
3.1.10.3 EmpServiceImpl
package com.runa.service.impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.runa.mapper.EmpMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 分页查询* @param page* @param pageSize* @return*/@Overridepublic PageBean page(Integer page, Integer pageSize) {
// // 1 获取总记录数
// Long count = empMapper.count();
//
// // 2 获取分页查询结果列表
// Integer start = (page - 1) * pageSize;
// List<Emp> empList = empMapper.page(start, pageSize);
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(count,empList);// 1 设置分页参数PageHelper.startPage(page, pageSize);// 2 执行查询List<Emp> empList = empMapper.list();Page<Emp> p = (Page<Emp>) empList;// 3 封装PangeBean对象PageBean pageBean = new PageBean(p.getTotal(),p.getResult());return pageBean;}
}
3.1.10.4 启动服务-测试
3.1.10.5 前后端联调
3.1.10.6 总结
3.2 分页查询(带条件)
3.2.1 思路
3.2.2 EmpController
package com.runa.controller;import com.runa.pojo.PageBean;
import com.runa.pojo.Result;import com.runa.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.time.LocalDate;/*** 员工管理Controller*/
@Slf4j
@RequestMapping("/emps")
@RestController
public class EmpController {@Autowiredprivate EmpService empService;/*** 员工数据查询列表 , 不带条件* @param page* @param pageSize* @return*/// @GetMapping
// public Result page(@RequestParam(defaultValue = "1") Integer page,
// @RequestParam(defaultValue = "10") Integer pageSize){
// log.info("分页查询,参数:开始页 {}, 每页显示:{}", page, pageSize);
// // 调用Service方法进行查询
// PageBean pageBean = empService.page(page,pageSize);
//
// return Result.success(pageBean);
// }/*** 员工数据查询列表 , 带条件组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){log.info("分页查询,参数:开始页 {}, 每页显示:{},姓名:{},性别:{}, 开始日期:{},结束日期:{}", page, pageSize, name, gender, begin, end);// 调用Service方法进行查询PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);return Result.success(pageBean);}}
3.2.3 EmpService
package com.runa.service;import com.runa.pojo.PageBean;
import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDate;public interface EmpService {/*** 分页查询 不带条件* @param page* @param pageSize* @return*/
// PageBean page(Integer page, Integer pageSize);/*** 分页查询 带条件* @param page* @param pageSize* @return*/PageBean page(Integer page, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end);}
3.2.4 EmpServiceImpl
package com.runa.service.impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.runa.mapper.EmpMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.util.List;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 分页查询 pagehelper+组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@Overridepublic PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {// 1 设置分页参数PageHelper.startPage(page, pageSize);// 2 执行查询List<Emp> empList = empMapper.list(name, gender, begin, end);Page<Emp> p = (Page<Emp>) empList;// 3 封装PangeBean对象PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());return pageBean;}/*** 分页查询 加pagehelper* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 设置分页参数
// PageHelper.startPage(page, pageSize);
//
// // 2 执行查询
// List<Emp> empList = empMapper.list();
// Page<Emp> p = (Page<Emp>) empList;
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());
// return pageBean;
// }/*** 分页查询* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 获取总记录数
// Long count = empMapper.count();
//
// // 2 获取分页查询结果列表
// Integer start = (page - 1) * pageSize;
// List<Emp> empList = empMapper.page(start, pageSize);
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(count,empList);
// }}
3.2.5 EmpMapper
package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.time.LocalDate;
import java.util.List;/*** 员工管理*/
@Mapper
public interface EmpMapper {/*** 查询总记录数* @return*/
// @Select("select count(*) from emp")
// public Long count();/*** 分页查询 获取列表数据* @param start* @param pageSize* @return*/
// @Select("select * from emp limit #{start}, #{pageSize}")
// public List<Emp> page(Integer start, Integer pageSize);/*** 使用pagehelper的员工信息查询* @return*/
// @Select("select * from emp")
// public List<Emp> list();/*** 使用pagehelper的员工信息查询(带条件)--动态sql* 使用xml注解sql* @return*/public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);}
3.2.6 EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper"><select id="list" resultType="com.runa.pojo.Emp">select * from emp<where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc</where></select></mapper>
注意sql不要有结束;符号
3.2.7 启动服务-测试
3.2.8 前后端联调
3.2.9 总结
3.3 删除员工
3.3.1 思路
3.3.2 EmpController
package com.runa.controller;import com.runa.pojo.PageBean;
import com.runa.pojo.Result;import com.runa.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDate;
import java.util.List;/*** 员工管理Controller*/
@Slf4j
@RequestMapping("/emps")
@RestController
public class EmpController {@Autowiredprivate EmpService empService;/*** 员工数据查询列表 , 不带条件* @param page* @param pageSize* @return*/// @GetMapping
// public Result page(@RequestParam(defaultValue = "1") Integer page,
// @RequestParam(defaultValue = "10") Integer pageSize){
// log.info("分页查询,参数:开始页 {}, 每页显示:{}", page, pageSize);
// // 调用Service方法进行查询
// PageBean pageBean = empService.page(page,pageSize);
//
// return Result.success(pageBean);
// }/*** 员工数据查询列表 , 带条件组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){log.info("分页查询,参数:开始页 {}, 每页显示:{},姓名:{},性别:{}, 开始日期:{},结束日期:{}", page, pageSize, name, gender, begin, end);// 调用Service方法进行查询PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);return Result.success(pageBean);}/*** 批量删除员工* @param ids* @return*/@DeleteMapping("/{ids}")public Result delete(@PathVariable List<Integer> ids){log.info("批量删除的操作,删除对象为:{}",ids);empService.delete(ids);return Result.success();}}
3.3.3 EmpService
package com.runa.service;import com.runa.pojo.PageBean;
import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDate;
import java.util.List;public interface EmpService {/*** 分页查询 不带条件* @param page* @param pageSize* @return*/
// PageBean page(Integer page, Integer pageSize);/*** 分页查询 带条件* @param page* @param pageSize* @return*/PageBean page(Integer page, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工* @param ids*/void delete(List<Integer> ids);
}
3.3.4 EmpServiceImpl
package com.runa.service.impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.runa.mapper.EmpMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.util.List;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 分页查询 pagehelper+组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@Overridepublic PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {// 1 设置分页参数PageHelper.startPage(page, pageSize);// 2 执行查询List<Emp> empList = empMapper.list(name, gender, begin, end);Page<Emp> p = (Page<Emp>) empList;// 3 封装PangeBean对象PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());return pageBean;}/*** 批量删除员工* @param ids*/@Overridepublic void delete(List<Integer> ids) {empMapper.delete(ids);}/*** 分页查询 加pagehelper* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 设置分页参数
// PageHelper.startPage(page, pageSize);
//
// // 2 执行查询
// List<Emp> empList = empMapper.list();
// Page<Emp> p = (Page<Emp>) empList;
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());
// return pageBean;
// }/*** 分页查询* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 获取总记录数
// Long count = empMapper.count();
//
// // 2 获取分页查询结果列表
// Integer start = (page - 1) * pageSize;
// List<Emp> empList = empMapper.page(start, pageSize);
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(count,empList);
// }}
3.3.5 EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper"><!-- 批量删除员工 --><delete id="delete">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete><!-- 条件查询--><select id="list" resultType="com.runa.pojo.Emp">select * from emp<where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc</where></select></mapper>
3.3.6 EmpMapper
package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.time.LocalDate;
import java.util.List;/*** 员工管理*/
@Mapper
public interface EmpMapper {/*** 查询总记录数* @return*/
// @Select("select count(*) from emp")
// public Long count();/*** 分页查询 获取列表数据* @param start* @param pageSize* @return*/
// @Select("select * from emp limit #{start}, #{pageSize}")
// public List<Emp> page(Integer start, Integer pageSize);/*** 使用pagehelper的员工信息查询* @return*/
// @Select("select * from emp")
// public List<Emp> list();/*** 使用pagehelper的员工信息查询(带条件)--动态sql* 使用xml注解sql* @return*/public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工* @param ids*/void delete(List<Integer> ids);
}
3.3.7 启动服务-测试
3.3.8 前后端联调
3.4 新增员工
3.4.1 思路
3.4.2 EmpController
package com.runa.controller;import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.pojo.Result;import com.runa.service.EmpService;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDate;
import java.util.List;/*** 员工管理Controller*/
@Slf4j
@RequestMapping("/emps")
@RestController
public class EmpController {@Autowiredprivate EmpService empService;/*** 员工数据查询列表 , 不带条件* @param page* @param pageSize* @return*/// @GetMapping
// public Result page(@RequestParam(defaultValue = "1") Integer page,
// @RequestParam(defaultValue = "10") Integer pageSize){
// log.info("分页查询,参数:开始页 {}, 每页显示:{}", page, pageSize);
// // 调用Service方法进行查询
// PageBean pageBean = empService.page(page,pageSize);
//
// return Result.success(pageBean);
// }/*** 员工数据查询列表 , 带条件组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){log.info("分页查询,参数:开始页 {}, 每页显示:{},姓名:{},性别:{}, 开始日期:{},结束日期:{}", page, pageSize, name, gender, begin, end);// 调用Service方法进行查询PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);return Result.success(pageBean);}/*** 批量删除员工* @param ids* @return*/@DeleteMapping("/{ids}")public Result delete(@PathVariable List<Integer> ids){log.info("批量删除的操作,删除对象为:{}",ids);empService.delete(ids);return Result.success();}/*** 新增员工* @param emp* @return*/@PostMappingpublic Result save(@RequestBody Emp emp){log.info("新增员工emp: {}",emp);empService.save(emp);return Result.success();}}
3.4.3 EmpService
package com.runa.service;import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDate;
import java.util.List;public interface EmpService {/*** 分页查询 不带条件* @param page* @param pageSize* @return*/
// PageBean page(Integer page, Integer pageSize);/*** 分页查询 带条件* @param page* @param pageSize* @return*/PageBean page(Integer page, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工* @param ids*/void delete(List<Integer> ids);/*** 新增员工* @param emp*/void save(Emp emp);
}
3.4.4 EmpServiceImpl
package com.runa.service.impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.runa.mapper.EmpMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 分页查询 pagehelper+组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@Overridepublic PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {// 1 设置分页参数PageHelper.startPage(page, pageSize);// 2 执行查询List<Emp> empList = empMapper.list(name, gender, begin, end);Page<Emp> p = (Page<Emp>) empList;// 3 封装PangeBean对象PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());return pageBean;}/*** 批量删除员工* @param ids*/@Overridepublic void delete(List<Integer> ids) {empMapper.delete(ids);}/*** 新增员工* @param emp*/@Overridepublic void save(Emp emp) {emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp);}/*** 分页查询 加pagehelper* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 设置分页参数
// PageHelper.startPage(page, pageSize);
//
// // 2 执行查询
// List<Emp> empList = empMapper.list();
// Page<Emp> p = (Page<Emp>) empList;
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());
// return pageBean;
// }/*** 分页查询* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 获取总记录数
// Long count = empMapper.count();
//
// // 2 获取分页查询结果列表
// Integer start = (page - 1) * pageSize;
// List<Emp> empList = empMapper.page(start, pageSize);
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(count,empList);
// }}
3.4.5 EmpMapper
package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;import java.time.LocalDate;
import java.util.List;/*** 员工管理*/
@Mapper
public interface EmpMapper {/*** 查询总记录数* @return*/
// @Select("select count(*) from emp")
// public Long count();/*** 分页查询 获取列表数据* @param start* @param pageSize* @return*/
// @Select("select * from emp limit #{start}, #{pageSize}")
// public List<Emp> page(Integer start, Integer pageSize);/*** 使用pagehelper的员工信息查询* @return*/
// @Select("select * from emp")
// public List<Emp> list();/*** 使用pagehelper的员工信息查询(带条件)--动态sql* 使用xml注解sql* @return*/public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工* @param ids*/void delete(List<Integer> ids);/*** 新增员工* @param emp*/@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +" values(#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")void insert(Emp emp);
}
3.4.6 启动服务-测试
3.4.7 前后端联调
3.5 文件上传
3.5.1 简介
3.5.1.1 upload.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>上传文件</title>
</head>
<body><form action="/upload" method="post" enctype="multipart/form-data">姓名: <input type="text" name="username"><br>年龄: <input type="text" name="age"><br>头像: <input type="file" name="image"><br><input type="submit" value="提交"></form></body>
</html>
txt 内容自己定义即可
3.5.1.2 UploadController
package com.runa.controller;import com.runa.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;@Slf4j
@RestController
public class UploadController {@PostMapping("/upload")public Result upload(String username, Integer age, MultipartFile image){log.info("文件上传:{},{},{}",username,age,image);return Result.success();}
}
3.5.1.3 启动服务-测试
多试几次
http://localhost:8080/upload.html
3.5.1.4 总结
3.5.2 本地存储
3.5.2.1 UploadController
package com.runa.controller;import com.runa.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;@Slf4j
@RestController
public class UploadController {@PostMapping("/upload")public Result upload(String username, Integer age, MultipartFile image) throws Exception {log.info("文件上传:{},{},{}",username,age,image);// 将接收到的文件存储在服务器的磁盘目录当中 D:\image.transferTo(new File("D:\\images\\" + image.getOriginalFilename()));return Result.success();}
}
3.5.2.2 启动服务-测试
3.5.2.3 优化(确保存储文件名唯一UUID)UploadController
package com.runa.controller;import com.runa.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@Slf4j
@RestController
public class UploadController {@PostMapping("/upload")public Result upload(String username, Integer age, MultipartFile image) throws Exception {log.info("文件上传:{},{},{}",username,age,image);// 获取原始文件名String originalFilename = image.getOriginalFilename();// 构造唯一的文件名(不能重复) uuidint index = originalFilename.lastIndexOf(".");String extname = originalFilename.substring(index);String newFileName = UUID.randomUUID().toString() + extname;log.info(" 新的文件名: {}",newFileName);// 将接收到的文件存储在服务器的磁盘目录当中 D:\image.transferTo(new File("D:\\images\\" + newFileName));return Result.success();}
}
3.5.2.4 优化配置文件上传大小application.properties
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/springbootproject
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=runa#2050#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true# 配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB# 配置单个请求最大大小的限制(一次请求中是可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
3.5.2.5 扩展
3.5.3 阿里云OSS
3.5.3.1 通用思路
3.5.3.2 阿里云OSS准备工作
云存储解决方案-阿里云OSS
链接:https://pan.baidu.com/s/16i8-kgqqW7r5xZ-5r-eTaQ
提取码:私聊
3.5.3.3 安装依赖
<!-- 阿里云OSS依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency><!-- no more than 2.3.3--><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version></dependency>
3.5.3.4 示例代码
package com.runa;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;public class Demo {public static void main(String[] args) throws Exception {// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称,例如examplebucket。String bucketName = "examplebucket";// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。String objectName = "exampledir/exampleobject.txt";// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。String filePath= "D:\\localpath\\examplefile.txt";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);try {InputStream inputStream = new FileInputStream(filePath);// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}
}
依据自己的修改代码
运行main
3.6 新增页面集成文件上传阿里云OOS
3.6.1 思路
3.6.2 引人阿里云上传OSS上传文件工具类
package com.runa.utils;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;/*** 阿里云 OSS 工具类*/
@Component
public class AliOSSUtils {private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";private String accessKeyId = "LTAI4GCH1vX6DKqJWxd6nEuW";private String accessKeySecret = "yBshYweHOpqDuhCArrVHwIiBKpyqSL";private String bucketName = "web-tlias";/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}}
3.6.3 UploadController
package com.runa.controller;import com.runa.pojo.Result;
import com.runa.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@Slf4j
@RestController
public class UploadController {@Autowiredprivate AliOSSUtils aliOSSUtils; //注入// /**
// * 本地存储代码
// * @param username
// * @param age
// * @param image
// * @return
// * @throws Exception
// */
// @PostMapping("/upload")
// public Result upload(String username, Integer age, MultipartFile image) throws Exception {
// log.info("文件上传:{},{},{}",username,age,image);
//
// // 获取原始文件名
// String originalFilename = image.getOriginalFilename();
//
// // 构造唯一的文件名(不能重复) uuid
// int index = originalFilename.lastIndexOf(".");
// String extname = originalFilename.substring(index);
//
// String newFileName = UUID.randomUUID().toString() + extname;
// log.info(" 新的文件名: {}",newFileName);
// // 将接收到的文件存储在服务器的磁盘目录当中 D:\
// image.transferTo(new File("D:\\images\\" + newFileName));
//
// return Result.success();
// }@PostMapping("/upload")public Result upload(MultipartFile image) throws Exception {log.info("文件上传:{}",image.getOriginalFilename());// 调用阿里云OSS工具类String url = aliOSSUtils.upload(image); //调用阿里云OSS工具类,将上传上来的文件存入阿里云log.info("文件上传完成。文件访问url:{}",url);return Result.success(url); // 将图片上传完成后的url返回,用于浏览器回显展示}}
3.6.4 启动服务-测试
3.6.5 前后端联调
3.6.6 总结
3.7 修改员工
3.7.1 思路
3.7.2 查询回显
3.7.2.1 思路
3.7.2.2 EmpController
package com.runa.controller;import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.pojo.Result;import com.runa.service.EmpService;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDate;
import java.util.List;/*** 员工管理Controller*/
@Slf4j
@RequestMapping("/emps")
@RestController
public class EmpController {@Autowiredprivate EmpService empService;/*** 员工数据查询列表 , 不带条件* @param page* @param pageSize* @return*/// @GetMapping
// public Result page(@RequestParam(defaultValue = "1") Integer page,
// @RequestParam(defaultValue = "10") Integer pageSize){
// log.info("分页查询,参数:开始页 {}, 每页显示:{}", page, pageSize);
// // 调用Service方法进行查询
// PageBean pageBean = empService.page(page,pageSize);
//
// return Result.success(pageBean);
// }/*** 员工数据查询列表 , 带条件组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){log.info("分页查询,参数:开始页 {}, 每页显示:{},姓名:{},性别:{}, 开始日期:{},结束日期:{}", page, pageSize, name, gender, begin, end);// 调用Service方法进行查询PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);return Result.success(pageBean);}/*** 批量删除员工* @param ids* @return*/@DeleteMapping("/{ids}")public Result delete(@PathVariable List<Integer> ids){log.info("批量删除的操作,删除对象为:{}",ids);empService.delete(ids);return Result.success();}/*** 新增员工* @param emp* @return*/@PostMappingpublic Result save(@RequestBody Emp emp){log.info("新增员工emp: {}",emp);empService.save(emp);return Result.success();}@GetMapping("/{id}")public Result getById(@PathVariable Integer id){log.info("根据ID查询员工信息:{}",id);Emp emp = empService.getById(id);return Result.success(emp);}}
3.7.2.3 EmpService
package com.runa.service;import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDate;
import java.util.List;public interface EmpService {/*** 分页查询 不带条件* @param page* @param pageSize* @return*/
// PageBean page(Integer page, Integer pageSize);/*** 分页查询 带条件* @param page* @param pageSize* @return*/PageBean page(Integer page, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工* @param ids*/void delete(List<Integer> ids);/*** 新增员工* @param emp*/void save(Emp emp);/*** 根据id查询员工* @param id* @return*/Emp getById(Integer id);
}
3.7.2.4 EmpServiceImpl
package com.runa.service.impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.runa.mapper.EmpMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 分页查询 pagehelper+组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@Overridepublic PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {// 1 设置分页参数PageHelper.startPage(page, pageSize);// 2 执行查询List<Emp> empList = empMapper.list(name, gender, begin, end);Page<Emp> p = (Page<Emp>) empList;// 3 封装PangeBean对象PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());return pageBean;}/*** 批量删除员工* @param ids*/@Overridepublic void delete(List<Integer> ids) {empMapper.delete(ids);}/*** 新增员工* @param emp*/@Overridepublic void save(Emp emp) {emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp);}/*** 根据ID查询员工* @param id* @return*/@Overridepublic Emp getById(Integer id) {return empMapper.getByID(id);}/*** 分页查询 加pagehelper* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 设置分页参数
// PageHelper.startPage(page, pageSize);
//
// // 2 执行查询
// List<Emp> empList = empMapper.list();
// Page<Emp> p = (Page<Emp>) empList;
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());
// return pageBean;
// }/*** 分页查询* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 获取总记录数
// Long count = empMapper.count();
//
// // 2 获取分页查询结果列表
// Integer start = (page - 1) * pageSize;
// List<Emp> empList = empMapper.page(start, pageSize);
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(count,empList);
// }}
3.7.2.5 EmpMapper
package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.time.LocalDate;
import java.util.List;/*** 员工管理*/
@Mapper
public interface EmpMapper {/*** 查询总记录数* @return*/
// @Select("select count(*) from emp")
// public Long count();/*** 分页查询 获取列表数据* @param start* @param pageSize* @return*/
// @Select("select * from emp limit #{start}, #{pageSize}")
// public List<Emp> page(Integer start, Integer pageSize);/*** 使用pagehelper的员工信息查询* @return*/
// @Select("select * from emp")
// public List<Emp> list();/*** 使用pagehelper的员工信息查询(带条件)--动态sql* 使用xml注解sql* @return*/public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工* @param ids*/void delete(List<Integer> ids);/*** 新增员工* @param emp*/@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +" values(#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")void insert(Emp emp);/*** 根据id查询员工* @param id* @return*/@Select("select * from emp where id = #{id}")Emp getByID(Integer id);
}
3.7.2.6 启动服务-测试
3.7.2.7 前后端联调
3.7.3 修改员工
3.7.3.1 思路
3.7.3.2 EmpController
package com.runa.controller;import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.pojo.Result;import com.runa.service.EmpService;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDate;
import java.util.List;/*** 员工管理Controller*/
@Slf4j
@RequestMapping("/emps")
@RestController
public class EmpController {@Autowiredprivate EmpService empService;/*** 员工数据查询列表 , 不带条件* @param page* @param pageSize* @return*/// @GetMapping
// public Result page(@RequestParam(defaultValue = "1") Integer page,
// @RequestParam(defaultValue = "10") Integer pageSize){
// log.info("分页查询,参数:开始页 {}, 每页显示:{}", page, pageSize);
// // 调用Service方法进行查询
// PageBean pageBean = empService.page(page,pageSize);
//
// return Result.success(pageBean);
// }/*** 员工数据查询列表 , 带条件组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){log.info("分页查询,参数:开始页 {}, 每页显示:{},姓名:{},性别:{}, 开始日期:{},结束日期:{}", page, pageSize, name, gender, begin, end);// 调用Service方法进行查询PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);return Result.success(pageBean);}/*** 批量删除员工* @param ids* @return*/@DeleteMapping("/{ids}")public Result delete(@PathVariable List<Integer> ids){log.info("批量删除的操作,删除对象为:{}",ids);empService.delete(ids);return Result.success();}/*** 新增员工* @param emp* @return*/@PostMappingpublic Result save(@RequestBody Emp emp){log.info("新增员工emp: {}",emp);empService.save(emp);return Result.success();}/*** 根据id查询员工* @param id* @return*/@GetMapping("/{id}")public Result getById(@PathVariable Integer id){log.info("根据ID查询员工信息:{}",id);Emp emp = empService.getById(id);return Result.success(emp);}/*** 修改员工* @param emp* @return*/@PutMappingpublic Result update(@RequestBody Emp emp){log.info("更新员工: {}",emp);empService.update(emp);return Result.success();}}
3.7.3.3 EmpService
package com.runa.service;import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDate;
import java.util.List;public interface EmpService {/*** 分页查询 不带条件* @param page* @param pageSize* @return*/
// PageBean page(Integer page, Integer pageSize);/*** 分页查询 带条件* @param page* @param pageSize* @return*/PageBean page(Integer page, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工* @param ids*/void delete(List<Integer> ids);/*** 新增员工* @param emp*/void save(Emp emp);/*** 根据id查询员工* @param id* @return*/Emp getById(Integer id);/*** 修改员工* @param emp*/void update(Emp emp);
}
3.7.3.4 EmpServiceImpl
package com.runa.service.impl;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.runa.mapper.EmpMapper;
import com.runa.pojo.Emp;
import com.runa.pojo.PageBean;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;/*** 分页查询 pagehelper+组合查询* @param page* @param pageSize* @param name* @param gender* @param begin* @param end* @return*/@Overridepublic PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {// 1 设置分页参数PageHelper.startPage(page, pageSize);// 2 执行查询List<Emp> empList = empMapper.list(name, gender, begin, end);Page<Emp> p = (Page<Emp>) empList;// 3 封装PangeBean对象PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());return pageBean;}/*** 批量删除员工* @param ids*/@Overridepublic void delete(List<Integer> ids) {empMapper.delete(ids);}/*** 新增员工* @param emp*/@Overridepublic void save(Emp emp) {emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp);}/*** 根据ID查询员工* @param id* @return*/@Overridepublic Emp getById(Integer id) {return empMapper.getByID(id);}/*** 修改员工* @param emp*/@Overridepublic void update(Emp emp) {emp.setUpdateTime(LocalDateTime.now());empMapper.update(emp);}/*** 分页查询 加pagehelper* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 设置分页参数
// PageHelper.startPage(page, pageSize);
//
// // 2 执行查询
// List<Emp> empList = empMapper.list();
// Page<Emp> p = (Page<Emp>) empList;
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(p.getTotal(),((Page<Emp>) empList).getResult());
// return pageBean;
// }/*** 分页查询* @param page* @param pageSize* @return*/
// @Override
// public PageBean page(Integer page, Integer pageSize) {
// // 1 获取总记录数
// Long count = empMapper.count();
//
// // 2 获取分页查询结果列表
// Integer start = (page - 1) * pageSize;
// List<Emp> empList = empMapper.page(start, pageSize);
//
// // 3 封装PangeBean对象
// PageBean pageBean = new PageBean(count,empList);
// }}
3.7.3.5 EmpMapper
package com.runa.mapper;import com.runa.pojo.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.time.LocalDate;
import java.util.List;/*** 员工管理*/
@Mapper
public interface EmpMapper {/*** 查询总记录数* @return*/
// @Select("select count(*) from emp")
// public Long count();/*** 分页查询 获取列表数据* @param start* @param pageSize* @return*/
// @Select("select * from emp limit #{start}, #{pageSize}")
// public List<Emp> page(Integer start, Integer pageSize);/*** 使用pagehelper的员工信息查询* @return*/
// @Select("select * from emp")
// public List<Emp> list();/*** 使用pagehelper的员工信息查询(带条件)--动态sql* 使用xml注解sql* @return*/public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);/*** 批量删除员工* @param ids*/void delete(List<Integer> ids);/*** 新增员工* @param emp*/@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +" values(#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")void insert(Emp emp);/*** 根据id查询员工* @param id* @return*/@Select("select * from emp where id = #{id}")Emp getByID(Integer id);/*** 修改员工* @param emp*/void update(Emp emp);
}
3.7.3.6 EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.runa.mapper.EmpMapper">
<!-- 修改员工--><update id="update">update emp<set><if test="username != null and username != ''">username = #{username},</if><if test="password != null and password != ''">password = #{password},</if><if test="name != null and name != ''">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null and image != ''">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id = #{id}</update><!-- 批量删除员工 --><delete id="delete">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete><!-- 条件查询--><select id="list" resultType="com.runa.pojo.Emp">select * from emp<where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc</where></select></mapper>
3.7.3.7 启动服务-测试
3.7.3.8 前后端联调
相关文章:

[JavaWeb]【九】web后端开发-SpringBootWeb案例(菜单)
目录 一、准备工作 1.1 需求 1.2 环境搭建 1.2.1 准备数据库&表 1.2.2 创建springboot工程 1.2.3 配置application.properties & 准备对应实体类 1.2.3.1 application.properties 1.2.3.2 实体类 1.2.3.2.1 Emp类 1.2.3.2.2 Dept类 1.2.4 准备对应的Mapper、…...

vue 主组件把日期选择器给子组件props传obj值, 与子组件监听 watch对象或对象属性
1 主组件 1.1 :passObj 这种 非v-model ; change"DateChange"触发事件 <template> <div class"date-picker-panel"><el-date-picker v-model"value2" type"datetimerange" :picker-options"pickerOptions"…...

WebDAV之π-Disk派盘 + 一刻日记
一刻日记是一款日记、笔记和备忘录应用程序,旨在提供一个简单而专注的日记写作工具。它提供了一个干净、直观的界面,允许用户记录和管理他们的日常事务、个人情感、成就和目标等内容。 一刻日记的主要功能包括: – 创建和编辑日记、用户可以撰写和编辑自己的日记,记录重要…...

springboot aop实现接口防重复操作
一、前言 有时在项目开发中某些接口逻辑比较复杂,响应时间长,那么可能导致重复提交问题。 二、如何解决 1.先定义一个防重复提交的注解。 import java.lang.annotation.*;Inherited Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Do…...

ubuntu18.04复现yolo v8环境配置之CUDA与pytorch版本问题以及多CUDA版本安装及切换
最近在复现yolo v8的程序,特记录一下过程 环境:ubuntu18.04ros melodic 小知识:GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA,不必删除之前的CUDA,…...

Yaml配置文件读取方法
在日常的代码中,有一些值是配置文件中定义的,这些值可以根据用户的要求进行调整和改变。这往往会写在yaml格式的文件中。这样开放程序给用户时,就可以不必开放对应的源码,只开放yaml格式的配置文件即可。 将配置文件中的值读入程…...

Python3 lambda 函数入门示例 Python lambda 函数
Python lambda 函数 首先,这个语法跟C的语法几乎一样; 通常称 lambda 函数为匿名函数,也称为 丢弃函数,因为应一下子就不要了,不会长期凝结下来形成SDK API;本人觉得它有点类似 inline 函数,或者…...

【计算机网络】HTTPs 传输流程
HTTPS和HTTP的区别 1、HTTP协议传输的数据都是未加密的,是明文的,使用HTTP协议传输隐私信息非常不安 HTTPS协议是由SSLHTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。 2、HTTPS协议需要到CA申请证书,一般…...

【Linux】国产深度系统装机必备(开发、日常使用)
开发相关工具 IDE推荐官网下载JetBrains Toolbox,后续所有与jetbrains直接全部到toolbox中下载,这里默认所有的app全部放在个人用户下(/data/home/计算机用户名/.local/share/JetBrains/Toolbox/apps)终端可视化工具:…...

动态规划入门:斐波那契数列模型以及多状态(C++)
斐波那契数列模型以及多状态 动态规划简述斐波那契数列模型1.第 N 个泰波那契数(简单)2.三步问题(简单)3.使⽤最⼩花费爬楼梯(简单)4.解码方法(中等) 简单多状态1.打家劫舍ÿ…...

LeetCode438.找到字符串中所有字母异位词
因为之前写过一道找字母异位词分组的题,所以这道题做起来还是比较得心应手。我像做之前那道字母异位词分组一样,先把模板p排序,然后拿滑动窗口去s中从头到尾滑动,窗口中的这段字串也给他排序,然后拿这两个排完序的stri…...

【微服务】03-HttpClientFactory与gRpc
文章目录 1.HttpClientFactory :管理外向请求的最佳实践1.1 核心能力1.2 核心对象1.3 HttpClient创建模式 2.gRPC:内部服务间通讯利器2.1 什么是gRPC2.2 特点gRPC特点2.3.NET生态对gRPC的支持情况2.4 服务端核心包2.5 客户端核心包2.5 .proto文件2.6 gRP…...

iOS开发之查看静态库(.a/.framework)中包含的.o文件和函数符号(ar,nm命令)
.a/.framework其实是把编译生成的.o文件,打包成一个.a/.framework文件。a的意思是archive/归档的意思。 查看静态库.a文件包含的内容用下面的命令解压: ar x xxx.a 用ar命令打包静态库: 参数r是将后面的*.o或者*.a文件添加到目标文件中 参数…...

Idea常用快捷键--让你代码效率提升一倍(一)
一、代码编辑相关快捷键 1.单行复制(实现快速创建多个对象)CtrlD 2.空出下一行 ShiftEnter 3.单行注释快捷键 ctrl / 4.快速构建构造函数,setter,getter、toString方法 AltInsert 4.显示快速修复和操作的菜单 altenter 5.格式化代码:C…...

【Open3D】第二篇:GUI编程
文章目录 基本控件创建创建文本框创建button创建布局 绘制形状绘制线段绘制点云 设置属性设置线宽设置点大小 可用Shader汇总GUI框架 基本控件创建 创建文本框 push_edit gui.TextEdit()创建button push_button gui.Button(...) push_button.horizontal_padding_em 0.5 p…...

【Python】P0 本系列博文简介与大纲
Python 前言本系列博文适合谁本系列博文不适合谁本系列博文大纲 前言 本系列博文基于《Python Cookbook》一书,Python 3 版本;本系列博文的目标不是为了构建一个 Python 知识大全,而是为了那些需要快速将 Python 学以致用的相关人员…...

FL Studio 21.1.0 Build 3713中文破解免费下载安装激活
FL Studio 21是一个功能齐全、开放式的PC音乐创作和制作环境。它具有基于音乐序列器的图形用户界面。 这个数字音频工作站将您所需的一切整合在一个包中,用于创作、编排、录制、编辑、混音和掌握专业质量的音乐。 FL Studio 21是从你的大脑到扬声器的最快方式。制作…...

从0开始配置eslint
没有在.eslintrc文件中配置parserOptions指定语言版本和模块类型 {"parserOptions": {"ecmaVersion": 7, //指定es版本为es2016"sourceType": "module", //使用import导入模块} }eslint还不能识别jsx语法 {"parserOptions"…...

Activity 的启动流程(Android 13)
Activity 的启动过程分为两种:一种是普通 Activity 的启动过程,另一种是根 Activity 的启动过程。普通 Activity 指的是除应用程序启动的第一个 Activity 之外的其他 Activity。根 Activity 指的是应用程序启动的第一个 Activity,因此&#x…...

deepspeed学习资料
记录一些deepspeed学习过程中的好文章 【进行中】1、DeepSpeed使用指南(简略版)_Reza.的博客-CSDN博客 - 含deepspeed的安装方法 - 含 zero config的不同配置,stage1、stage2、stage3的配置和解释...

数据分享|R语言PCA主成分、lasso、岭回归降维分析近年来各国土地面积变化影响...
全文链接:http://tecdat.cn/?p31445 机器学习在环境监测领域的应用,着眼于探索全球范围内的环境演化规律,人类与自然生态之间的关系以及环境变化对人类生存的影响(点击文末“阅读原文”获取完整代码数据)。 课题着眼于…...

Docker-Consul
Docker-Consul 一、介绍1.什么是服务注册与发现2.什么是consul3.consul提供的一些关键特性: 二、consul 部署1.环境准备2.consul服务器3.查看集群信息4.通过 http api 获取集群信息 三、registrator服务器1.安装 Gliderlabs/Registrator2.测试服务发现功能是否正常3…...

Pygame编程(2)display模块
pygame编程2-display设备显示 pygame.display.init() 初始化 display 模块init() -> None pygame.display.get_init() 获取display初始化 状态,如果已经初始化,返回 True,否则返回Falseget_init() -> bool pygame.display.quit() 退出…...

第十五天|104.二叉树的最大深度、111.二叉树的最小深度、 222.完全二叉树的节点个数
104.二叉树的最大深度 题目链接:104. 二叉树的最大深度 - 力扣(LeetCode) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullp…...

图像识别技术在医疗领域的革命:探索医学影像诊断的未来
导言: 随着人工智能和计算机视觉的快速发展,图像识别技术在医疗领域正掀起一场革命。医学影像诊断是医疗工作中的重要环节,而图像识别技术的引入为医生提供了更准确、高效的辅助手段。本文将深入探讨图像识别技术在医疗领域的应用,…...

计网第四章(网络层)(二)
目录 IPV4地址编址 第一历史阶段(分类编址): A类地址: B类地址: C类地址: D类地址(多播地址): E类地址(保留地址): 第二历史阶…...

原生微信小程序使用 wxs;微信小程序使用 vant-weapp组件
1.原生微信小程序使用 wxs 1.内嵌 WXS 脚本 2. 定义外链 wxs 3. 使用外连wxs 在这里插入图片描述 2. 微信小程序使用 vant weapp 1.安装步骤 2. 安装包管理(package.json)文件的方法 操作顺序 :文档地址 如果使用 typescript 需要操作步骤3,否则不…...

qml相关知识1
qml相关知识1 QtQuick.Controls 哪个版本支持TreeModel 和 TreeItemqt5.12开始,TreeItem 类被删除,无法使用delegate 什么时候可以用Qt5.15中没有 import QtQuick.Controls 1吗,哪个版本有control1qml如何两种版本的controls混用(…...

linux+c+qt杂记
虚拟机网络选择; 桥接模式:设置window宿主机的IP/dns,把虚拟机设置为桥接即可。 切换到终端:我的是 ctrlaltFnF1? 问题解决: Ubuntu系统下载(清华大学开源软件镜像站)(ubuntu-20.…...

shouldComponentUpdate有什么作用?
触发时机 当props或state发生变化时,shouldComponentUpdate() 会在渲染执行之前被调用。 作用 根据shouldComponentUpdate()的返回值,判断react组件的输出是否受当前state或props更改影响。默认行为是state每次发生变化组件都会重新渲染。 shouldCompo…...