项目实战_表白墙(升级版)

news2024/12/26 22:54:07

你能学到什么

  • 表白墙(升级版)
  • Mybatis的一些简单应用

正文

前⾯的案例中, 我们写了表⽩墙, 但是⼀旦服务器重启, 数据就会丢失.
要想数据不丢失, 需要把数据存储在数据库中,接下来咱们借助MyBatis来实现数据库的操作。

数据准备

如果我们想将数据存起来首先要有一个数据库吧,所以首先就是要创建一个数据库 ,由于直接在Mysql 小黑框里写有点麻烦,我们可以借助一些软件来更加简单的创建数据库,我使用的是Navicat Premium17,挺好用的,虽然它收费,但是搜搜教程,免费的就来了,懂我的意思吧。
在这里插入图片描述
最好使用Mysql 8 ,因为 Mysql5 好像和新的一些功能不兼容了。
这是创建一个message_info表的代码,有兴趣的可以跟着敲一下,就当复习了,没兴趣的直接复制就行。

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;

在这里插入图片描述

引入依赖

引⼊MyBatis 和 MySQL驱动依赖

方法一:修改pom文件,然后刷新Maven,就能将依赖加进来

在这里插入图片描述

在这里插入图片描述

  • 下面是用到的依赖,有需要的可以复制
<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来引入依赖
  • 1,先打开settings 然后在Plugins(插件)里面搜EditStarters,点击install就行了,然后重启IDEA就能用了
    在这里插入图片描述
  • 2,在pom文件页面右键generate,然后按照以下的简图进行

在这里插入图片描述

方法三:在创建项目的时候就将依赖加进来

在这里插入图片描述

以上的方法任选其一就行。
对于方法三:吃一堑长一智,下次我们在创建项目的时候直接添加进来就行了,就不用后期再次添加了。

配置Mysql账号密码

这个操作需要在applicantion.properties文件下配置,由于这里我只提供了yml格式的配置信息,大家可以将这个文件重命名改成applicantion.yml,照着下面的流程图改就行了。

在这里插入图片描述
将相应的配置信息添加进来

在这里插入图片描述

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/blogs_text?characterEncoding=utf8&useSSL=false
    username: root
    password: 456123
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  configuration: # 配置打印 MyBatis⽇志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true #配置驼峰⾃动转换

编写后端代码

实体类info

在这里插入图片描述
我们可以看到数据库里有很多属性,如果只靠我们之前定义的类中的属性肯定是不够的,所以我们要重新定义一个实体类和数据库里的属性对应。
在这里插入图片描述
实体类代码

package com.example.leavemessage_blogs.model;
import lombok.Data;
import java.util.Date;
@Data
public class Info {
        private Integer id;
        private String from;
        private String to;
        private String message;
        private Integer deleteFlag;
        private Date createTime;
        private Date updateTime;
}


使用Mybatis 操作数据库

  • 说到这里我们就需要想一想接口文档了,我们的需求是什么,要用增删改查的哪一个。我们知道表白墙的两大功能就是
    • 1,显示数据
    • 2,添加信息
      由此我们可以回忆一下之前我们的初级表白墙怎么做的,我们是用一个list来储存数据,如果要显示数据就将list返回给前端。而此刻,我们不再用list储存数据了,而是用数据库,所以我们要提供的功能就是
    • 1,查找数据(select)返回数据给前端页面显示
    • 2,新增数据(insert)将用户输入的数据存到数据库中

InfoMapper接口的代码(由于我们不需要方法有具体的实现,所以定义成接口更合适)

我们先完成一个功能,添加

package com.example.leavemessage_blogs.Mapper;

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

//使用Mybatis操作数据库,别忘记加Mapper注解
@Mapper
public interface InfoMapper {
   
//我们采用传对象的方式,由于前端只提交这几个值,所以我们只需要将这几个值传入数据库就行了,其他的默认值就行
    @Insert("insert into message_info(from,to,message) values (#{from},#{to},#{message})")
    public boolean addInfo(Info info);

}

编写并测试新增addInfo功能

上面我们已经写好了,可以测试一下我们写的到底对不对:
右键——》generate——》text——》勾选你要测试的方法(其他不用动)。

然后加上@SpringBootText 测试注解,编写测试代码。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

因此我们将sql语句加上反引号

在这里插入图片描述

测试结果:成功

在这里插入图片描述

新增的测试代码:

package com.example.leavemessage_blogs.Mapper;

import com.example.leavemessage_blogs.model.Info;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class InfoMapperTest {

    @Autowired
    InfoMapper infoMapper;
    @Test
    void addInfo() {
        Info info = new Info();
        info.setFrom("wulanzheng");
        info.setTo("chengaiying");
        info.setMessage("I love you");
    }
}

编写并测试查询querryAllInfo功能

查询功能的代码:

package com.example.leavemessage_blogs.Mapper;

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

//别忘记加Mapper注解
@Mapper
public interface InfoMapper {

//我们采用传对象的方式,由于前端只提交这几个值,所以我们只需要将这几个值传入数据库就行了,其他的默认值就行
//    @Insert("insert into message_info(`from`,`to`,message) values (#{from},#{to},#{message})")
//    public boolean addInfo(Info info);


    @Select("select * from Message_info")
    public List<Info> querryAllInfo();

}

测试:

注意如果你在:右键——》generate——》text——》勾选你要测试的方法。
的过程中出现了下面的Error 不要慌,直接点击ok就行了。
在这里插入图片描述
我们能能看到代码运行成功,还打印出了结果
可以看到运行橙红

查询的测试代码:

package com.example.leavemessage_blogs.Mapper;

import com.example.leavemessage_blogs.model.Info;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class InfoMapperTest {

    @Autowired
    InfoMapper infoMapper;
    
//    @Test
//    void addInfo() {
//        Info info = new Info();
//        info.setFrom("wulanzheng");
//        info.setTo("chengaiying");
//        info.setMessage("I love you");
//        infoMapper.addInfo(info);
//    }

@Test
void querryAllInfo() {
    //将查询的数据遍历打印下来,这是一种lamda表达式的写法
    infoMapper.querryAllInfo().forEach(System.out::println);
}
}

这样我们的后端主要的架构就写完了,但是由于应用分层的理念,我们还要写service方法,和controller进行交互

编写service代码(应用分层交互)

package com.example.leavemessage_blogs.Service;

import com.example.leavemessage_blogs.Mapper.InfoMapper;
import com.example.leavemessage_blogs.model.Info;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class InfoService {
    @Autowired
    InfoMapper infoMapper;
    
    public List<Info> getInfo(){
        return infoMapper.querryAllInfo();
    }
    
    public boolean addInfo(Info info){
        boolean ret =infoMapper.addInfo(info);
        if(ret) {
            return true;
        }
        return false;
    }
}

修改controller 代码

我们已经将数据库引入了,自然就不需要list来存储数据了,所以controller中的代码也要修改,
修改后的controller代码:

package com.example.leavemessage_blogs.Controller;

import com.example.leavemessage_blogs.Service.InfoService;
import com.example.leavemessage_blogs.model.Info;
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.ArrayList;
import java.util.List;

@RequestMapping("/message")
@RestController
public class MessageController {
    @Autowired
    InfoService infoService;

    @RequestMapping("getList_Mysql")
    public List<Info> getList(){
        return infoService.getInfo();
    }

    @RequestMapping("/addInfo")
    public boolean addInfo(Info info){
        System.out.println(info);
        if(StringUtils.hasLength(info.getFrom())&&
        StringUtils.hasLength(info.getTo())&&
        StringUtils.hasLength(info.getMessage())){
            infoService.addInfo(info);
            return true;
        }
        return false;
    }
}

测试后端代码

此时我们就已经将后端代码全部修改完毕了,就是测试了,我们使用postman来测试。

测试新增的功能

可以看到发送成功

在这里插入图片描述
我们再看看数据库:

在这里插入图片描述
没有任何问题

测试查询的功能

也是没有任何问题
在这里插入图片描述

  • 小tips:对于测试单一接口:先将controller 类和service类Mapper类都先写了,然后再经过Postman访问controller的url,从而达到测试的目的,这也是一种测试的方法。但是相比较于我们上面的直接generate自动生成的方法,自动生成的方法更加的方便,高效,所以更推荐在测试一个接口的时候使用自动生成的方法。

编写前端代码

确定了后端代码全部正确以后,此时我们再次点开messagewall.html文件对前端代码进行修改
看来看去,好想只有load里的url需要修改一下

 load();
    function load() {
        $.ajax({
            type: "get",
            url: "/message/getList_Mysql",//修改这里的url,改成我们新的url
            success: function (result) {
                for (var message of result) {
                    var divE = "<div>" + message.from + "对" + message.to + "说:" + message.message + "</div>";
                    $(".container").append(divE);
                }
            }
        });
    }

测试前端代码

访问http://127.0.0.1:8080/messagewall.html之后,会出现我们之前添加过的数据,这表示查询功能正常
在这里插入图片描述
我们此时再添加一个数据,可以看到功能正常
在这里插入图片描述
以上的表白墙无论你怎么重复启动程序都不会丢失数据了,这就是表白墙进阶全部内容了,如果有什么问题,欢迎留言,我们共同探讨。

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

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

相关文章

Linux-用户和用户组管理

用户管理 创建 useradd USERNAME&#xff08;名字&#xff09; [rootlocalhost ~]# useradd bao 创建指令 怎么判断创建成功与否&#xff08;是否报错&#xff09; 观察是否报错可行但用变量的方式判断会更加直观 [rootlocalhost ~]# echo $? 变量 什么是变量&…

Vant2框架tab切换list不加载问题(切换后onload不继续触发)

遇到的问题&#xff1a; van-list 加载&#xff0c;页面上有个切换的 van-tab&#xff0c;实现切换不同的类型&#xff0c;加载不同的list的功能。 Vant2 的 List 列表 就有个 bug&#xff0c;当切换 tab 的时候&#xff0c;它的 onload 没有自动触发。 然而在当前标签页&#…

AMD第二季度财报:数据中心产品销售激增,接近总收入一半

#### 财报亮点 7月30日&#xff0c;AMD公布了截至6月29日的第二季度财务业绩&#xff0c;利润超过了华尔街的预期。根据TechNews的报道&#xff0c;最值得注意的是&#xff0c;AMD现在近一半的销售额来自于数据中心产品&#xff0c;而非传统的PC芯片、游戏主机或是工业与汽车嵌…

IDEA打开项目显示在顶端

问题 IDEA打开项目显示在顶端&#xff0c;更改到左侧 解决方案 删除项目中.idea文件,重新打开

【pikachu靶场】跨站脚本攻击详细教程Cross-Site Scripting(xss)

文章目录 XSS&#xff08;跨站脚本&#xff09;概述 1.反射型xss&#xff08;get&#xff09; 2.反射型xss&#xff08;post&#xff09; 3.存储型XSS 4.DOM型xss 5.DOM型XSS-X 6.xss之盲打 7.xss之过滤 8.xss之htmlspecialchars 9.xss之href输出 10.xss之js输出 XSS…

并发编程相关面试题-Synchronized

重量级锁实现的原理 1、synchronized是JVM内置锁&#xff0c;基于Monitor机制实现&#xff0c;依赖底层操作系统的互斥锁Mutex&#xff08;互斥量&#xff09;&#xff0c;它是一个重量级锁、 2、synchronized同步方法是通过方法中的access_flags中设置ACC_SYNCHRONIZED标志来…

换根dp学习总结3

我也不想搞这么多&#xff0c;但是这东西真的太难了&#xff0c;因为我还是个蒟蒻。算了蒟蒻继续写这次的总结了 寻找全图最远路径问题——Computer ——题目来源于hdu2196 题意&#xff1a;题目就是说会输入多组数据&#xff0c;每组数据给你一个n&#xff0c;表示结点的总数…

怎么评价程序员40岁了竟然还在撸代码?

怎么评价外卖员40岁了竟然还在送外卖&#xff1f; 怎么评价滴滴司机40岁了竟然还在跑滴滴&#xff1f; 怎么评价老师40岁了竟然还在教书&#xff1f;难道程序员的本职工作不是敲代码吗&#xff1f;无论你是管理层还是螺丝钉&#xff0c;工业环境下怎么可能一行代码都不敲呢&…

RocketMQ Dashboard安装

RocketMQ Dashboard 是一个基于 Web 的管理工具&#xff0c;用于监控和管理 RocketMQ 集群。它提供了一个用户友好的界面&#xff0c;使管理员能够轻松地查看和操作 RocketMQ 系统中的各种组件和状态。 主要功能包括&#xff1a; 集群管理: 监控和管理 NameServer 和 Broker …

web框架:django基础(二)

文章目录 django基础&#xff08;二&#xff09;1.回顾2.今日概要3.路由系统3.1 传统的路由3.2 正则表达式路由3.3 路由分发小结 3.4 name3.5 namespaceapp_namenamespace的多层嵌套 3.4 最后的 / 如何解决&#xff1f;3.5 当前匹配对象小结 4.视图4.1 文件or文件夹4.2 相对和绝…

《QDebug 2024年7月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Qt5 QML 在某些环境下&#xff0c;有些字体中文渲染有问题 如 Qt5.15 在部分安卓机上复制的复只有半截宽&#xff0c;半径的径字也不对&#xff0c;等等 用 Qt6.7 测试则正常&#xff0c;或者换成其他如小米、阿里巴巴…

Golang的TLS版本配置参数-排坑经历

一、背景 公司有个黑盒监控拨测组件&#xff0c;类似可以通过各种协议如HTTP、TCP、ICMP等等针对目标主机、目标IP、目标站点进行定时拨测&#xff0c;通过返回的状态码等信息来推断&#xff0c;目标业务系统/主机、站点是否存在异常&#xff0c;健康情况如何。 最近在配置一个…

一文搞懂机器学习!2024.6月最新!(附代码实现)

前言 机器学习入门精品文章 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文介绍机器学习的基础内容。 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从数据中学习并做出决策或预测&am…

Jangow-1.0.1靶机漏洞复现(未完成)

首先&#xff0c;这个靶机只能使用VirtualBox打开&#xff0c;靶机下载地址为 https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova 虚拟机软件下载地址为 Download_Old_Builds – Oracle VM VirtualBox 开启靶机后访问ip进入如下页面&#xff0c;点击site进入到一个…

【C++】哈希容器

unordered系列关联式容器 在之前的博文中介绍过关联式容器中的map与set&#xff0c;同map与set一样&#xff0c;unordered_set与unordered_set也是关联式容器。 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;查询效率可以达到logN&#xff1b;在…

详解HTTP代理与SOCKS代理之间的差异

代理服务器在网络安全和隐私保护方面&#xff0c;发挥着十分重要的作用。其中&#xff0c;HTTP代理和SOCKS代理是两种常见的代理方式&#xff0c;它们在原理、功能和应用场景上有着明显的差异。本文将为大家深入分析这两种代理之间的区别&#xff0c;帮助大家更好地选择适合自己…

Linux中如何添加磁盘分区

在Linux中添加分区通常涉及到几个步骤&#xff0c;包括识别磁盘、创建分区、格式化分区&#xff0c;以及挂载或将其用作特定的文件系统类型&#xff08;如LVM、RAID等&#xff09;。以下是一个基本的步骤指南&#xff0c;假设你正在使用命令行界面&#xff08;CLI&#xff09;和…

《技术人求职之道》之简历优化篇(下):技能与项目亮点,如何让你的简历熠熠生辉

摘要 本文将深入探讨技术求职者在撰写简历时的关键要素,包括专业技能的表达和项目经验的描述。文章首先提出专业技能描述的六条基本原则,包括统一技术词汇、标点符号一致性、技术关键字的驼峰命名法、技术分类、技术热度和掌握度排序以及慎用“精通”。接着,指导读者如何美…

FFmpeg Windows安装教程

一. 下载ffmpeg 进入Download FFmpeg网址&#xff0c;点击下载windows版ffmpeg。 下载第一个essentials版本就行。 二. 环境配置 上面源码解压后如下 将bin添加到系统环境变量 验证安装是否成功&#xff0c;输入ffmpeg –version&#xff0c;显示版本即为安装成功。

必应Bing国内广告开户、投放流程和避坑攻略!

必应Bing作为微软旗下的搜索引擎&#xff0c;不仅在全球范围内拥有庞大的用户群体&#xff0c;在中国也有着稳定的市场份额。为了让企业更好地利用必应Bing在国内的广告资源&#xff0c;云衔科技提供了全面的广告开户及代运营服务&#xff0c;帮助企业轻松驾驭数字化营销之路。…