后端SpringBoot学习项目-用户管理-增删改查

最终代码结构

仓库地址
在这里插入图片描述

Entity文件

数据库表设计

在这里插入图片描述

entity层实现

文件创建

● 创建entity文件夹
● 在entity层创建Java类,名字为User (关键字不可使用)

代码实现
package com.example.drhtspringboot.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;
@Data
@TableName("user")
public class User {
    /**
     * 主键ID
     * */
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    /**
     * 用户名
     * */
    private String username;
    /**
     * 昵称
     * */
    private String nickname;
    /**
     * 密码
     * */
    private String password;
    /**
     * 性别
     * */
    private Integer gender;
    /**
     * 头像
     * */
    private String avatar;
    /**
     * 角色
     * */
    private Integer role;
    /**
     * 学历
     * */
    private Integer education;
    /**
     * 学校
     * */
    private String school;
    /**
     * 班级
     * */
    @TableField("banjiId")
    private Integer banjiId;
    /**
     * 创建时间
     * */
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @TableField("createdAt")
    private Date createdAt;
    /**
     * 更新时间
     * */
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @TableField("updatedAt")
    private Date updatedAt;
}

注解解释

@JsonFormat

目的是为了在接口请求数据返回时修改时间的返回格式

@Data

● 由Lombok库提供
● 会自动为实体类生成getter、setter、equals、hashCode和toString方法。

@TableName

● 指定实体类映射到数据库的具体表名

@TableId

● 标记实体类中的主键字段
● 设置一个复合主键时,可以使用 @TableId 注解的属性type来指定主键生成策略

@TableField

● 标记实体类中的字段与数据库表中的字段的映射关系
● 如果字段名和数据库列名相同,可以不用写 @TableField 注解

驼峰字段

如果数据表中的字段是驼峰形式,在接口方法查询数据时候驼峰形式字段会变为下划线形式(createdAt 变为 created_at),所以需要通过@TableField注解来使其保持一致

Mapper文件

mapper层实现

文件创建

● 创建mapper文件夹
● 在mapper层创建Java接口,名字为UserMapper

代码实现
package com.example.drhtspringboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.drhtspringboot.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

注解解释

BaseMapper

● MyBatis-Plus提供的一个泛型接口,包含了基础的增删改查等CRUD操作
● 可以简化对数据访问的开发

@Mapper

● 省略了xml文件的配置过程

service文件

初版实现暂不补充

controller文件

文件创建

● 创建controller文件夹
● 在controller层创建Java接口,名字为UserController

代码实现

请求结果类封装
package com.example.drhtspringboot.common;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
    private String code;
    private String msg;
    private T data;

    public Result(T data) {
        this.data = data;
    }

    public static Result success() {
        Result result = new Result<>();
        result.setCode("200");
        result.setMsg("成功");
        return result;
    }

    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>(data);
        result.setCode("200");
        result.setMsg("成功");
        result.setData(data);
        return result;
    }

    public static Result error(String code, String msg) {
        Result result = new Result<>();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

}

查询所有

没有任何查询参数,查询表中所有数据

/**
 * 获取用户列表
 * 通过请求映射 getList,处理获取用户列表的请求
 * 此方法使用 QueryWrapper 对象查询数据库中的所有用户,并返回查询结果
 * 如果查询结果不为空,则返回成功结果和用户列表,否则返回错误信息
 */
@RequestMapping("getListAll")
public Result<?> getListAll(){
    // 使用 QueryWrapper 进行查询,获取用户列表
    List<User> userList =  userMapper.selectList(new QueryWrapper<>());
    // 判断查询结果是否为空
    if(userList != null){
        // 查询成功,返回用户列表
        return Result.success(userList);
    } else {
        // 查询失败,返回错误信息
        return Result.error("500", "查询失败");
    }
}
分页查询

分页查询默认会出现一个问题: 查询出的数据records内容正常,但是total数量为0,需要进行一个插件的配置

  • 插件配置
package com.example.drhtspringboot.common;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MyBatisPlusConfig {

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

  • 分页接口实现
/**
     * 根据条件获取用户列表
     *
     * @param page 页码,指定从哪一页开始查询
     * @param size 每页大小,即每页返回的记录数
     * @param username 用户名,用于模糊查询
     * @param gender 性别,用于精确查询
     * @param role 角色ID,用于精确查询
     * @return 返回一个Result对象,包含查询结果或错误信息
     */
    @RequestMapping("getList")
    public Result<?> getList(Integer page,Integer size,String username,Integer gender,Integer role){
        // 创建Page对象,用于分页查询
        Page<User> userPage = new Page<>(page,size);

        // 创建QueryWrapper对象,用于构建查询条件
        QueryWrapper<User> qw = new QueryWrapper<>();
        if(StringUtils.isNotBlank(username)) {
            qw.like("username",username); // 模糊查询用户名
        }
        if(gender != null) {
            qw.eq("gender",gender); // 精确查询性别
        }
        if(role != null) {
            qw.eq("role", role); // 精确查询角色
        }
        // 执行分页查询
        IPage<User> userPageList = userMapper.selectPage(userPage,qw);
        // 判断查询结果是否为空
        if(userPageList != null) {
            return Result.success(userPageList); // 查询成功,返回结果
        } else {
            return Result.error("500", "查询失败"); // 查询失败,返回错误信息
        }
    }
新增用户
/**
 * 添加新用户
 *
 * @param user 用户对象,包含用户的基本信息
 * @return 插入操作的结果,成功或失败
 */
@PostMapping("addUser")
public Result<?> addUser(@RequestBody User user){
    // 设置用户创建时间和更新时间为当前时间
    user.setCreatedAt(new Date());
    user.setUpdatedAt(new Date());

    // 执行用户信息的插入操作
    int i = userMapper.insert(user);

    // 根据插入结果返回成功或失败的信息
    if(i > 0) {
        return Result.success();
    } else {
        // 查询失败,返回错误信息
        return Result.error("500", "新增失败");
    }
}
更新用户
/**
 * 处理用户更新请求
 * 该方法通过POST请求接收用户数据,并尝试在数据库中更新该用户的信息
 *
 * @param user 用户对象,包含要更新的用户信息
 * @return 返回更新操作的结果,成功或失败
 */
@PostMapping("updateUser")
public Result<?> updateUser(@RequestBody User user){
    // 根据用户ID更新用户信息
    int i = userMapper.updateById(user);
    // 判断更新操作是否成功
    if(i > 0) {
        // 如果更新成功,返回成功结果
        return Result.success();
    } else {
        // 如果更新失败,返回错误信息
        return Result.error("500", "更新失败");
    }
}
删除用户
/**
 * 删除用户信息
 * 该方法通过POST请求接收用户信息,并根据用户ID删除用户
 *
 * @param user 用户对象,包含要删除的用户ID
 * @return 删除操作的结果,如果删除成功返回成功结果,否则返回错误信息
 */
@PostMapping("delUser")
public Result<?> deleteUser(@RequestBody User user){
    // 根据用户ID删除用户信息
    int i = userMapper.deleteById(user.getId());
    // 判断删除操作是否成功
    if(i > 0) {
        // 如果删除成功,返回成功结果
        return Result.success();
    } else {
        // 如果删除失败,返回错误信息
        return Result.error("500", "删除失败");
    }
}

整体代码

package com.example.drhtspringboot.contoller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.drhtspringboot.common.Result;
import com.example.drhtspringboot.entity.User;
import com.example.drhtspringboot.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserMapper userMapper;

    /**
     * 根据条件获取用户列表
     *
     * @param page 页码,指定从哪一页开始查询
     * @param size 每页大小,即每页返回的记录数
     * @param username 用户名,用于模糊查询
     * @param gender 性别,用于精确查询
     * @param role 角色ID,用于精确查询
     * @return 返回一个Result对象,包含查询结果或错误信息
     */
    @RequestMapping("getList")
    public Result<?> getList(Integer page,Integer size,String username,Integer gender,Integer role){
        // 创建Page对象,用于分页查询
        Page<User> userPage = new Page<>(page,size);

        // 创建QueryWrapper对象,用于构建查询条件
        QueryWrapper<User> qw = new QueryWrapper<>();
        if(StringUtils.isNotBlank(username)) {
            qw.like("username",username); // 模糊查询用户名
        }
        if(gender != null) {
            qw.eq("gender",gender); // 精确查询性别
        }
        if(role != null) {
            qw.eq("role", role); // 精确查询角色
        }
        // 执行分页查询
        IPage<User> userPageList = userMapper.selectPage(userPage,qw);
        // 判断查询结果是否为空
        if(userPageList != null) {
            return Result.success(userPageList); // 查询成功,返回结果
        } else {
            return Result.error("500", "查询失败"); // 查询失败,返回错误信息
        }
    }
    /**
     * 获取用户列表
     * 通过请求映射 getList,处理获取用户列表的请求
     * 此方法使用 QueryWrapper 对象查询数据库中的所有用户,并返回查询结果
     * 如果查询结果不为空,则返回成功结果和用户列表,否则返回错误信息
     */
    @RequestMapping("getListAll")
    public Result<?> getListAll(){
        // 使用 QueryWrapper 进行查询,获取用户列表
        List<User> userList =  userMapper.selectList(new QueryWrapper<>());
        // 判断查询结果是否为空
        if(userList != null){
            // 查询成功,返回用户列表
            return Result.success(userList);
        } else {
            // 查询失败,返回错误信息
            return Result.error("500", "查询失败");
        }
    }


    /**
     * 添加新用户
     *
     * @param user 用户对象,包含用户的基本信息
     * @return 插入操作的结果,成功或失败
     */
    @PostMapping("addUser")
    public Result<?> addUser(@RequestBody User user){
        // 设置用户创建时间和更新时间为当前时间
        user.setCreatedAt(new Date());
        user.setUpdatedAt(new Date());

        // 执行用户信息的插入操作
        int i = userMapper.insert(user);

        // 根据插入结果返回成功或失败的信息
        if(i > 0) {
            return Result.success();
        } else {
            // 查询失败,返回错误信息
            return Result.error("500", "新增失败");
        }
    }

    /**
     * 删除用户信息
     * 该方法通过POST请求接收用户信息,并根据用户ID删除用户
     *
     * @param user 用户对象,包含要删除的用户ID
     * @return 删除操作的结果,如果删除成功返回成功结果,否则返回错误信息
     */
    @PostMapping("delUser")
    public Result<?> deleteUser(@RequestBody User user){
        // 根据用户ID删除用户信息
        int i = userMapper.deleteById(user.getId());
        // 判断删除操作是否成功
        if(i > 0) {
            // 如果删除成功,返回成功结果
            return Result.success();
        } else {
            // 如果删除失败,返回错误信息
            return Result.error("500", "删除失败");
        }
    }

    /**
     * 处理用户更新请求
     * 该方法通过POST请求接收用户数据,并尝试在数据库中更新该用户的信息
     *
     * @param user 用户对象,包含要更新的用户信息
     * @return 返回更新操作的结果,成功或失败
     */
    @PostMapping("updateUser")
    public Result<?> updateUser(@RequestBody User user){
        // 根据用户ID更新用户信息
        int i = userMapper.updateById(user);
        // 判断更新操作是否成功
        if(i > 0) {
            // 如果更新成功,返回成功结果
            return Result.success();
        } else {
            // 如果更新失败,返回错误信息
            return Result.error("500", "更新失败");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为入围Linux 内核CVE 检视“五人团”,openEuler要再进阶?

背景&#xff1a;内核社区接管 Linux 社区漏洞发布 往年 Linux 内核漏洞发布存在来源不固定、覆盖不全面&#xff0c;有时发布无修复补丁的 CVE 从而形成 0-day 漏洞等问题&#xff0c;给 Linux 内核安全带来了不确定性&#xff0c;为了更规范化运作&#xff0c;2024 年 2 月 1…

【C语言指南】C语言内存管理 深度解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C语言指南》 期待您的关注 引言 C语言是一种强大而灵活的编程语言&#xff0c;为程序员提供了对内存的直接控制能力。这种对内存…

12 Node.js API接口开发

八、API接口 8.1 json-server工具 1&#xff09;安装json-server npm i -g json-server2)示例 //students.json {"student":[{"id":1,"name":"sally","age":18,"gender":"女"},{"id":2,&…

前段时间我所在的公司收到了来自Nevicat的律师函

前段时间我所在的公司收到了来自Nevicat的律师函&#xff0c;至于原因嘛&#xff0c;大家懂的都懂。肯定是因为没有购买人家的正版软件&#xff0c;于是公司下令&#xff0c;所有人禁止继续使用Nevicat自行寻找其他sql工具&#xff0c;迫于无奈&#xff0c;在我使用了十几款主流…

【系统设计】理解带宽延迟积(BDP)、吞吐量、延时(RTT)与TCP发送窗口的关系:优化网络性能的关键

在设计和优化网络性能时&#xff0c;理解 带宽延迟积&#xff08;BDP&#xff09;、吞吐量、延时&#xff08;RTT&#xff09; 和 TCP发送窗口 之间的关系至关重要。这些概念相互影响&#xff0c;决定了网络连接的性能上限&#xff0c;尤其是在高带宽、高延迟的环境中&#xff…

微服务容器化部署实践(FontConfiguration.getVersion)

文章目录 前言一、整体步骤简介二、开始实战1.准备好微服务2.将各个微服务打包为镜像第一种第二种3. 将各个打包好的镜像,通过docker-compose容器编排,运行即可总结前言 docker容器化部署微服务: 将微服务容器化部署到 Docker 容器中是一个常见的做法,可以提高应用的可移…

如何监控员工上网行为?五大妙招轻松上手,员工上网监控全攻略!挖到宝啦!

如何监控员工上网行为&#xff1f; 员工的不当上网行为不仅有可能导致企业机密的泄露&#xff0c;还可能对工作效率造成显著影响。 因此&#xff0c;如何有效地监控员工的上网行为&#xff0c;已成为许多企业管理者关注的重点。 本文&#xff0c;将为您介绍五大妙招&#xff…

【C++ 算法进阶】算法提升十一 十二

目录标题 让字符串成为回文串的最少插入次数题目题目分析代码题目题目 字符子串 &#xff08;滑动窗口&#xff09;题目题目分析代码 最长连续子序列 &#xff08;头尾表&#xff09;题目题目分析代码 让字符串成为回文串的最少插入次数 题目 本题为为LC原题 题目如下 题目分…

Linux(CentOS)安装 MySQL

CentOS版本&#xff1a;CentOS 7 三种安装方式&#xff1a; 一、通过 yum 安装&#xff0c;最简单&#xff0c;一键安装&#xff0c;全程无忧。 二、通过 rpm 包安装&#xff0c;需具备基础概念及常规操作。 三、通过 gz 包安装&#xff0c;需具备配置相关操作。 --------…

6.1 软件测试:软件质量与测试

软件质量与测试 1、软价质量保证1.1 软件质量质量控制QC&#xff1a;QUALITY CONTROL质量保证QA:QUALITY ASSURANCE质量成本软件质量软件质量保证 1.2 软件评审1.3 软件可靠性 2、软件测试2.1 软件测试过程模型软件测试策略软件测试策略V模型回归测试软件测试策略原则软件测试策…

JavaEE进阶---SpringMVC(二)请求里面十种参数类型

文章目录 1.请求1.1接受单个参数的请求1.2多个参数的传递1.3传递对象1.4参数重命名1.5设置参数是非必传的1.6数组的请求方式1.7如何传递集合1.8传递json数据1.9获取url里面的参数1.10获取文件 1.请求 1.1接受单个参数的请求 下面的这个就是我们的项目代码&#xff0c;都是单个…

FIPS203 后量子安全ML-KEM(标准简读)

FIPS 203是美国国家标准与技术研究院&#xff08;NIST&#xff09;发布的关于模块格基密钥封装机制&#xff08;ML-KEM&#xff09;的标准&#xff0c;旨在提供一种能抵御量子计算机攻击的密钥建立方案。以下是对该文档的详细总结&#xff1a; 标准概述 目的与范围&#xff…

Android GPU纹理数据拷贝

在 Android 开发中读取纹理数据有以下几种方法&#xff1a; glReadPixelsImageReaderPBO&#xff08;Pixel BufferObject&#xff09; HardwareBuffer 1. glReadPixels glReadPixels 是 OpenGL ES 的 API&#xff0c;通常用于从帧缓冲区中读取像素数据&#xff0c;OpenGL ES…

NVM切换本地node版本

1、下载nvm https://github.com/coreybutler/nvm-windows/releases nvm-windows 然后点击nvm-setup.exe下载&#xff0c;尽可能都选择默认安装选项 2、nvm常用命令 使用以下命令安装特定版本的 Node.js&#xff1a; nvm install <version> nvm install 14.17.0 使…

GNN系统学习:消息传递图神经网络

引言 在开篇中我们介绍了&#xff0c;为节点生成节点表征&#xff08;Node Representation&#xff09;是图计算任务成功的关键&#xff0c;我们要利用神经网络来学习节点表征。 消息传递范式是一种聚合邻接节点信息来更新中心节点信息的范式&#xff0c;它将卷积算子推广到了…

C语言 | Leetcode C语言题解之第554题砖墙

题目&#xff1a; 题解&#xff1a; struct HashTable {int key, val;UT_hash_handle hh; };int leastBricks(int** wall, int wallSize, int* wallColSize) {struct HashTable* cnt NULL;for (int i 0; i < wallSize; i) {int n wallColSize[i];int sum 0;for (int j …

全文检索ElasticSearch到底是什么?

学习ElasticSearch之前&#xff0c;我们先来了解一下搜索 1 搜索是什么 ① 概念&#xff1a;用户输入想要的关键词&#xff0c;返回含有该关键词的所有信息。 ② 场景&#xff1a; ​ 1互联网搜索&#xff1a;谷歌、百度、各种新闻首页&#xff1b; ​ 2 站内搜索&#xff…

【C++】vector模拟实现、迭代器失效问题(超详解)

vector会使用之后我们来模拟实现一下&#xff0c;通过对vector的模拟实现&#xff0c;我们来说一下迭代器失效问题。 1.准备工作 在头文件vector.h里声明和实现函数&#xff0c;然后在test.cpp里测试代码的正确性。 在vector.h中用命名空间分隔一下&#xff0c;因为c库里面也有…

前端CSS3 渐变详解

文章目录 CSS3 渐变详解一、引言二、CSS3 渐变基础1、线性渐变1.1、基本线性渐变1.2、改变渐变方向 2、径向渐变2.1、基本径向渐变2.2、设置径向渐变的中心 三、高级渐变技巧1、重复渐变1.1、重复线性渐变1.2、重复径向渐变 四、总结 CSS3 渐变详解 一、引言 在现代网页设计中…

Docker学习—Docker的安装与使用

Docker安装 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.配置Docker的yum库 首先…