【Spring+MyBatis】留言墻的實現

目錄

1. 添加依賴

2. 配置數據庫

2.1 創建數據庫與數據表

2.2 創建與數據庫對應的實體類

3. 后端代碼

3.1 目錄結構

3.2?MessageController類

3.3?MessageService類

3.4?MessageMapper接口

4. 前端代碼

5. 單元測試

5.1?后端接口測試

5.2 使用前端頁面測試


在Spring專欄中,已經實現了Spring MVC版的留言墻,詳見下文:

【SpringMVC】_SpringMVC實現留言墻_使用springmvc完成一個簡單的留言板-CSDN博客文章瀏覽閱讀994次,點贊24次,收藏17次。1、請求:/message/publish2、參數:使用對象MessageInfo進行存儲參數:3、響應:true/false;_使用springmvc完成一個簡單的留言板 https://blog.csdn.net/m0_63299495/article/details/139359758該版本的消息存儲采用了List<MessageInfo>存儲,每次重啟服務器就會導致信息丟失。

本文基于上文,對表白墻系統進行持久化。

1. 添加依賴

在pom.xml文件中使用Alt+insert快捷鍵,在EditStarters中選擇MyBatis與Mysql的相關依賴:

并在maven面板中進行刷新;

2. 配置數據庫

2.1 創建數據庫與數據表

創建數據庫,名為message:

在該庫下創建messgae_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;

在application.yml中進行數據庫與MyBatis的相關配置:

# 端口配置
server:port: 8080
# 數據庫連接配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/message?characterEncoding=utf8&useSSL=falseusername: rootpassword: xxxxxxdriver-class-name: com.mysql.cj.jdbc.Driver
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #配置打印MyBatis日志map-underscore-to-camel-case: true   #配置轉換駝峰

2.2 創建與數據庫對應的實體類

修改MessageInfo類,增加id、deleteFlag、createTime、uodateTime屬性與數據表字段對應:

package com.example.springbootdemo2.controller;import lombok.Data;
import java.util.Date;@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;
}

3. 后端代碼

3.1 目錄結構

創建controller、service、mapper、model包,并創建對應類或接口:

其中,MessageController類主要功能:

(1)參數校驗;(2)調用MessageService進行業務邏輯操作;

MessageService類主要功能:

(1)調用MessageMapper接口進行數據庫操作;

MessageMapper接口主要功能:

(1)執行SQL語句;

3.2?MessageController類

package com.example.springbootdemo2.controller;import com.example.springbootdemo2.model.MessageInfo;
import com.example.springbootdemo2.service.MessageService;
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 {@Autowiredprivate MessageService messageService;@RequestMapping("/publish")public Boolean publishMessage(MessageInfo messageInfo){// 參數校驗:Controllerif(!StringUtils.hasLength(messageInfo.getFrom())|| !StringUtils.hasLength(messageInfo.getTo())|| !StringUtils.hasLength(messageInfo.getMessage())){return false;}// 添加留言:ServicemessageService.addMessage(messageInfo);return true;}// 返回所有留言信息@RequestMapping("/getMessageList")public List<MessageInfo> getMessageList(){return messageService.getMessageInfo();}
}

3.3?MessageService類

package com.example.springbootdemo2.service;import com.example.springbootdemo2.mapper.MessageMapper;
import com.example.springbootdemo2.model.MessageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class MessageService {@Autowiredprivate MessageMapper messageMapper;public void addMessage(MessageInfo messageInfo){messageMapper.insertMessage(messageInfo);}public List<MessageInfo> getMessageInfo(){return messageMapper.selectAllMessage();}
}

3.4?MessageMapper接口

package com.example.springbootdemo2.mapper;import com.example.springbootdemo2.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 MessageMapper {@Insert("insert into message_info(`from`,`to`,`message`) values (#{from},#{to},#{message})")void insertMessage(MessageInfo messageInfo);@Select("select* from message_info where delete_flag=0")List<MessageInfo> selectAllMessage();
}

4. 前端代碼

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>留言板</title><style>.container {width: 350px;height: 300px;margin: 0 auto;/* border: 1px black solid; */text-align: center;}.grey {color: grey;}.container .row {width: 350px;height: 40px;display: flex;justify-content: space-between;align-items: center;}.container .row input {width: 260px;height: 30px;}#submit {width: 350px;height: 40px;background-color: orange;color: white;border: none;margin: 10px;border-radius: 5px;font-size: 20px;}</style>
</head><body>
<div class="container"><h1>留言板</h1><p class="grey">輸入后點擊提交, 會將信息顯示下方空白處</p><div class="row"><span>誰:</span> <input type="text" name="" id="from"></div><div class="row"><span>對誰:</span> <input type="text" name="" id="to"></div><div class="row"><span>說什么:</span> <input type="text" name="" id="say"></div><input type="button" value="提交" id="submit" onclick="submit()"><!-- <div>A 對 B 說: hello</div> -->
</div><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>// 頁面加載時,請求后端獲取留言列表(代碼位置不限)$.ajax({url:"/message/getMessageList",type:"get",success:function(messages){// 參數為后端返回結果(變量名任意)for(var m of messages){// 拼接留言// 拼接節點的HTML,直接將HTML添加到container中var divE = "<div>" + m.from + "對" + m.to + "說:" + m.message + "</div>";// 把節點添加到頁面上$(".container").append(divE);}}})function submit() {//1. 獲取留言的內容var from = $('#from').val();var to = $('#to').val();var say = $('#say').val();if (from == '' || to == '' || say == '') {return;}// 提交留言$.ajax({url: "/message/publish",type: "post",data: {"from": from,"to": to,"message": say},success: function (result) {if (result) {// 留言添加成功//2. 拼接節點的HTML,直接將HTML添加到container中// document.createElement('div');var divE = "<div>" + from + "對" + to + "說:" + say + "</div>";//3. 把節點添加到頁面上$(".container").append(divE);//4. 清空輸入框的值$('#from').val("");$('#to').val("");$('#say').val("");} else {// 留言添加失敗alert("留言發布失敗")}}})}</script>
</body></html>

5. 單元測試

5.1?后端接口測試

(可以使用postman或Chrome)

可以在服務器日志中查看到相關信息:

需在數據庫中進行是否成功的驗證:

5.2 使用前端頁面測試

可以在服務器日志中查看到相關信息:

需在數據庫中進行是否成功的驗證:

一般報錯檢錯步驟:

(1)根據后端接口使用postman或Chrome構造請求,檢查后端代碼是否有錯;

若后端接口訪問無錯誤則說明錯誤出現在前端或前后端交互;

(2)若使用Chrome,則按F12看瀏覽器是否報錯,根據報錯信息定位錯誤代碼;

若無錯誤則需檢查請求是否發往后端,可以在后端服務器對應方法處打印日志(使用slf4j),若前端進行操作后,后端服務器處沒有執行改行日志的代碼,則說明前后端交互處出現錯誤;

(3)若后端、前后端交互、前端均沒有出現問題,可以進行清除前端與后端緩存;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70178.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQLite Select 語句詳解

SQLite Select 語句詳解 SQLite 是一個輕量級的數據庫管理系統&#xff0c;以其簡潔的設計和高效的性能被廣泛應用于各種場景。在 SQLite 中&#xff0c;SELECT 語句是用于查詢數據庫中的數據的命令。本文將詳細介紹 SQLite 的 SELECT 語句&#xff0c;包括其基本語法、常用功…

深度學習05 ResNet殘差網絡

目錄 傳統卷積神經網絡存在的問題 如何解決 批量歸一化BatchNormalization, BN 殘差連接方式 ?殘差結構 ResNet網絡 ResNet 網絡是在 2015年 由微軟實驗室中的何凱明等幾位大神提出&#xff0c;斬獲當年ImageNet競賽中分類任務第一名&#xff0c;目標檢測第一名。獲得CO…

組件庫地址

react&#xff1a; https://react-vant.3lang.dev/components/dialoghttps://react-vant.3lang.dev/components/dialog vue用v2的 Vant 2 - Mobile UI Components built on Vue

docker 進階命令(基于Ubuntu)

數據卷 Volume: 目錄映射, 目錄掛載 匿名綁定: 匿名綁定的 volume 在容器刪除的時候, 數據卷也會被刪除, 匿名綁定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data 綁定卷時修改宿主機的目錄或文件, 容器內的數據也會同步修改, 反之亦然 # 查看所有 vo…

從入門到精通:Postman 實用指南

Postman 是一款超棒的 API 開發工具&#xff0c;能用來測試、調試和管理 API&#xff0c;大大提升開發效率。下面就給大家詳細講講它的安裝、使用方法&#xff0c;再分享些實用技巧。 一、安裝 Postman 你能在 Postman 官網&#xff08;https://www.postman.com &#xff09;下…

將圖片base64編碼后,數據轉成圖片

將圖片數據進行base64編碼后&#xff0c;可以在瀏覽器上查看圖片&#xff0c;只需在前端加上data:image/png;base64,即可 在線工具&#xff1a; Base64轉圖片 - 加菲工具

【動態規劃】詳解 0-1背包問題

文章目錄 1. 問題引入2. 從 dfs 到動態規劃3. 動態規劃過程分析4. 二維 dp 的遍歷順序5. 從二維數組到一維數組6. 一維數組的遍歷次序7. 背包的遍歷順序8. 代碼總結9. 總結 1. 問題引入 0-1 背包是比較經典的動態規劃問題&#xff0c;這里以代碼隨想錄里面的例子來介紹下。總的…

LeetCode每日精進:20.有效的括號

題目鏈接&#xff1a;20.有效的括號 題目描述&#xff1a; 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以…

llama.cpp部署 DeepSeek-R1 模型

一、llama.cpp 介紹 使用純 C/C推理 Meta 的LLaMA模型&#xff08;及其他模型&#xff09;。主要目標llama.cpp是在各種硬件&#xff08;本地和云端&#xff09;上以最少的設置和最先進的性能實現 LLM 推理。純 C/C 實現&#xff0c;無任何依賴項Apple 芯片是一流的——通過 A…

Web后端 - Maven管理工具

一 Maven簡單介紹 Maven是apache旗下的一個開源項目&#xff0c;是一款用于管理和構建java項目的工具。 Maven的作用 二 Maven 安裝配置 依賴配置 依賴傳遞 依賴范圍 生命周期 注意事項&#xff1a;在同一套生命周期中&#xff0c;當運行后面的階段時&#xff0c;前面的階段都…

[LeetCode力扣hot100]-C++常用數據結構

0.Vector 1.Set-常用滑動窗口 set<char> ans;//根據類型定義&#xff0c;像vector ans.count()//檢查某個元素是否在set里&#xff0c;1在0不在 ans.insert();//插入元素 ans.erase()//刪除某個指定元素 2.棧 3.樹 樹是一種特殊的數據結構&#xff0c;力扣二叉樹相…

vite+vue3開發uni-app時低版本瀏覽器不支持es6語法的問題排坑筆記

重要提示&#xff1a;請首先完整閱讀完文章內容后再操作&#xff0c;以免不必要的時間浪費&#xff01;切記&#xff01;&#xff01;&#xff01;在使用vitevue3開發uni-app項目時&#xff0c;存在低版本瀏覽器不兼容es6語法的問題&#xff0c;如“?.” “??” 等。為了方便…

《計算機視覺》——角點檢測和特征提取sift

角點檢測 角點的定義&#xff1a; 從直觀上理解&#xff0c;角點是圖像中兩條或多條邊緣的交點&#xff0c;在圖像中表現為局部區域內的灰度變化較為劇烈的點。在數學和計算機視覺中&#xff0c;角點可以被定義為在兩個或多個方向上具有顯著變化的點。比如在一幅建筑物的圖像…

WWW 2025 | 中南、微軟提出端到端雙重動態推薦模型,釋放LLM在序列推薦中的潛力...

©PaperWeekly 原創 作者 | 殷珺 單位 | 中南大學碩士研究生 研究方向 | 大語言模型、推薦系統 論文題目&#xff1a; Unleash LLMs Potential for Sequential Recommendation by Coordinating Dual Dynamic Index Mechanism 論文鏈接&#xff1a; https://openreview.net…

c# 2025/2/17 周一

16. 《表達式&#xff0c;語句詳解4》 20 未完。。 表達式&#xff0c;語句詳解_4_嗶哩嗶哩_bilibili

數據結構與算法面試專題——堆排序

完全二叉樹 完全二叉樹中如果每棵子樹的最大值都在頂部就是大根堆 完全二叉樹中如果每棵子樹的最小值都在頂部就是小根堆 設計目標&#xff1a;完全二叉樹的設計目標是高效地利用存儲空間&#xff0c;同時便于進行層次遍歷和數組存儲。它的結構使得每個節點的子節點都可以通過簡…

iOS開發書籍推薦 - 《高性能 iOS應用開發》(附帶鏈接)

引言 在 iOS 開發的過程中&#xff0c;隨著應用功能的增加和用戶需求的提升&#xff0c;性能優化成為了不可忽視的一環。尤其是面對復雜的界面、龐大的數據處理以及不斷增加的后臺操作&#xff0c;如何確保應用的流暢性和響應速度&#xff0c;成為開發者的一大挑戰。《高性能 …

微信小程序的制作

制作微信小程序的過程大致可以分為幾個步驟&#xff1a;從環境搭建、項目創建&#xff0c;到開發、調試和發布。下面我會為你簡要介紹每個步驟。 1. 準備工作 在開始開發微信小程序之前&#xff0c;你需要確保你已經完成了以下幾個步驟&#xff1a; 注冊微信小程序賬號&…

LabVIEW 中dde.llbDDE 通信功能

在 LabVIEW 功能體系中&#xff0c;位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dde.llb 的 dde.llb 庫占據著重要的地位。作為一個與動態數據交換&#xff08;DDE&#xff09;緊密相關的庫文件&#xff0c;它為 LabVIEW 用戶提供了與其他…

gitte遠程倉庫修改后,本地沒有更新,本地與遠程倉庫不一致

問題 &#xff1a;gitte遠程倉庫修改后&#xff0c;本地沒有更新&#xff0c;本地與遠程倉庫不一致 現象&#xff1a; [cxqiZwz9fjj2ssnshikw14avaZ rpc]$ git push Username for https://gitee.com: beihangya Password for https://beihangyagitee.com: To https://gitee.c…