接上一篇内容,这一篇来讲员工管理的操作,具体环境搭建和项目配置看上一篇文章,这里就直接将项目的实现了
目录
一,类型封装(pageBean)
在接口文档中提到,要返回给前端的数据有两个一个是总记录数total,另一个是数据列表(数据库中的内容),我们可以把他封装成pageBean类型一起返回
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageBean {
private long total;//总记录数
private List rows;//数据列表
}
二,分页查询
1,实现效果

2,control层
@GetMapping("/emps")
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);
}
查看接口文档,采用/emps请求数据
@RequestParam设置默认参数,page=1,pageSize=10
log输出日志
调用Service方法,封装成PageBean类型
3,Service层
分页查询的抽象方法
PageBean page(Integer page,Integer pageSize);
4,Serviceimpl层
@Autowired
private EmpMapper empMapper;
/*
*员工查询
*/
@Override
public PageBean page(Integer page,Integer pageSize) {
//设置分页参数
PageHelper.startPage(page,pageSize);
//执行查询
List<Emp> empList=empMapper.list();
Page<Emp> p=(Page<Emp>) empList;
//分装到pageBean
PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
return pageBean;
}
分页查询方法的具体实现,这里调用了PageHelpter函数设置分页参数
PageHelper 是 MyBatis 框架中常用的分页插件,用于简化数据库查询的分页操作。它通过拦截 SQL 查询并自动添加分页参数,实现透明分页。以下是其核心功能和使用方法:
- 自动分页:在查询前调用分页方法,自动对后续查询添加
LIMIT/OFFSET等分页参数。 - 支持多数据库:适配 MySQL、Oracle、SQL Server 等主流数据库的分页语法。
- 分页信息封装:通过
PageInfo对象返回总记录数、总页数、当前页数据等信息。
使用PageHelpter需要在添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
版本选择适合字节的就好了
调用Mapper中的查询代码,得到所有员工的数据,再将其交给PageHelpter分页处理
分装到pageBean中将数据返回给前端
5,Mapper层
直接调用查询语句,得到所有数据
@Select("select * from emp")
public List<Emp> list();
二,分页条件查询
运用pageHelpter分页查询
运用动态sql实现条件查询
1,实现效果
输入对应的信息,查询得到对应的值

2,control层
@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page,
@RequestParam (defaultValue = "10")Integer pageSize
, String name, Short gender,
@DateTimeFormat(pattern="yyyy-MM-dd")LocalDateTime begin,
@DateTimeFormat(pattern="yyyy-MM-dd")LocalDateTime end){
log.info("查询员工信息:{},{},{},{},{},{}",page,pageSize,name,gender,begin,end);
//调用service查询员工数据
PageBean pageBean=empService.page(page,pageSize,name,gender,begin,end);
return Result.success(pageBean);
}
不需要另外创建方法,直接再分页查询的基础上添加变量
@DateTimeFormat(pattern="")规定日期的格式,要注意这里的MM要大些,不然可能会导致错误
log输出日志
调用service封装成pagebean返回给前端
3,Service层
在原来的方法上添加参数
/*
*分页查询
*/
PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate
4,serviceimpl层
在原来的方法上添加参数
@Override
public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDateTime begin ,LocalDateTime end) {
//设置分页参数
PageHelper.startPage(page,pageSize);
//执行查询
List<Emp> empList=empMapper.list(name,gender,begin,end);
Page<Emp> p=(Page<Emp>) empList;
//分装到pageBean
PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
return pageBean;
}
5,mapper层
在原来的方法上添加参数,要注意吧select注释掉,因为后面要创建xml来调用动态sql
/*
*获取所有员工信息
*/
//@Select("select * from emp")
public List<Emp> list(String name, Short gender, LocalDateTime begin, LocalDateTime end);
6,xml创建动态sql
这里默认大家已经把mybits环境搭建好了
再resources路径上创建软件包+文件
这里要注意软件包和xml文件的命名要和mapper一样
例如,我这里的mappper在软件包com/example/demo/mapper路径下名称为EmpMapper
创建软件包的时候不能跟之前一样用.(点),要用/不然创建的只是一个软件包的名称,打开后不是软件包的组合

下面是配置mabits环境下的xml
打开浏览器搜索mabits中文网,在入门中找到相关配置复制粘贴
链接如下:MyBatis 中文网 官网

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
注意要把cofign改为mapper,认真对照上面的代码,我一开始就是因为没有修改过来导致namespace一直报错
namespece 中写mapper的路径
<mapper namespace="com.example.demo.mapper.EmpMapper">
<!--条件查询-->
<select id="list" resultType="com.example.demo.pojo.Emp">
select *
from emp
<where>
<if test="name !=null and name!=''">
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>
</where>
order by update_time desc
</select>
</mapper>
我一开始忘了test是什么(就是单纯的模板而已)
这里给出test的解释:
<if test="...">是动态 SQL 的一部分。test 属性的值是 OGNL 表达式,用来判断条件是否成立
id的解释
在同一 namespace 下,id 是 SQL 语句的唯一标识,用于区分不同功能的 SQL,id 需与对应 Mapper 接口的方法名一致
resultType的解释
单条数据的类型,给出对应的包,我们的数据表类型是Emp,这里给出Emp的路径引用
用and连接,<where></where> 可以防止多余and,动态处理拼接
三,批量删除员工(这个比较简单,可以自己试试)
1,实现效果

前端向后端传送数组,后端接收到之后删除对应数组

2,control 层
/*
*批量删除员工
*/
@DeleteMapping("/emps/{ids}")
public Result delete(@PathVariable List<Integer> ids){
log.info("批量删除员工:{}",ids);
empService.delete(ids);
return Result.success();
}
DeletMaping()是前端指定的路径
@PathVariable Long id:该注解把路径中的 {id} 变量绑定到方法的 ids 参数上。
调用Service方法删除后返回前端要求的响应
3,Service层
/*
批量删除
*/
void delete(List<Integer> ids);
4,Serviceimpl层
//删除员工数据
@Override
public void delete(List<Integer> ids) {
empMapper.delete(ids);
}
5,Mapper层
/*
删除员工信息
*/
public void delete(List<Integer> ids);
xml中书写sql语句
<!--批量删除-->
<delete id="delete">
delete from emp
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
if指明操作类型
foreach遍历,后面分别接集合,对象,拼接,连接符
四,添加员工
1,实现效果

输入员工信息,将信息录入到数据库中,并且能够展示出来
2,control层
/*
添加员工
*/
@PostMapping()
public Result save(@RequestBody Emp emp){
log.info("添加员工:{}",emp);
empService.save(emp);
return Result.success();
}
@RequestBody 注解的主要作用是将 HTTP 请求体中的数据绑定到控制器方法的参数上
3,service层
/*
添加员工
*/
void save(Emp emp);
4,serviceimpl层
/*
添加员工
*/
@Override
public void save(Emp emp) {
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.save(emp);
}
设置时间CreateTime,setUpdateTime
5,mapper层
/*
添加员工信息
*/
public void save(Emp emp);
xml中插入
<!--添加员工-->
<insert id="save">
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})
</insert>
原来id是要和函数中的名字相同(我之前一直没注意hhh)
6,postman测试josn类型
{
"image": "https://web-framework.oss-cnhangzhou.aliyuncs.com/2022-09-03-07-37-38222.jpg",
"username": "linpingzhi",
"name": "林平之",
"gender": 1,
"job": 1,
"entrydate": "2022-09-18",
"deptId": 1
}
五,文件上传
1,上传到本地磁盘(可以选择跳过)
弊端,无法直接使用,存在磁盘满了,磁盘坏了的问题
这里只讲讲操作的时候要注意的问题和给出最终代码(因为一点点去截过程太累了/(ㄒoㄒ)/~~)
(1)代码
@PostMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image ) throws IOException {
log.info("上传文件:{},{},{}",username,age,image);
String originalfilename=image.getOriginalFilename();
//构造不能重复的文件名
int index=originalfilename.lastIndexOf('.');
String exname=originalfilename.substring(index);
String newname= UUID.randomUUID().toString()+exname;
//将文件存储在磁盘目录中
image.transferTo(new File("D:\\BaiduNetdiskDownload\\images"+newname));
return Result.success();
}
(2)操作要注意的点
1,enctype
前端中,要设置为"multipart/form-data,不能采用默认格式,不然给出的只有文件名,没有文件的内容
2,调试
调试看细节的时候要设置断点,不然看不见图片上传的情况(因为结束后会被删除)
3,postman

这里key要和后端接受的名字一致(可能只有我会犯这个错误吧菜鸡ing)
2,上传到oss阿里云服务器
配置自己去看视频了,新用户有三个月免费试用,配置环境操作还是挺简单的

创建一个软件包,连接云服务器
内容如下,也可以直接在黑马资料上复制,如果直接复制的话,记得修改import包名,账号密码和bucket名字要改过来
package com.example.demo.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 = "yourid";
private String accessKeySecret = "yourkey";
private String bucketName = "name";
/**
* 实现上传图片到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("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
应为这里不属于conrol,mapper,service任意一类,所以要用comment
这里是control中的 内容
public class uploadControl {
@Autowired
private AliOSSUtils aliOSSUtils;
/*
将文件上传到阿里云服务器中
*/
@PostMapping("/upload")
public Result upload(MultipartFile image) throws IOException {
log.info("上传文件:{}",image);
//将文件上传到阿里云服务器中获取url
String url=aliOSSUtils.upload(image);
log.info("文件上传到阿里云服务器中获取url:{}",url);
//返回给前端
return Result.success(url);
}
至于为什么不在上传的时候,直接搞定,下面是ai的答案

六,修改员工
终于到最后一个了,我要摆烂了ing
比较简单,可以依照部门的修改来写,写一个根据id查询和一个修改,这里直接给代码,不分层了,不会可以康康
/*
根据id查询员工
*/
@GetMapping("/{id}")
public Result getByid(@PathVariable Integer id){
log.info("根据id查询员工:{}",id);
Emp emp=empService.getById(id);
return Result.success(emp);
}
/*
修改员工
*/
@PutMapping()
public Result update(@RequestBody Emp emp){
log.info("修改员工:{}",emp);
empService.update(emp);
return Result.success();
}
/*
根据id查询员工
*/
@Select("SELECT * FROM emp WHERE id = #{id}")
public Emp getById(Integer id);
/*
修改员工信息
*/
@Update("UPDATE emp SET username = #{username}, name = #{name}, gender = #{gender}, image = #{image}, job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId}, update_time = #{updateTime} WHERE id = #{id}")
public void update(Emp emp);
/*
根据id查询员工
*/
Emp getById(Integer id);
/*
修改员工信息
*/
void update(Emp emp);
/*
根据id查询员工
*/
@Override
public Emp getById(Integer id) {
Emp emp=empMapper.getById(id);
return emp;
}
/*
修改员工
*/
@Override
public void update(Emp emp) {
emp.setCreateTime(LocalDateTime.now());
empMapper.update(emp);
}
然后最后给出不同请求参数常见格式

希望大佬们能给个赞和收藏支持一下捏/(ㄒoㄒ)/~~,不对的也麻烦大佬指出


----员工管理&spm=1001.2101.3001.5002&articleId=146297070&d=1&t=3&u=1d8f136bea444f639282c00aa8ed42a5)
2743

被折叠的 条评论
为什么被折叠?



