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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 浪漫编码:手把手教你实现校园表白墙功能

表白墙

前面的案例中,我们写了表白墙,但是⼀旦服务器重启,数据仍然会丢失.

要想数据不丢失,需要把数据存储在数据库中.接下来咱们借助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

输入留言信息,点击提交,发现页面列表显示新的数据,并且数据库中也添加了⼀条记录.

重启服务,页面显示不变.

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
移动开发 前端开发 JavaScript
童年回忆——开心消消乐(内含源码inscode一键运行)
童年回忆——开心消消乐(内含源码inscode一键运行)
|
前端开发 JavaScript
中秋之美——html+css+js制作中秋网页
中秋之美——html+css+js制作中秋网页
650 0
中秋之美——html+css+js制作中秋网页
|
3月前
|
应用服务中间件 Apache 数据库
校园表白墙源码LoveWall
LoveWall V2.0Pro是款社区型表白墙,提供点赞、评论、发弹幕、多校区支持及分享功能。环境需Centos7+/Windows Server 2008+、宝塔面板、Apache或Nginx、PHP7.1+及数据库5.6+。
66 0
|
程序员
七夕,你们还在用传统的方式进行表白?
七夕,你们还在用传统的方式进行表白?
61 0
|
存储 缓存 JSON
小程序毕设答辩问题【论坛/校园墙小程序】
小程序毕设答辩问题【论坛/校园墙小程序】
239 0
|
SQL JavaScript Java
搭建情人节表白网站(超详细过程,包教包会)
网站的搭建其实在七夕的时候就已经弄好了,只是当时不会搭建,然后就放了好几个月,偶然发现情人节快到了,遂重新搭建了这个网站,不过说实话除了网站还真想不出有啥能够体现程序员的特长,你说各种代码,c,c++,java即时给你做出不错的GUI界面,人家还不一定会打开,网站最容易了,有手(机)就行,下面是它的效果展示视频,觉得好的记得三连哦
379 0
搭建情人节表白网站(超详细过程,包教包会)
|
前端开发 JavaScript UED
「CSS畅想」何以解忧,美食足矣,用技术给好友开发了一个零食盲盒小游戏
前端技术从业者与非技术好友互动,用技术给好友开发了一个零食盲盒小游戏
249 1
|
前端开发 JavaScript Java
【JavaWeb】简易表白墙的设计
上述只是静态页面,也就是无论何时访问,页面都不会改变,并且上次提交的表白信息在下次访问时就会消失,所以我们需要制作成服务器版表白墙,也就是每次访问的时候所有的表白消息都可以展示出来,即访问时从数据库查询消息展示在前端,输入消息点击提交保存在数据库以后并展示在前端
【JavaWeb】简易表白墙的设计
|
存储 定位技术 C++
俄罗斯方块彩蛋(附星空表白彩蛋)
俄罗斯方块彩蛋(附星空表白彩蛋)
俄罗斯方块彩蛋(附星空表白彩蛋)
|
前端开发 程序员
来自程序员的浪漫圣诞&纯CSS3打造的圣诞祝福【献给前端初学者】内附代码以及运行方法
来自程序员的浪漫圣诞&纯CSS3打造的圣诞祝福【献给前端初学者】内附代码以及运行方法
来自程序员的浪漫圣诞&纯CSS3打造的圣诞祝福【献给前端初学者】内附代码以及运行方法