黑马程序员JAVAweb入门(springboot)----员工管理

接上一篇内容,这一篇来讲员工管理的操作,具体环境搭建和项目配置看上一篇文章,这里就直接将项目的实现了

目录

一,类型封装(pageBean)

二,分页查询

1,实现效果

2,control层

3,Service层

4,Serviceimpl层

5,Mapper层

二,分页条件查询

1,实现效果

2,control层

4,serviceimpl层

5,mapper层

6,xml创建动态sql

下面是配置mabits环境下的xml

这里给出test的解释:

id的解释

resultType的解释

三,批量删除员工(这个比较简单,可以自己试试)

1,实现效果

2,control 层

3,Service层

4,Serviceimpl层

5,Mapper层

四,添加员工

1,实现效果

2,control层

3,service层

4,serviceimpl层

5,mapper层

6,postman测试josn类型

五,文件上传

1,上传到本地磁盘(可以选择跳过)

(1)代码

(2)操作要注意的点

1,enctype

2,调试

3,postman

2,上传到oss阿里云服务器

六,修改员工


一,类型封装(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 查询并自动添加分页参数,实现透明分页。以下是其核心功能和使用方法:

  

  1. 自动分页:在查询前调用分页方法,自动对后续查询添加 LIMIT/OFFSET 等分页参数。
  2. 支持多数据库:适配 MySQL、Oracle、SQL Server 等主流数据库的分页语法。
  3. 分页信息封装:通过 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ㄒ)/~~,不对的也麻烦大佬指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值