浪漫编码:手把手教你实现校园表白墙功能

news2024/12/23 15:39:48

在这里插入图片描述
💓 博客主页:从零开始的-CodeNinja之路

⏩ 收录文章:浪漫编码:手把手教你实现校园表白墙功能

🎉欢迎大家点赞👍评论📝收藏⭐文章
在这里插入图片描述
在这里插入图片描述

这里写目录标题

  • 表白墙
    • 数据准备
    • 引入MyBatis和MySQL驱动依赖
    • 配置MySQL账号密码
    • 编写后端代码
  • 测试代码

表白墙

前面的案例中,我们写了表白墙,但是⼀旦服务器重启,数据仍然会丢失.
要想数据不丢失,需要把数据存储在数据库中.接下来咱们借助MyBatis来实现数据的操作
在这里插入图片描述

数据准备

DROP TABLE IF EXISTS message_info;
	CREATE TABLE `message_info` (
	`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
	`from` VARCHAR ( 127 ) NOT NULL,
	`to` VARCHAR ( 127 ) NOT NULL,
	`message` VARCHAR ( 256 ) NOT NULL,
	`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
	`create_time` DATETIME DEFAULT now(),
	`update_time` DATETIME DEFAULT now() ON UPDATE now(),
	PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;

ONUPDATEnow():当数据发生更新操作时,自动把该列的值设置为now(),
now()可以替换成其他获取时间的标识符,⽐如:CURRENT_TIMESTAMP(),LOCALTIME()等MySQL<5.6.5

  1. 只有TIMESTAMP⽀持自动更新
  2. ⼀个表只能有⼀列设置自动更新
  3. 不允许同时存在两个列,其中⼀列设置了DEFAULTCURRENT_TIMESTAMP,]
  4. TIMESTAMP和DATETIME都⽀持自动更新,且可以有多列

引入MyBatis和MySQL驱动依赖

修改pom文件

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>3.0.3</version>
</dependency>

<dependency>
	<groupId>com.mysql</groupId>
	<artifactId>mysql-connector-j</artifactId>
	<scope>runtime</scope>
</dependency>

或者使用插件EditStarters来引入依赖

在这里插入图片描述

配置MySQL账号密码

spring:
	datasource:
		url: jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
		username: root
		password: root
		driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
	configuration: # 配置打印 MyBatis⽇志
		map-underscore-to-camel-case: true #配置驼峰自动转换

编写后端代码

import lombok.Data;

@Data
public class MessageInfo {
	private Integer id;
	private String from;
	private String to;
	private String message;
	private Integer deleteFlag;
	private Date createTime;
	private Date updateTime;
}

MessageInfoMapper

import com.example.demo.model.MessageInfo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;

@Mapper
public interface MessageInfoMapper {
	@Select("select `id`, `from`, `to`, `message` from message_info where delete_flag=0")
	List<MessageInfo> queryAll();
	
	@Insert("insert into message_info (`from`,`to`, `message`) values(#{from},#{to},#{message})")
	Integer addMessage(MessageInfo messageInfo);
}

MessageInfoService

import com.example.demo.mapper.MessageInfoMapper;
import com.example.demo.model.MessageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class MessageInfoService {

	@Autowired
	private MessageInfoMapper messageInfoMapper;
	
	public List<MessageInfo> queryAll() {
		return messageInfoMapper.queryAll();
	}
	
	public Integer addMessage(MessageInfo messageInfo) {
		return messageInfoMapper.addMessage(messageInfo);
	}
}

MessageController

import com.example.demo.model.MessageInfo;
import com.example.demo.service.MessageInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RequestMapping("/message")
@RestController
public class MessageController {
    @Autowired
    private MessageInfoService messageInfoService;
    /**
     * 获取留言列表
     * @return
     */
    @RequestMapping("/getList")
    public List<MessageInfo> getList() {
        return messageInfoService.queryAll();
    }
    /**
     * 发表留言
     * @param messageInfo
     * @return
     */
    @RequestMapping("/publish")
    public boolean publish(MessageInfo messageInfo) {
        System.out.println(messageInfo);
        if (StringUtils.hasLength(messageInfo.getFrom())
                && StringUtils.hasLength(messageInfo.getTo())
                && StringUtils.hasLength(messageInfo.getMessage())) {
            messageInfoService.addMessage(messageInfo);
            return true;
        }
        return false;
    }
}

测试代码

部署程序,验证服务器是否能正确响应:http://127.0.0.1:8080/messagewall.html
在这里插入图片描述
输入留言信息,点击提交,发现页面列表显示新的数据,并且数据库中也添加了⼀条记录.
在这里插入图片描述

在这里插入图片描述
重启服务,页面显示不变.

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

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

相关文章

部分设计模式概述

单例模式 工厂模式 适配器模式 模板方法模式 策略模式 责任链 观察者模式&#xff08;又叫发布订阅模式&#xff09;

MySql#MySql数据库基础

目录 一、什么是数据库 二、主流数据库 三、基本使用 1.连接服务器 2.使用 1.查看你数据库 2.创建数据库 ​编辑 ​编辑 ​编辑​编辑 3.使用数据库 ​编辑 4.创建数据库表 5.表中插入数据 6.服务器&#xff0c;数据库&#xff0c;表之间的关系 四、MySQL架构…

【Docker】docker compose服务编排

docker compose 简介 Dockerfile模板文件可以定义一个单独的应用容器&#xff0c;如果需要定义多个容器就需要服务编排。 docker swarm&#xff08;管理跨节点&#xff09; Dockerfile可以让用户管理一个单独的应用容器&#xff1b;而Compose则允许用户在一个模板&#xff08…

关于信息泄露的危害,听听圈内人怎么说......

信息泄露危害之短信轰炸 信息泄露这个事大家要引起重视&#xff0c;会给日常生活带来很多安全风险&#xff0c;例如说&#xff0c;经常收到的垃圾短信、骚扰电话、钓鱼邮件等&#xff0c;一轮接一轮的“轰炸”&#xff0c;让你不堪其扰。 我之前收到的垃圾短信大部分是商铺的广…

You don’t have permission.

The document “XXX” could not be saved. You don’t have permission. 1.查看修改了iOS系统库导致的, 根据提示, 进入到"XXX"文件中, 然后commandz回退/取消 2. Xcode 调试遇到的报错&#xff08;持续更新&#xff09;

Python量化炒股的数据信息获取—获取上市公司分红送股数据信息

Python量化炒股的数据信息获取—获取上市公司分红送股数据信息 上市公司分红送股数据&#xff0c;都存放在STK_XR_XD表中&#xff0c;该表保存在finance包中。要查看表中的数据信息&#xff0c;需要使用query()函数。 单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”…

华为OD机试 - 符号运算 - 递归(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

头歌Hadoop 开发环境搭建及HDFS初体验(第2关:配置开发环境 - Hadoop安装与伪分布式集群搭建)

第1关&#xff1a;配置开发环境 - JavaJDK的配置 第2关&#xff1a;配置开发环境 - Hadoop安装与伪分布式集群搭建 第3关&#xff1a;HDFS系统初体验 注&#xff1a; 1 头歌《Hadoop 开发环境搭建及HDFS初体验》三关在一个实验环境下&#xff0c;需要三关从前往后按顺序评测…

【Mac】 DSync for mac(文件比较同步工具) v2.7安装教程

软件介绍 DSync是一款文件比较同步工具&#xff0c;通过简便的三步即可完成繁琐的比较、同步操作&#xff0c;您甚至可以通过跳过、删除或反转您选择的文件的复制方向来微调您的同步。这是在Mac上同步文件的最简单方法。 安装教程 1.打开安装包&#xff0c;将「DSync」拖到右…

RK3568 学习笔记 : u-boot 下通过设置 env ethact 设置当前工作的以太网设备

前言 正点原子 &#xff1a;RK3568 开发板 atompi-ca1 默认有两个网口&#xff0c;通过 u-boot mii 命令&#xff0c;可以查看 网口信息 > mii device MII devices: ethernetfe010000 ethernetfe2a0000 Current device: ethernetfe010000u-boot 下的以太网&#xff0c;不同…

功能描述如何逻辑

assign相当于连线&#xff0c;注意每个assign独立&#xff0c;如果有变化立刻变化

go mod

常用命令 初始化模块 go mod init 模块名下载 go.mod 文件中指明的所有依赖 go mod download github.com/gin-gonic/ginv1.9.(依赖路径)依赖对其&#xff08;使引用的都是所依赖的&#xff09; go mod tidy编辑go.mod go mod edit go mod edit -require"github.com/g…

uniapp 使用renderjs的一些详细介绍

一、简介 官方链接&#xff1a;uniapp官网中的renderjs方法的详细介绍 二、renderjs 定义 renderjs是一个运行在视图层的js。它比WXS更加强大。它只支持app-vue和web。 作用&#xff1a; 大幅降低逻辑层和视图层的通讯损耗&#xff0c;提供高性能视图交互能力。在视图层操作d…

jvm重要参数可视化和线上问题排查

jvm重要参数可视化和线上问题排查 目标jvm参数分类(了解)运行时数据区相关的&#xff08;jdk1.8&#xff09;处理 OOM 相关的垃圾回收器相关的GC 日志记录相关的意义,默认值,调优原则&#xff08;重要&#xff0c; 待拆分&#xff09; 排查 OOM 流程 和 常见原因参考文章 目标 …

书生浦语训练营第三次课笔记:XTuner 微调 LLM:1.8B、多模态、Agent

Finetune 简介 两种Finetune范式&#xff1a;增量预训练微调、指令跟随微调 微调数据集 上述是我们所期待模型回答的内容&#xff0c;在训练时损失的计算也是基于这个。 训练数据集看起来是这样&#xff0c;但是真正喂给模型的&#xff0c;是经过对话模板组装后的 下图中&…

tomcat+nginx 动静分离

一、单机反向代理 7-1 7-2 测试 二、多机反向代理 1. 环境准备 机器IP地址服务7-1172.168.1.11nginx7-2172.168.1.12tomcat7-3172.168.1.13tomcat 2. 配置7-1 Nginx 服务器 vim /apps/nginx/conf/nginx.confhttp:upstream tomcat {server 172.168.1.12:8080;server …

优化理论复习——(三)

本篇介绍无约束优化的问题&#xff0c;通过四种算法来进行求解的过程和思路&#xff0c;也是最优化方法中的最重要的一类问题。 无约束优化问题主要是通过迭代搜索算法来切结&#xff0c;比线性规划的计算量都小一点。 目录 无约束优化问题最优性条件最速下降法牛顿法共轭梯度…

Vue踩坑,less与less-loader安装,版本不一致

无脑通过npm i less -D安装less之后&#xff0c;继续无脑通过npm i less-loader -D安装less-loader出现如下错误&#xff1a; 解决方法&#xff1a; 1) npm uninstall less与 npm uninstall less-loader 2) 直接对其版本&#xff1a; npm i less3.0.4 -D npm i less-loader…

渠道管控治理思路建议

品牌在做控价时&#xff0c;一定要有渠道一体化的治理想法&#xff0c;不能只能打击某一家店铺为想法进行治理&#xff0c;比如只打击非授权&#xff0c;只不去管理授权体系的经销商店铺&#xff0c;这显然是不行的&#xff0c;管理非授权的同时&#xff0c;授权也要管理好&…

QT+网络调试助手+TCP客户端

一、网络调试助手UI界面 编程主要思路&#xff1a; 首先将水平的控件 水平布局 &#xff0c;然后相对垂直的控件 垂直布局 &#xff0c;哪怕是底下的groupBox也需要和里面的内容 水平布局&#xff0c;然后最后框选全部 栅格布局。如果需要界面自适应窗口大小&#xff0c…