SpringBoot项目实现增删改查

2023-11-12

接上一章:Java 连接MySql_原你是阳光(#`O′)的博客-CSDN博客,实现单表增删改查

引入依赖

<dependencies>
    <!-- springmvc的场景启动器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.5</version>
    </dependency>

    <!-- MySQL驱动包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>

    <!-- Mybatis的场景启动器 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.2</version>
    </dependency>

    <!-- 单元测试场景启动器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>2.6.5</version>
    </dependency>
</dependencies>

application.yml配置


server:
  #端口号
  port: 9527
spring:
  #数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
# MyBatis配置
mybatis:
  mapper-locations: com/thk/mapper/*Mapper.xml
 

实体类:


public class People {
    /**
     * id
     */
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 地址
     */
    private String address;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "People{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
    
}

生成id雪花算法工具类

package com.thk.utils;

/**
 * 分布式唯一ID 雪花算法实现
 */
public class SnowFlake {
    /**
     * 起始的时间戳  
     */
    private final static long START_TIMESTAMP = 1593446400L;

    /**
     * 每一部分占用的位数
     */
    private final static long SEQUENCE_BIT = 12; //序列号占用的位数
    private final static long MACHINE_BIT = 5;   //机器标识占用的位数
    private final static long DATA_CENTER_BIT = 5;//数据中心占用的位数

    /**
     * 每一部分的最大值
     */
    private final static long MAX_DATA_CENTER_NUM = -1L ^ (-1L << DATA_CENTER_BIT);
    private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
    private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);

    /**
     * 每一部分向左的位移
     */
    private final static long MACHINE_LEFT = SEQUENCE_BIT;
    private final static long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
    private final static long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT;

    /**
     * 数据中心编码,初始化后不可修改
     * 最大值: 2^5-1 取值范围: [0,31]
     */
    private long dataCenterId;

    /**
     * 机器或进程编码,初始化后不可修改
     * 最大值: 2^5-1 取值范围: [0,31]
     */
    private long machineId;

    /**
     * 序列号
     * 最大值: 2^12-1 取值范围: [0,4095]
     */
    private long sequence = 0L;

    private long lastStamp = -1L;//上一次时间戳

    public SnowFlake(long dataCenterId, long machineId) {
        if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) {
            throw new IllegalArgumentException("dataCenterId can't be greater than MAX_DATA_CENTER_NUM or less than 0");
        }
        if (machineId > MAX_MACHINE_NUM || machineId < 0) {
            throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");
        }
        this.dataCenterId = dataCenterId;
        this.machineId = machineId;
    }

    /**
     * 产生下一个ID
     *
     * @return
     */
    public synchronized long nextId() {
        //获取当前时间戳 可用System.currentTimeMillis(); 方法替换
        long currStamp = getNewStamp();
        //保证当前时间戳不小于最后一次的时间戳
        if (currStamp < lastStamp) {
            throw new RuntimeException("Clock moved backwards.  Refusing to generate id");
        }
        //如果当前时间戳等于最后一次时间戳 就进行序号递增
        if (currStamp == lastStamp) {
            //相同毫秒内,序列号自增
            sequence = (sequence + 1) & MAX_SEQUENCE;
            //同一毫秒的序列数已经达到最大
            if (sequence == 0L) {
                currStamp = getNextMill();
            }
        } else {
            //不同毫秒内,序列号置为0
            sequence = 0L;
        }
        //保存最后一次时间戳
        lastStamp = currStamp;
        //通过位运算,将相应的二进制数值放到对应的位置  41位时间戳 + 5位数据中心 + 5位机器码 + 12位序列号 ,首位没有使用
        return (currStamp - START_TIMESTAMP) << TIMESTAMP_LEFT //时间戳部分
                | dataCenterId << DATA_CENTER_LEFT       //数据中心部分
                | machineId << MACHINE_LEFT             //机器标识部分
                | sequence;                             //序列号部分
    }

    private long getNextMill() {
        //获取当前时间戳
        long mill = getNewStamp();
        //获取大于上一次时间戳的时间戳
        while (mill <= lastStamp) {
            mill = getNewStamp();
        }
        return mill;
    }

    /**
     * 获取当前时间戳
     */
    private long getNewStamp() {
        return System.currentTimeMillis();
    }

}

controller

package com.thk.controller;

import com.thk.domain.People;
import com.thk.service.IPeopleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.websocket.server.PathParam;
import java.util.List;

@RestController
public class PeopleController {
    @Autowired
    private IPeopleService peopleService;

    /**
     * 查询全部用户
     *
     * @param people
     * @return
     */
    @GetMapping("/selectAll")
    public List<People> selectAll(People people) {
        return peopleService.selectAll(people);
    }

    /**
     * 增加用户或者修改用户
     *
     * @param people
     * @return
     */
    @PostMapping("/people")
    public int people(@RequestBody People people) throws Exception {
        return peopleService.people(people);
    }

    /**
     * 根据id查询一条数据
     *
     * @param id
     * @return
     */
    @GetMapping("/selectOne/{id}")
    public People selectOne(@PathVariable Long id) {
        return peopleService.selectOne(id);
    }

    /**
     * 删除数据
     * @param id
     * @return
     */
    @DeleteMapping("/delPeople/{id}")
    public int delPeople(@PathVariable Long id) throws Exception{
        return peopleService.delPeople(id);
    }

}

service

public interface IPeopleService {
    /**
     * 查询全部用户
     *
     * @param people
     * @return
     */
    List<People> selectAll(People people);

    /**
     * 增加用户或者修改用户
     *
     * @param people
     * @return
     */
    int people(People people) throws Exception;

    /**
     * 根据id查询一条数据
     *
     * @param id
     * @return
     */
    People selectOne(Long id);

    /**
     * 删除数据
     * @param id
     * @return
     */
    int delPeople(Long id) throws Exception;
}

service实现类:

@Service
public class PeopleImpl implements IPeopleService {
    @Autowired
    private PeopleMapper peopleMapper;

    /**
     * 查询全部用户
     *
     * @param people
     * @return
     */
    @Override
    public List<People> selectAll(People people) {
        return peopleMapper.selectAll(people);
    }

    /**
     * 增加用户或者修改用户
     *
     * @param people
     * @return
     */
    @Override
    public int people(People people) throws Exception {
        //判断id是否为空,如果为空就是添加
        if (StringUtils.isEmpty(people.getId())) {
            SnowFlake snowFlake = new SnowFlake(2, 3);
            long l = snowFlake.nextId();
            //设置id
            people.setId(l);
            System.out.println("添加的id是" + l);
            //添加数据
            return peopleMapper.addPeople(people);

        } else {
            //如果id不为空,就是修改
            //到数据库查询是否存在这条数据,如果不存在抛出异常
            People people1 = peopleMapper.selectOne(people.getId());
            if (people1 == null) {
                throw new Exception("修改的数据不存在!!!");
            }
            //修改数据
            return peopleMapper.updatePeople(people);
        }
    }

    /**
     * 根据id查询一条数据
     *
     * @param id
     * @return
     */
    @Override
    public People selectOne(Long id) {
        return peopleMapper.selectOne(id);
    }

    /**
     * 删除数据
     *
     * @param id
     * @return
     */
    @Override
    public int delPeople(Long id) throws Exception {
        if (id != null) {
            People people = peopleMapper.selectOne(id);
            if (people != null) {
                //删除数据
                return peopleMapper.delPeople(id);
            } else {
                throw new Exception("修改的数据不存在!!!");
            }
        } else {
            throw new Exception("数据异常!!!");
        }

    }
}

mapper接口

@Mapper
public interface PeopleMapper {
    /**
     * 查询全部用户
     *
     * @param people
     * @return
     */
    List<People> selectAll(People people);

    /**
     * 根据id查询一条数据
     *
     * @param id
     * @return
     */
    People selectOne(Long id);

    /**
     * 添加数据
     *
     * @param people
     * @return
     */
    int addPeople(People people);

    /**
     * 修改数据
     *
     * @param people
     * @return
     */
    int updatePeople(People people);

    /**
     * 删除数据
     *
     * @param id
     * @return
     */
    int delPeople(Long id);
}

mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.thk.mapper.PeopleMapper">
    <!--查询全部数据-->
    <select id="selectAll" resultType="com.thk.domain.People">
        SELECT  * FROM  people
    </select>
    <!--根据id查询一条数据-->
    <select id="selectOne" resultType="com.thk.domain.People">
        SELECT  * FROM  people where  id =#{id}
    </select>
    <!--添加一条数据-->
    <insert id="addPeople">
        insert  into people(id,name,age,address) values (#{id},#{name},#{age},#{address})
    </insert>
    <!--修改数据-->
    <update id="updatePeople">
        update people
        <trim prefix="SET" suffixOverrides=",">
            <if test="name != null and name != ''">name = #{name},</if>
            <if test="age != null">age = #{age},</if>
            <if test="address != null and address != ''">address = #{address},</if>
        </trim>
        where id = #{id}
    </update>
    <!--删除数据-->
    <delete id="delPeople">
         delete from
        people
        where id =#{id}
    </delete>
</mapper>

启动程序:

测试添加数据

运行结果:

日志打印:

测试修改数据:

 运行结果:

原数据:

修改后:

 日志打印:

测试查询一条数据

运行结果:

 删除数据

运行结果:

打印日志

查询全部数据,发现添加的数据已经被删除了

以上就是数据库单表额CRUD

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot项目实现增删改查 的相关文章

  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur

随机推荐

  • 第十二讲:生成树概念及STP技术应用

    在传统的交换网络中 设备通过单条链路进行连接 当某一个点或是某一个链路发生故障时可能导致网络无法访问 解决这种问题的办法是在网络中提供冗余链路 但是交换机网络中的冗余链路会产生广播风暴 MAC地址失效等现象 最终出现的结果就是网络瘫痪 为避
  • 如何一眼分辨是C还是C++

    C语言的历史 C语言是由贝尔实验室的Dennis Ritchie在20世纪70年代初开发的一种通用程序设计语言 在早期的计算机时代 许多计算机使用不同的汇编语言编写程序 这导致了程序的可移植性和代码的可重用性很低 因此 Dennis Rit
  • markdown模板(个人使用)

    头部1 博客标签规定 文章目录 一 常用可以内嵌的HTML标签 一 标题 知识点 知识点 二 图片 三 字体 五 表格 六 锚链接 七 Typora中的技巧 一 常用可以内嵌的HTML标签
  • 编译原理第二版3.4答案

    3 4 节的练习 3 4 1 给出识别练习 3 3 2 中各个正则表达式所描述的语言状态转换图 解答 解答步骤 NFA gt DFA gt 最少状态的 DFA 状态转换图 a a b a NFA DFA NFA DFA a b 0 A B
  • 报错: 登录异常:Could not read JSON: Could not resolve type id ‘com.macro.mall.tiny.modules.ums.model.UmsAd

    全部报错信息 登录异常 Could not read JSON Could not resolve type id com macro mall tiny modules ums model UmsAdmin as a subtype of
  • 无法登录到你的账户,通常可以通过从你的账户注销,然后重新登录

    1 点击 系统属性 2 点击 高级系统设置 3 点击 高级 点击用户配置文件的设置 删除指定的用户账号 重启才能登录账号
  • C++ 标识符

    标识符 lt cpp language 一个标识符是一个由数字 下划线 小写和大写拉丁字母 和大多数 Unicode 字符 见下文的详细说明 组成的任意长度的序列 有效的标识符必须以一个非数字字符 拉丁语字母 下划线或 Unicode 非数
  • java 事件监听connection_java 事件监听

    事件监听实现 三要素 1 事件源 数据源 要处理的数据 2 事件 承载数据 传递信息并被监听 3 监听器 负责对数据的业务处理 该开发用例采用了Spring的事件监听 1 定义事件类型 public class MyEvent extend
  • unity——Rigidbody类 (刚体)

    unity Rigidbody类 刚体 博客分类 unity3d unity Rigidbody类 转载自 http hi baidu com quibos item 0b035e15e63041b499ce33d8 游戏对象添加Rigid
  • mybatis源码,从配置到 mappedStatement —— mapper.xml 是如何被解析的?

    个人博客导航页 点击右侧链接即可打开个人博客 大牛带你入门技术栈 Ext1 本文源码解析基于 mybatis spring boot starter 2 1 1 即 mybatis 3 5 3 版本 Ext2 本文主要是对源码的讲解 着重点
  • 学习入门 MQTT 协议原理与应用场景

    学习认识 MQTT 协议 掌握学习MQTT协议 本文章学习借鉴于太极创客团队 以表感谢 官网http www taichi maker com 文章目录 学习认识 MQTT 协议 一 MQTT是什么 1 MQTT版本 二 MQTT基本原理
  • 【计算机技术】我用两句话在电脑课上解除了老师的控制

    前言 时光荏苒 日月如梭 转眼间暑假就过完了 我又回到了校园的怀抱 不过这不重要 在语数外之余 我每周还是有两节电脑课的 但是 事情远没有我想的这样美好 就在我满怀期待的准备一展身手 啪 很快啊 美好的一节电脑课从被老师控制结束 要是放在以
  • 机器学习——sklearn转换器和预估器(估计器)

    这里写目录标题 学习目标 1 转换器 特征工程的父类 2 预估器 估计器 estimator 学习目标 目标 知道sklearn的转换器和预估器的执行流程 内容预览 转化器 预估器 估计器 sklearn机器学习算法的实现 1 转换器 特征
  • webpack打包用的cdn,速度明显加快,只要10秒不到,全部import需要近一分钟,--最终算是彻底失败-axios

  • Swin-Unet模型代码详解及改进思路

    Swim unet是针对水下图像分割任务提出的一种模型结构 其基于U Net模型并加入了Swin Transformer模块 可以有效地解决水下图像分割中的光照不均匀 噪声干扰等问题 Swim unet模型代码详解 首先 在导入必要的库后
  • 虚拟化磁盘模式、数据存储详解

    虚拟化磁盘模式 数据存储详解 1 配置模式 1 1 普通 1 2 普通延迟置零 1 3 精简 2 磁盘模式 2 1 从属 2 2 独立 持久 2 3 独立 非持久 3 数据存储 3 1 虚拟化类型数据存储 3 2 非虚拟化类型数据存储 3
  • Web和HTTP

    目录 HTTP概况 Web术语 HTTP基本 HTTP是无状态协议 HTTP连接方式 非持续连接HTTP 例子 花费时间 持续连接的HTTP 非持续的缺点 HTTP报文格式 请求报文 HTTP请求报文的通用格式 及GET POST HEAD
  • 性能测试基础

    性能测试基础知识 性能测试的定义 衡量软件的性能需要考虑的三点内容 性能测试的分类 压力测试 负载测试 容量测试 强度测试 配置测试 基准测试 并发测试 性能指标 响应时间 吞吐量 服务器资源占用 以下内容比较枯燥 但是作为基础无法绕开 就
  • Kuebernetes之DaemonSet

    DaemonSet确保集群中每个 部分 node运行一份pod副本 当node加入集群时创建pod 当node离开集群时回收pod 如果删除DaemonSet 其创建的所有pod也被删除 DaemonSet中的pod覆盖整个集群 当需要在集
  • SpringBoot项目实现增删改查

    接上一章 Java 连接MySql 原你是阳光 O 的博客 CSDN博客 实现单表增删改查 引入依赖