【Java】SpringBoot实现MySQL数据库的增删查改

news2024/10/25 17:30:38

目录

1. 项目介绍

2. 相关代码

2.1 项目配置

2.2 SQL语句

2.3 数据访问层

2.4 业务逻辑层

2.5 Web表现层

3. 结果展示

4. 源码获取


1. 项目介绍

SpringBoot是一个轻量级框架,简化了Spring应用的开发和配置。相比较SSM框架,极大的简化了SSM中XML的配置。本项目基于SpringBoot框架,实现使用在HTML页面中对数据库中数据进行简单的操作。

2. 相关代码

2.1 项目配置

(1)Maven依赖配置

文件名:pom.xml

<!--Spring Data JPA-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--Thymeleaf-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--Spring Web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</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>
<!--Bootstrap-->
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
    <version>5.3.3</version>
</dependency>
<!--SpringBoot 测试-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

(2)SpringBoot配置

文件名:application.properties

spring.application.name=SpringBoot-CRUD
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.open-in-view=false

2.2 SQL语句

文件名:建表语句.sql

# 数据库
create database if not exists springboot;
use springboot;
# 数据表
create table user
(
    id   int auto_increment primary key,
    name varchar(255)     not null,
    age  tinyint unsigned not null
);
# 初始化数据
insert into user
values (null, '张三', 22),
       (null, '李四', 23),
       (null, '王五', 21)

2.3 数据访问层

(1)实体类

文件名:User.java

//实体类(Entity)
package pers.kenneth.springbootcrud.entity;

import jakarta.persistence.*;
import lombok.Data;

@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "age")
    private Integer age;
}

(2)数据访问对象

文件名:UserRepository.java

//数据访问对象(Repository)
package pers.kenneth.springbootcrud.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import pers.kenneth.springbootcrud.entity.User;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

2.4 业务逻辑层

(1)业务逻辑层接口

文件名:UserService.java

//业务逻辑层接口
package pers.kenneth.springbootcrud.service;

import pers.kenneth.springbootcrud.entity.User;
import java.util.List;
import java.util.Optional;

public interface UserService {
    //获取全部数据
    List<User> getAllUsers();

    //通过ID查找
    Optional<User> getUserById(Long id);

    //保存数据
    User saveUser(User user);

    //删除数据
    void deleteUser(Long id);
}

(2)服务类

文件名:UserServiceImpl.java

//服务类(Service)
package pers.kenneth.springbootcrud.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pers.kenneth.springbootcrud.entity.User;
import pers.kenneth.springbootcrud.repository.UserRepository;
import java.util.List;
import java.util.Optional;

@Service
public class UserServiceImpl implements UserService {

    //业务逻辑层调用数据访问层
    private final UserRepository userRepository;

    //构造方法
    @Autowired
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    //获取全部数据
    @Override
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    //通过ID查找
    @Override
    public Optional<User> getUserById(Long id) {
        return userRepository.findById(id);
    }

    //保存数据
    @Override
    public User saveUser(User user) {
        return userRepository.save(user);
    }

    //删除数据
    @Override
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}

2.5 Web表现层

(1)控制器

文件名:UserController.java

//控制器(Controller)
package pers.kenneth.springbootcrud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import pers.kenneth.springbootcrud.entity.User;
import pers.kenneth.springbootcrud.service.UserService;

@Controller
@RequestMapping("/users")  //访问:http://localhost:8080/users
public class UserController {
    //controller层调用业务逻辑层
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    // 获取全部数据
    @GetMapping
    public String listUsers(Model model) {
        model.addAttribute("users", userService.getAllUsers());
        System.out.println(model.getAttribute("users"));
        return "users";
    }

    //通过ID查找,点击进入更新数据界面
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id, Model model) {
        model.addAttribute("user", userService.getUserById(id).orElse(null));
        return "update-user";
    }

    //点击进入添加数据界面(并传递一个初始化的user对象)
    @GetMapping("/add")
    public String addUser(Model model) {
        model.addAttribute("user", new User());
        return "add-user";
    }

    //更改之后保存数据
    @PostMapping
    public String saveUser(User user) {
        userService.saveUser(user);
        return "redirect:/users";
    }

    //删除之后保存数据
    @GetMapping("/delete/{id}")
    public String deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        return "redirect:/users";
    }
}

(2)用户数据页面

文件名:users.html

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta charset="UTF-8">
    <!--bootstrap框架-->
    <link rel="stylesheet" href="/webjars/bootstrap/5.3.3/css/bootstrap.min.css">
    <script src="/webjars/bootstrap/5.3.3/js/bootstrap.min.js"></script>
    <title>用户</title>
</head>
<body>
<div class="container">
    <table class="table table-striped table-hover table-bordered">
        <thead>
        <tr>
            <th scope="col">ID</th>
            <th scope="col">姓名</th>
            <th scope="col">年龄</th>
            <th scope="col">操作</th>
        </tr>
        </thead>
        <tbody class="table-group-divider">
        <tr th:each="user : ${users}">
            <td th:text="${user.id}"></td>
            <td th:text="${user.name}"></td>
            <td th:text="${user.age}"></td>
            <td>
                <a th:href="@{/users/delete/{id}(id=${user.id})}">删除</a>
                <a th:href="@{/users/{id}(id=${user.id})}">更改</a>
            </td>
        </tr>
        </tbody>
    </table>
    <a href="/users/add">添加用户</a>
</div>
</body>
</html>

(3)添加数据页面

文件名:add-user.html

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加用户</title>
</head>
<body>
<form action="/users" method="post">
    <input type="hidden" name="id" th:value="${user.id}">
    姓名:<input type="text" name="name" th:value="${user.name}"><br>
    年龄:<input type="text" name="age" th:value="${user.age}"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

(4)更改数据页面

文件名:update-user.html

<!doctype html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta charset="UTF-8">
    <title>更新用户</title>
</head>
<body>
<form action="/users" method="post">
    <input type="hidden" name="id" th:value="${user.id}">
    姓名:<input type="text" name="name" th:value="${user.name}"><br>
    年龄:<input type="text" name="age" th:value="${user.age}"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

3. 结果展示

(1)用户数据页面

(2)添加数据页面

(3)更改数据页面

4. 源码获取

GitHub:https://github.com/KennethCreative/SpringBoot-CRUD.git

Gitee:https://gitee.com/KennethCreative/SpringBoot-CRUD.git

# GitHub
git clone https://github.com/KennethCreative/SpringBoot-CRUD.git
# Gitee
git clone https://gitee.com/KennethCreative/SpringBoot-CRUD.git

若有不妥之处,恳请读者批评指正

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Navigation传递复杂参数(自定义)

打开要添加参数的navigation文件 使用Design视图 点击右侧Arguments的添加("")按钮 根据自定义类所继承的序列化接口选择这两项其中的一个 选择或者在搜索框检索你的类&#xff0c;然后点击OK&#xff0c;回到前一界面点击ADD即可 其他的操作就跟基本类型用法一样了

C++中指针类型、引用类型、值类型

定义&#xff1a; 1. 带 * 的声明&#xff1a;指针类型 声明方式&#xff1a;MyClass* obj; 是一个 指针类型&#xff0c;表示 obj 是一个指针&#xff0c;可以指向 MyClass 类型的对象。 指针特点&#xff1a; 指针存储的是对象的地址&#xff0c;可以为空&#xff08;null…

新的Midjourney就是一个增强版的Photoshop,你现在可以轻松的用它换衣服、换发型了

好久没有聊 Midjourney 了&#xff0c;昨晚他们发布了一项引人注目的新功能&#xff1a;AI 图像编辑&#xff0c;一个基于网页的加强版的 Photoshop 呼之欲出&#xff0c;让我大为震撼&#xff0c;也让用户们赞叹不已。 基于现有图像进行参考&#xff0c;进而生成新的图片&…

谈一谈 Netty 的内存管理 —— 且看 Netty 如何实现 Java 版的 Jemalloc

本文基于 Netty 4.1.112.Final 版本进行讨论 在之前的 Netty 系列中&#xff0c;笔者是以 4.1.56.Final 版本为基础和大家讨论的&#xff0c;那么从本文开始&#xff0c;笔者将用最新版本 4.1.112.Final 对 Netty 的相关设计展开解析&#xff0c;之所以这么做的原因是 Netty 的…

学习--四元数介绍

2022年的草稿箱里的一篇 四元数由William Rowan Hamilton发现 定义与复数类似&#xff0c;有三个虚部 q a b i c j d k qabicjdk qabicjdk 其中 i 2 j 2 k 2 i j k − 1 i^2j^2k^2ijk-1 i2j2k2ijk−1 四元数的模长&#xff1a; 四维的长度 加减法&#xff1a; 对应分…

十年编程路,一生踏征途

时光荏苒流逝&#xff0c;白驹匆匆过隙&#xff0c;不知不觉间&#xff0c;我已经在程序开发这条道路上走过了整整十年。从最初的求学&#xff0c;到如今成为一名较为资深的职业开发者&#xff0c;这一路充满了挑战、学习、成长与感动。在这1024程序员节的特殊时刻&#xff0c;…

信息安全工程师(69)数字水印技术与应用

前言 数字水印技术是一种在数字媒体中嵌入特定信息的技术&#xff0c;这些信息可以是版权信息、元数据等。 一、数字水印技术的定义与原理 数字水印技术&#xff08;Digital Watermarking&#xff09;是将一些标识信息&#xff08;即数字水印&#xff09;直接嵌入数字载体&…

发布者Publisher、订阅者Subscriber的编程实现+自定义话题消息编程实现

1.发布者Publisher的编程实现 1.创建功能包 cd ~/catkin_ws/src catkin_create_pkg learning_topic rospy roscpp std_msgs geometry_msgs turtlesim 2.创建发布者代码&#xff08;C&#xff09; ——文件名为velocity_publisher.cp /*************************************…

【Vue】word / excel / ppt / pdf / 视频(mp4,mov) 预览

文件预览 Vue3一. word二. excel三. ppt四. pdf4.1 vue-pdf-embed4.2 iframe 五. 视频六&#xff1a;扩展——kkFileView Vue3 一. word 安装&#xff1a;npm install docx-preview父页面 <template><div><DocPreviewv-if"filePath.includes(docx)"…

E. Sakurako, Kosuke, and the Permutation (置换环) Codeforces Round 981 (Div. 3)

哈哈哈, 之前做过一道置换环的题目, 但是当时不知道这是置换环 昨天写这道题目时老眼昏花, 读错题目, 如今一朝有悟,甄至化境 原题 E. Sakurako, Kosuke, and the Permutation 思路 这道题目与排序的不同在于, 如果第 i 个数不等于 i, 但是第 i 个数指向的数等于 i, 那么也…

基于RabbitMQ,Redis,Redisson,RocketMQ四种技术实现订单延时关闭功能及其相关优缺点介绍(以12306为主题)

目录 1. 延迟关闭订单 1.1 订单延时关闭功能技术选型 1.1.1 定时任务 1.1.2 RabbitMQ 1.1.3 Redis 过期监听 1.1.4 Redisson 1.1.5 RocketMQ 1.2 RocketMQ订单延时关闭发送方实现 1.3 RocketMQ订单延时关闭的消费方实现 1. 延迟关闭订单 用户发起订单后&#xff0c;如…

基于SSM的BBS社区论坛系统源码

运行环境&#xff1a;ideamysql5.7jdk8maven 使用技术&#xff1a;ssmmysqlshirolayui 功能模块&#xff1a;用户管理、模板管理、帖子管理、公告管理、权限管理等

使用 v-html 指令渲染的标签, 标签内绑定的 click 事件不生效

背景 在项目开发中&#xff0c;实现用户友好的输入交互是提升用户体验的关键之一。例如&#xff0c;在客服对话框中&#xff0c;其中有包含多个快捷选项用于快速问答&#xff0c;每个快捷选项都是一个可点击的按钮&#xff0c;并需要绑定点击事件来执行相应操作。然而&#xf…

Android Junit 单元测试 | 依赖配置和编译报错解决

问题 为什么在依赖中添加了testImplement在build APK的时候还是会报错&#xff1f;是因为没有识别到test文件夹是test源代码路径吗&#xff1f; 最常见的配置有: implementation - 所有源代码集(包括test源代码集)中都有该依赖库.testImplementation - 依赖关系仅在test源代码…

【CSS in Depth 2 精译_054】8.2 CSS 层叠图层(cascade layer)的推荐组织方案

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…

华为云实战杂记

配置nginx服务器 首先我们拿到一台服务器时&#xff0c;并不知道系统是否存在Nginx我们可以在Linux命令行执行如下命令查看 find / -name nginx* find / -name nginx* 查找所有名字以nginx开头的文件或者目录&#xff0c;我们看看系统里面都有哪些文件先&#xff0c;这样可以快…

Linux系统安装Redis详细操作步骤(二进制发布包安装方式)

安装方式介绍 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照redhat的包管理规范进…

雷池社区版有多个防护站点监听在同一个端口上,匹配顺序是怎么样的

如果域名处填写的分别为 IP 与域名&#xff0c;那么当使用进行 IP 请求时&#xff0c;则将会命中第一个配置的站点 以上图为例&#xff0c;如果用户使用 IP 访问&#xff0c;命中 example.com。 如果域名处填写的分别为域名与泛域名&#xff0c;除非准确命中域名&#xff0c;否…

NGINX 保护 Web 应用安全之基于 IP 地址的访问

根据客户端的 IP 地址控制访问 使用 HTTP 或 stream 访问模块控制对受保护资源的访问&#xff1a; location /admin/ { deny 10.0.0.1; allow 10.0.0.0/20; allow 2001:0db8::/32; deny all; } } 给定的 location 代码块允许来自 10.0.0.0/20 中的任何 IPv4 地址访问&#xf…

UE4_Niagara基础实例—9、使用条带渲染器来制作闪电

效果图&#xff1a; 一、通过模板Static Beam来熟悉条带渲染器 从Static Beam发射器新建niagara系统&#xff0c;更名为NS_StaticBeam。 打开粒子系统&#xff0c;界面如下&#xff1a; Beam Emitter Setup模块可以设置条带的开始点、结束点和切线。 我们就可以通过这个Beam E…