《Java EE與中間件》實驗一 基于MyBatis的留言本

目? 錄

一、實驗目的和要求

1、實驗目的

2、實驗要求

二、實驗實現思路及步驟

1、實驗思路

2、實驗步驟

3、實驗方案

三、主要開發工具

四、實驗效果及實現代碼

1、留言本數據庫構建實現

(1)建立javaee-project數據庫

(2)建立message數據表

(3)建立user數據表

2、留言本首頁模塊功能實現

(1)留言本留言信息呈現

(2)留言本留言記錄查詢

(3)留言本鏈接跳轉

3、留言本登錄模塊功能實現

(1)留言本登錄驗證

(2)留言本登錄成功

(3)留言本登錄退出

4、留言本發布留言模塊功能實現

(1)留言本發布留言內容驗證

(2)留言本留言發布

5、留言本留言回復模塊功能實現

(1)留言本留言回復信息

(2)留言本留言回復發布成功

6、留言本刪除留言模塊功能實現

(1)留言本留言刪除驗證

(2)留言本留言刪除成功

五、遇到的問題和解決方法

六、心得體會


一、實驗目的和要求

1、實驗目的

????????熟練掌握Mybatis框架基本用法,web項目中集成Mybatis。

2、實驗要求

????????實現簡單留言本的發貼和回復功能,效果圖如下:


二、實驗實現思路步驟

1、實驗思路

? ? ? ? (1)設計一個包括留言ID(主鍵,自增),留言者姓名,留言內容,留言時間等屬性的數據庫來存儲留言信息。

? ? ? ? (2)在Java中創建一個實體類,該類對應數據庫中的表,有一系列的getter和setter方法用于訪問和修改這些屬性。

? ? ? ? (3)Mapper層包含了所有與數據庫操作相關的接口,這些接口定義了如何執行數據庫操作。這些接口是MyBatis框架的主要部分,它們定義了如何將Java對象映射到數據庫中的記錄,以及如何從數據庫中檢索記錄并映射回Java對象。

? ? ? ? (4)對于每個Mapper接口,創建一個XML文件來定義如何將接口的方法映射到數據庫中的SQL語句。這些XML文件包含了要執行的SQL語句、參數如何映射到SQL語句中等的詳細信息。

? ? ? ? (5)創建一個名為mybatis-config.xml的配置文件來完成Mapper接口的路徑和XML映射文件的路徑配置。

? ? ? ? (6)Service層包含了業務邏輯的實現,通常會調用Mapper層的方法來操作數據庫,并根據業務需求進行數據的處理。Service實現類(Impl)是Service層的具體實現,它們實現了Service層的接口并實現了相關的業務邏輯。

? ? ? ? (7)創建Controller層:Controller層負責處理用戶請求并調用服務層的業務邏輯,處理HTTP請求,將請求參數轉化為entity對象,并調用service層的方法。

2、實驗步驟

? ? ? ? (1)確定留言本需要存儲的數據,包括留言者的姓名、留言的內容、留言的時間等,可以考慮使用關系型數據庫,如MySQL來存儲這些數據。

? ? ? ? (2)定義數據模型實體類,反映數據庫中的表結構,每個屬性對應一個字段。使用Java的類來表示這些實體,利用IDE的ORM工具IntelliJ IDEA來自動生成這些類和它們對應的數據訪問接口。

????????(3)定義數據訪問接口Mapper層,包含對數據庫進行各種操作的方法,并為每個接口創建一個XML映射文件,該文件包含如何將接口的方法映射到SQL語句的詳細信息。

????????(4)定義業務邏輯層Service層,該層包含判斷留言是否已經存在、統計留言數量等一系列業務邏輯的實現,調用Mapper層的方法來訪問數據庫,并根據業務需求處理數據。

????????(5)設計用戶界面Controller層,該層處理添加留言、查看留言等一系列用戶請求,接收用戶的輸入并將其轉換為程序可以理解的命令,然后調用Service層的方法來執行這些命令。

????????(6)配置數據源、Mapper接口和XML映射文件的路徑等一系列事務管理器以確保事務的一致性。

3、實驗方案

? ? ? ? (1)使用MySQL建立基于MyBatis的留言本需要使用的數據庫(javaee-project)以及數據表(message、user),通過MyBatis配置文件連接對應的數據庫,并通過調用數據庫中的留言信息數據進行相關留言信息的發布、刪除、查看、回復等操作。

? ? ? ? (2)根據課本、PPT和老師課堂中講解的內容,使用IDEA-Java編譯軟件制作基于MyBatis的留言本。

? ? ? ? (3)將代碼編寫過程中遇到的問題及時的進行記錄并在課后向老師進行提問,將遇到的問題進行及時的處理和解答,并將所有的問題和解決方法進行匯總歸納。

? ? ? ? (4)完成最終的項目以及基于MyBatis留言本的實驗報告,最后進行實驗報告排版的檢查并提交。


三、主要開工具

????????IDEA-Java開發工具、Navicat-MySQL開發工具


四、實驗效果實現代碼

1、留言本數據庫構建實現

(1)建立javaee-project數據庫

????????打開SQLYog進行數據庫的創建,數據庫創建完畢以后再在數據庫中添加留言信息數據表(message)和用戶信息數據表(user),對應的數據庫構建界面如圖1-1所示:

圖1-1?數據庫構建界面

????????核心代碼:

CREATE DATABASE javaee-project;USE javaee-project;

(2)建立message數據表

? ? ? ? a、message數據表屬性設置

????????留言信息數據表(message)包括昵稱(nickname)、QQ號碼(qq)、電子郵件地址(email)、留言內容(msg)、回復ID(reply_id)、創建時間(create_time)、更新時間(update_time)以及留言類型(type),對應的message屬性設置界面如圖1-2所示:

圖1-2?message屬性設置界面

????????核心代碼:

CREATE?TABLE?`message`?(`id`?int?NOT?NULL?AUTO_INCREMENT,`nickname`?varchar(255)?DEFAULT?NULL,`qq`?varchar(255)?DEFAULT?NULL,`email`?varchar(255)?DEFAULT?NULL,`msg`?varchar(255)?DEFAULT?NULL,`reply_id`?int?DEFAULT?NULL,`create_time`?datetime?DEFAULT?CURRENT_TIMESTAMP,`update_time`?datetime?DEFAULT?CURRENT_ON?UPDATE?CURRENT_TIMESTAMP,`type`?tinyint?DEFAULT?NULL,PRIMARY?KEY?(`id`)
)?ENGINE=InnoDB?AUTO_INCREMENT=108?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_0900_ai_ci

? ? ? ? b、message數據表信息

????????通過Sql語句進行留言信息數據表(message)的創建并在數據表中添加一部分留言數據信息記錄,對應的message數據信息界面如圖1-3所示:

圖1-3?message數據表信息界面

(3)建立user數據表

? ? ? ? a、user數據表屬性設置

????????用戶信息數據表(user)包括用戶名(name)、密碼(password)、角色(role)和生日(birthday),對應的user屬性設置界面如圖1-4所示:

圖1-4?user屬性設置界面

????????核心代碼:

CREATE?TABLE?`user`?(`id`?int?NOT?NULL?AUTO_INCREMENT,`name`?varchar(255)?DEFAULT?NULL,`password`?varchar(255)?DEFAULT?NULL,`role`?varchar(255)?DEFAULT?NULL,`birthday`?varchar(255)?DEFAULT?NULL,PRIMARY?KEY?(`id`)
)?ENGINE=InnoDB?AUTO_INCREMENT=3?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_0900_ai_ci

????????b、user數據表信息

????????通過Sql語句進行用戶信息數據表(user)的創建并在數據表中添加一部分用戶數據信息記錄,對應的user數據信息界面如圖1-5所示:

圖1-5?user數據表信息界面

2、留言本首頁模塊功能實現

(1)留言本留言信息呈現

????????項目創建完畢后啟動項目,在留言本的首頁可以看到所有用戶發布的留言以及對留言作出的回復信息,并會將留言數據按5條為一段進行分頁劃分處理操作,整個頁面采用動畫流動設計,為留言本添加了色彩渲染,對應的留言本信息呈現界面如圖2-1所示:

圖2-1?留言本信息呈現界面

????????核心代碼:

<video autoplay="autoplay" loop class="fillWidth" muted="muted" style="position: absolute"><source src="./image/background.mp4"></video><footer class="main-footer" style="background: #f7ecb5"><div class="container"><div class="pull-right hidden-xs"></div><div align="center"><strong><b><b style="color: #0d6aad; margin-left: 30px">設計者:</b>于立偉<b style="color: #720e9e; margin-left: 30px">QQ郵箱:<a href=?"https://mail.qq.com/">3443531275@qq.com</a></b><b style="color: #720e9e; margin-left: 30px">手機號:13830758370</b><b style="color: rgba(12,32,150,0.29); margin-left: 30px">CO:啟 <img src="./image/logoYW.jpg" style="border-radius: 50%" width="20px" height="20px"/> 航</b><b style="color: #720e9e; margin-left: 30px">B站視頻號:<a href="https://www.bilibili.com/video/BV1mh4y1M7id/">尾鯉魚</a></b></b></strong></div></div></footer>

(2)留言本留言記錄查詢

? ? ? ? a、鍵入查詢信息

????????當需要查看指定用戶的留言信息時,可以在留言本最上方的搜索框中輸入自己想要查詢的數據記錄,此處采用了模糊查詢的方式,對應的鍵入查詢界面如圖2-2所示:

圖2-2?鍵入查詢界面

????????核心代碼:

@RequestMapping("/replyByNickname.do")public void replyByNickname(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding("UTF-8");String id = request.getParameter("id");String msg = request.getParameter("replyMsg");Message message = new Message();message.setReplyId(Integer.parseInt(id));message.setMsg(msg);message.setType(false);messageService.insert(message);JSONUtil.printByJSON(response, Result.success());} catch (Exception e) {e.printStackTrace();}}@Overridepublic List<Message> list() {SqlSession sqlSession = MybatisUtils.getSqlsession();MessageMapper mapper = sqlSession.getMapper(MessageMapper.class);List<Message> messages = mapper.selectMsg();sqlSession.commit();sqlSession.close();return messages;}

? ? ? ? b、查看查詢結果

????????在搜索框中輸入自己想要查詢的內容后點擊回車鍵即可完成查詢操作,對應的查詢結果會顯示輸出到頁面中,對應的查詢結果界面如圖2-3所示:

圖2-3?查詢結果界面

????????核心代碼:

<c:forEach items="${messages}" var="msg"><div class="box box-default" style="background: rgba(255, 255, 255, 0.5)"><div class="box-header with-border"><h2 class="box-title"><b>${msg.nickname}在<fmt:formatDate value="${msg.createTime}" pattern="yyyy年MM月dd日HH:mm:ss"/>發布留言:</b></h2></div><div class="box-body" align="center"><b style="color: #00b3ee; font-size: 18px">${msg.msg}</b></div><c:if test="${msg.replyMessages != []}"><c:forEach items="${msg.replyMessages}" var="reply"><div class="box-footer"><b style="font-family: 黑體"><fmt:formatDate value="${reply.createTime}" pattern="yyyy年MM月dd日🚀🚀HH:mm:ss"/>回復:${reply.msg}</b></div></c:forEach></c:if><c:if test="${user != null}"><div class="box-footer" style="text-align: center"><button type="button" class="btn btn-danger" data-dismiss="modal" onclick="deletemsg('${msg.id}')">刪除</button><button type="button" class="btn btn-primary" onclick="reply('${msg.id}')">回復</button>
</div></c:if></div></c:forEach>

(3)留言本鏈接跳轉

? ? ? ? a、B站課程錄播

????????在頁面的最下方添加了B站的鏈接鍵入模塊,可以通過點擊進入到該留言本的設計實現錄播視頻中,對應的B站課程錄播界面如圖2-4所示:

圖2-4?B站課程錄播界面

????????核心代碼:

<div align="center"><strong><b><b style="color: #0d6aad; margin-left: 30px">設計者:</b>于立偉<b style="color: #720e9e; margin-left: 30px">QQ郵箱:<a href="https://mail.qq.com/">3443531275@qq.com</a></b><b style="color: #720e9e; margin-left: 30px">手機號:13830758370</b><b style="color: rgba(12,32,150,0.29); margin-left: 30px">CO:啟 <img src="./image/logoYW.jpg" style="border-radius: 50%" width="20px" height="20px"/> 航</b><b style="color: #720e9e; margin-left: 30px">B站視頻號:<a href="https://www.bilibili.com/video/BV1mh4y1M7id/">尾鯉魚</a></b></b></strong></div>

? ? ? ? b、QQ郵箱發布

????????在頁面的最下方添加了QQ郵箱的鏈接鍵入模塊,可以通過點擊進入到QQ郵箱進行相關信息內容的上傳發布操作,對應的QQ郵箱發布界面如圖2-5所示:

圖2-5?QQ郵箱發布界面

????????核心代碼:

<div align="center"><strong><b><b style="color: #0d6aad; margin-left: 30px">設計者:</b>于立偉<b style="color: #720e9e; margin-left: 30px">QQ郵箱:<a href="https://mail.qq.com/">3443531275@qq.com</a></b><b style="color: #720e9e; margin-left: 30px">手機號:13830758370</b><b style="color: rgba(12,32,150,0.29); margin-left: 30px">CO:啟 <img src="./image/logoYW.jpg" style="border-radius: 50%" width="20px" height="20px"/> 航</b><b style="color: #720e9e; margin-left: 30px">B站視頻號:<a href="https://www.bilibili.com/video/BV1mh4y1M7id/">尾鯉魚</a></b></b></strong></div>

3、留言本登錄模塊功能實現

(1)留言本登錄驗證

? ? ? ? a、賬號密碼驗證失敗

????????在用戶進行留言本登錄的時候,通過用戶在輸入框中輸入的信息進行對應的輸入內容校驗,并將不符合的信息進行輸出提示,對應的賬號密碼驗證失敗界面如圖3-1所示:

圖3-1?賬號密碼驗證失敗界面

????????核心代碼:

$('#login_form').bootstrapValidator({excluded: [':disabled', ':hidden', ':not(:visible)'],//默認指定不驗證的情況message : 'This value is not valid',feedbackIcons : {valid : 'glyphicon glyphicon-ok',invalid : 'glyphicon glyphicon-remove',validating : 'glyphicon glyphicon-refresh'},fields : {name: { ?/*鍵名username和input name值對應*/message: '用戶名不能為空',validators: {notEmpty: { /*非空提示*/message: '用戶名必填不能為空'},stringLength: { /*長度提示*/min: 3,max: 30,message: '用戶名長度不能小于3位或超過30位'},regexp: { /*正則校驗*/regexp: /^[a-zA-Z0-9_\.]+$/,message: '用戶名只能由字母、數字、點和下劃線組成。'},}},password: {message:'密碼無效',validators: {notEmpty: {message: '密碼不能為空'},stringLength: {min: 3,max: 15,message: '密碼長度必須在3到15之間'}}},}});

? ? ? ? b、賬號密碼驗證成功

????????用戶將登錄信息全部按照登錄提示修改后會在每個文本框的最后出現綠色的小勾,從而表示輸入信息均已正確,對應的賬號密碼驗證成功界面如圖3-2所示:

圖3-2?賬號密碼驗證成功界面

????????核心代碼:

name: { ?/*鍵名username和input name值對應*/message: '用戶名不能為空',validators: {notEmpty: { /*非空提示*/message: '用戶名必填不能為空'},stringLength: { /*長度提示*/min: 3,max: 30,message: '用戶名長度不能小于3位或超過30位'},regexp: { /*正則校驗*/regexp: /^[a-zA-Z0-9_\.]+$/,message: '用戶名只能由字母、數字、點和下劃線組成。'},}},password: {message:'密碼無效',validators: {notEmpty: {message: '密碼不能為空'},stringLength: {min: 3,max: 15,message: '密碼長度必須在3到15之間'}}}

(2)留言本登錄成功

????????登錄內容全部輸入成功后即可進行對應賬號的登錄操作,對應的留言本登錄成功界面如圖3-3所示:

圖3-3?留言本登錄成功界面

????????核心代碼:

@RequestMapping("/login.do")public void login(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding("UTF-8");String name = request.getParameter("name");String password = request.getParameter("password");User user = userService.login(name, password);request.getSession().setAttribute("user", user);if (Objects.nonNull(user)) {JSONUtil.printByJSON(response, Result.success());}JSONUtil.printByJSON(response, Result.fail());} catch (UnsupportedEncodingException e) {e.printStackTrace();}}

(3)留言本登錄退出

????????用戶發布完畢自己的留言信息后可以點擊頁面右上角自己的用戶名進行登錄退出的操作,對應的留言本登錄退出界面如圖3-4所示:

圖3-4?留言本登錄退出界面

????????核心代碼:

@RequestMapping("/out.do")public void out(HttpServletRequest request, HttpServletResponse response) {request.getSession().removeAttribute("user");JSONUtil.printByJSON(response, Result.success());}$('#login_form').bootstrapValidator({excluded: [':disabled', ':hidden', ':not(:visible)'],//默認指定不驗證的情況message : 'This value is not valid',feedbackIcons : {valid : 'glyphicon glyphicon-ok',invalid : 'glyphicon glyphicon-remove',validating : 'glyphicon glyphicon-refresh'}

4、留言本發布留言模塊功能實現

(1)留言本發布留言內容驗證

? ? ? ? a、昵稱驗證失敗

????????用戶點擊發布留言后會彈出對應的發布留言信息彈窗,在對應的輸入框中按照提示信息填入自己的信息和留言內容即可,如果自己的昵稱輸入有問題則會提示“輸入內容必須為字母、數字、點和下劃線”,對應的昵稱驗證失敗界面如圖4-1所示:

圖4-1?昵稱驗證失敗界面

????????核心代碼:

fields : {nickname: { ?/*鍵名username和input name值對應*/validators: {notEmpty: { /*非空提示*/message: '用戶名必填不能為空'},StringLength: { /*長度提示*/min: 3,max: 30,message: '用戶名長度不能小于3位或超過30位'},regexp: { /*正則校驗*/regexp: /^[a-zA-Z0-9_\.]+$/,message: '用戶名只能由字母、數字、點和下劃線組成。'},}}

? ? ? ? b、郵箱驗證失敗

????????如果自己的郵箱輸入框中沒有填寫郵箱號的話會提示“郵箱不能為空”,對應的郵箱驗證失敗界面如圖4-2所示:

圖4-2?郵箱驗證失敗界面

????????核心代碼:

qq: {validators: {notEmpty: {message: 'qq不能為空'},digits:{ // 純數字驗證message: 'qq只能是數字'},stringLength: {min: 3,max: 15,message: 'qq長度必須在3到15之間'}}},email: {validators: {notEmpty: {message: '郵箱不能為空'},emailAddress:{ // 郵箱驗證message: '請輸入正確的郵箱'},stringLength: {min: 3,max: 15,message: 'qq長度必須在3到15之間'}}}

? ? ? ? b、發布留言內容驗證成功

????????用戶將留言信息全部按照留言信息提示修改后會在每個文本框的最后出現綠色的小勾,從而表示輸入信息均已正確,對應的發布留言內容驗證成功界面如圖4-3所示:

圖4-3?發布留言內容驗證成功界面

????????核心代碼:

msg : {validators : {notEmpty : {message : '留言內容必填'},stringLength : {min : 2,max : 200,message : '留言長度必須2-200字符'}}}

(2)留言本留言發布

? ? ? ? a、留言本留言信息

????????將必須要填寫的個人信息填寫無誤后即可進行留言內容的填寫,將對應的留言內容填寫到留言內容輸入框中即可,對應的留言本留言信息界面如圖4-4所示:

圖4-4?留言本留言信息界面

????????核心代碼:

@RequestMapping("/insert.do")public void insert(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding("UTF-8");String nickname = request.getParameter("nickname");String qq = request.getParameter("qq");String email = request.getParameter("email");String msg = request.getParameter("msg");Message message = new Message();message.setEmail(email);message.setMsg(msg);message.setNickname(nickname);message.setQq(qq);message.setType(true);messageService.insert(message);JSONUtil.printByJSON(response, Result.success());} catch (UnsupportedEncodingException e) {e.printStackTrace();}}@Overridepublic void insert(Message message) {SqlSession sqlSession = MybatisUtils.getSqlsession();MessageMapper mapper = sqlSession.getMapper(MessageMapper.class);mapper.insert(message);sqlSession.commit();sqlSession.close();}

? ? ? ? b、留言本留言發布成功

????????留言信息填寫完畢后即可點擊彈窗中的提交留言按鈕進行留言信息的發布操作,對應的留言本留言發布成功界面如圖4-5所示:

圖4-5?留言本留言發布成功界面

????????核心代碼:

<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content" style="background-image: url('../image/background.png')"><div class="modal-header"><h2 class="modal-title" id="exampleModalLabel" align="center" style="color: #720e9e">發布留言</h2></div><div class="modal-body"><form id="msg_form"><div class="form-group"><label for="nickname">昵稱</label><input style="background-color: #d3dcda" type="text" class="form-control" placeholder="請輸入您的昵稱" id="nickname" name="nickname" aria-describedby="emailHelp"></div><div class="form-group"><label for="QQ">QQ</label><input style="background-color: #d3dcda" type="text" class="form-control" placeholder="請輸入您的QQ號" id="qq" name="qq"></div><div class="form-group"><label for="email">郵箱</label><input style="background-color: #d3dcda" type="text" class="form-control" placeholder="請輸入您的郵箱號" id="email" name="email"></div><div class="form-group"><label for="msg">內容</label><textarea style="background-color: #d3dcda" class="form-control" id="msg" placeholder="請輸入發表的內容信息" name="msg" rows="3"></textarea></div></form></div><div class="modal-footer" style="text-align: center"><button type="button" class="btn btn-secondary" data-dismiss="modal">關閉</button><button type="button" class="btn btn-primary" id="send_btn">發布留言</button></div></div></div></div>

5、留言本留言回復模塊功能實現

(1)留言本留言回復信息

????????用戶登錄留言本后可以對所有的留言信息進行回復評論操作,點擊留言框中的回復按鈕即可進行回復內容的填寫,對應的留言本留言回復信息界面如圖5-1所示:

圖5-1?留言本留言回復信息界面

????????核心代碼:

@RequestMapping("/reply.do")public void reply(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding("UTF-8");String id = request.getParameter("id");String msg = request.getParameter("replyMsg");Message message = new Message();message.setReplyId(Integer.parseInt(id));message.setMsg(msg);message.setType(false);messageService.insert(message);JSONUtil.printByJSON(response, Result.success());} catch (Exception e) {e.printStackTrace();}}@Overridepublic void insert(Message message) {SqlSession sqlSession = MybatisUtils.getSqlsession();MessageMapper mapper = sqlSession.getMapper(MessageMapper.class);mapper.insert(message);sqlSession.commit();sqlSession.close();}

(2)留言本留言回復發布成功

????????回復內容填寫完畢后即可點擊回復彈窗中的發布按鈕進行回復信息的發布,對應的留言本留言回復發布成功界面如圖5-2所示:

圖5-2?留言本留言回復發布成功界面

????????核心代碼:

$("#reply_btn").click(function () {let txt = $("#reply_form").serialize()let id = $("#id").val()let data = txt + '&id=' + idfetch("/message/reply.do", {method:"post",headers:{'Content-type':'application/x-www-form-urlencoded'},body:data}).then(res => {return res.json()}).then(data => {if (data.success) {location.reload()$('#replyModal').modal('hide')}})})

6、留言本刪除留言模塊功能實現

(1)留言本留言刪除驗證

????????如果自己的留言發布后感覺有問題需要刪除只需要點擊留言框中的刪除按鈕進行留言刪除即可,但是為了確保無誤刪除時需要進行刪除驗證操作,對應的留言本留言刪除驗證界面如圖6-1所示:

圖6-1?留言本留言刪除驗證界面

????????核心代碼:

@RequestMapping("/delete.do")public void delete(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {request.setCharacterEncoding("UTF-8");String id = request.getParameter("id");messageService.deleteById(Integer.parseInt(id));JSONUtil.printByJSON(response,Result.success());}@Overridepublic void deleteById(int parseInt) {SqlSession sqlSession = MybatisUtils.getSqlSession();MessageMapper mapper = sqlSession.getMapper(MessageMapper.class);mapper.deleteByPrimaryKey(parseInt);mapper.deleteByReplyId(parseInt);sqlSession.commit();sqlSession.close();}

(2)留言本留言刪除成功

????????如果確認要刪除該條留言的話在二次確認的窗口中點擊確認按鈕即可進行該條記錄的刪除操作,對應的留言本留言刪除成功界面如圖6-2所示:

圖6-2?留言本留言刪除成功界面

????????核心代碼:

function deleteModal(id) {mid = id;$("#deleteModal").modal('show')}$("#delete_btn").click(function () {let data = 'id='+midfetch("/message/delete.do",{method:"post",headers:{'Content-type':'application/x-www-form-urlencoded'},body:data}).then(res=>{return res.json()}).then(data =>{if (data.success) {location.reload()$('#deleteModal').modal('hide')}})});

五、遇到的問題和解決方法

????????1、運行問題:啟動Tomcat的過程中,出現端口被占用的情況。

解決方法:對服務器進行配置,將服務器運行的端口號改為別的端口即可(找到Tomcat安裝目錄下的文件“/conf/server.xml”->使用記事本或寫字板打開文件,在文件中找到“Connector port=8080”->將“8080”改為“8888”,然后保存配置文件->重啟Tomcat服務器)。

????????2、運行問題:代碼編寫完成后進行運行發現網頁無法進行頁面加載,顯示頁面請求失敗。

解決方法:由于沒有在Tomcat服務器上進行運行所導致,先運行服務器然后再運行代碼后頁面可以正常加載。

????????3、項目問題:JSP頁面中遇到編碼問題。

解決方法:可以先檢查JSP頁面、JavaBean以及數據庫的編碼設置是否一致,可以手動在代碼中設置編碼格式,也可以在web.xml文件中配置全局的編碼過濾器。

????????4、項目問題:JSP頁面無法正確地顯示數據。

解決方法:檢查JSP頁面中是否包含錯誤的HTML標簽、CSS樣式或JavaScript代碼,這些代碼可能會干擾數據的顯示,也可以檢查JavaBean中的數據是否被正確地存儲、處理和輸出。

????????5、項目問題:JSP頁面無法獲取到JavaBean中的數據。

解決方法:確保JavaBean中需要獲取的數據已經被正確地賦值,可以在JSP頁面中使用EL表達式或者使用Java代碼片段的方式獲取數據。

????????6、項目問題:JSP頁面中的表單無法提交。

解決方法:檢查表單中的請求方法是否正確,是否存在未填寫的必填項,是否存在重復的表單參數等錯誤,同時也可以檢查網絡連接是否正常。

????????7、項目問題:頁面跳轉異常。

解決方法:檢查代碼實現,確保頁面跳轉的 URL 是否正確,是否遺漏了必要的轉發或者重定向操作;另外還可以通過在瀏覽器中查看控制臺日志來定位問題。

????????8、項目問題:請求參數獲取失敗。

解決方法:檢查代碼實現,確保請求參數的名稱、類型和格式都與服務器端代碼中一致,還可以通過在瀏覽器中查看網絡請求信息來定位問題。

????????9、項目問題:項目運行后頁面出現了404錯誤。

解決方法:由于在連接數據庫的配置文件中數據庫名錯誤導致的,將數據庫的名字修改為自己的數據庫名稱后再次啟動錯誤消息。

????????10、項目問題:項目運行后頁面出現了500錯誤。

解決方法:由于沒有把類名寫到配置文件的中,所以Tomcat就找不該類,此時我們把類名加入進去就可以正常訪問了。


六、心得體會

????????1、基于MyBatis的留言本項目為我提供了寶貴的軟件開發和數據庫操作經驗,通過這個項目我深入了解了MyBatis這一優秀的持久層框架,并在實踐中獲得了一些獨特的見解。MyBatis的靈活性和強大性給我留下了深刻的印象,它支持定制化SQL、存儲過程以及高級映射,這使得開發者可以更加便捷地操作數據庫。

????????2、利用MyBatis的映射特性,將數據庫表中的字段與Java對象進行了對應,通過使用MyBatis提供的映射文件,我可以輕松地實現對數據庫的增、刪、改、查等操作。此外MyBatis還支持動態SQL,可以在運行時根據參數動態生成SQL語句,使得操作數據庫更加靈活。

????????3、在開發過程中,由于留言本項目的數據量較大,如果直接使用MyBatis的默認查詢方式,可能會影響性能。為了解決這個問題我研究了MyBatis提供的分頁查詢功能,通過在SQL語句中加入分頁參數,MyBatis可以自動生成對應的分頁SQL語句,大大提高了查詢效率。

????????4、由于數據庫表結構經常變化,我需要頻繁地更新MyBatis的映射文件,為了解決這個問題我深入研究了MyBatis的動態映射特性。通過在映射文件中使用動態SQL語句,我可以根據數據庫表的實際結構自動生成對應的映射文件,避免了因表結構變化而導致的錯誤。

????????5、制作基于MyBatis留言本的項目讓我深入了解了MyBatis框架的使用和原理,同時也在實踐中獲得了寶貴的經驗。在這個過程中我不僅學會了如何使用MyBatis進行數據庫操作,還學會了如何解決實際開發中遇到的問題。通過這個項目我深刻體會到了MyBatis在持久層框架中的優勢以及在項目開發中的重要性。

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

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

相關文章

ARM匯編編程(AArch64架構) - 第14課:安全擴展(ARM TrustZone)

目錄1. TrustZone基礎概念1.1 安全擴展架構1.2 關鍵組件2. 世界切換機制2.1 狀態切換流程2.2 關鍵寄存器配置3. SMC調用實現3.1 調用規范3.2 完整調用流程4. 實戰練習4.1 實驗&#xff1a;實現雙世界通信4.2 調試技巧1. TrustZone基礎概念 1.1 安全擴展架構 startuml rectang…

OpenCV哈希算法------Marr-Hildreth 邊緣檢測哈希算法

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該類實現了 Marr-Hildreth 邊緣檢測哈希算法&#xff08;Marr-Hildreth Hash&#xff09;&#xff0c;用于圖像相似性比較。它基于 Marr-Hildreth …

【git#5】遠程操作 標簽管理

&#x1f4c3;個人主頁&#xff1a;island1314 ?? 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活總是不會一帆風順&#xff0c;前進的道路也不會永遠一馬平川&#xff0c;如何面…

如何使用 Python 刪除 Excel 中的行、列和單元格 – 詳解

目錄 開發環境準備 使用 Python 刪除 Excel 表格中的行 刪除特定行 刪除空白行 刪除含指定數據的行 使用 Python 刪除 Excel 表格中的列 刪除特定列 刪除空白列 刪除含指定數據的列 使用 Python 刪除 Excel 中的單元格并自動移動剩余內容 刪除特定單元格 刪除空白單…

箭頭函數(Arrow Functions)和普通函數(Regular Functions)

在 JavaScript 中&#xff0c;箭頭函數&#xff08;Arrow Functions&#xff09;和普通函數&#xff08;Regular Functions&#xff09;有以下主要區別&#xff1a;1. 語法箭頭函數&#xff1a;使用 > 語法&#xff0c;更簡潔&#xff0c;可省略 function 和 return&#xf…

Spring Boot 配置注解處理器 - spring-boot-configuration-processor

前言 在 Spring Boot 開發中&#xff0c;配置屬性的管理是構建企業級應用的核心環節。Spring Boot 通過 ConfigurationProperties 注解提供了一種類型安全的方式&#xff0c;將配置文件中的屬性綁定到 Java 對象中。然而&#xff0c;開發者在使用過程中常會遇到配置屬性無自動補…

java: DDD using oracle 21c

項目結構&#xff1a;domain:/*** encoding: utf-8* 版權所有 2025 ©涂聚文有限公司 * 許可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎* 描述&#xff1a;* Author : geovindu,Geovin Du 涂聚文.* IDE : IntelliJ IDEA 2024…

兩張圖片對比clip功能

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>圖片拖動Clip對比功能</title><style&g…

7.11 dp 圖

lcr148.棧按放入順序推棧&#xff0c;能彈出的就及時彈出&#xff0c;最后棧空則符合要求。判斷 takeOut 序列是否符合棧的操作邏輯&#xff0c;因為題目中“特殊的數據結構”其實就是棧&#xff08;先進后出&#xff09;。思路如下&#xff1a;1. 用一個棧來模擬圖書放入的過程…

react16-react19都更新哪些內容?

React 16 到 React 19 是 React 發展非常關鍵的階段&#xff0c;每個版本都帶來了深遠影響。以下是 React 16 → 19 的重要更新列表&#xff0c;按版本詳細說明每一代的核心特性、重要變化、對開發者的意義&#xff0c;并附簡評&#xff1a;? React 16&#xff08;2017 年&…

【AI大模型】RAG系統組件:向量數據庫(ChromaDB)

RAG 系統中的關鍵組件&#xff1a;向量數據庫&#xff08;Vector Database&#xff09;&#xff0c;并以 ChromaDB 為例進行說明。什么是向量數據庫&#xff1f;核心概念&#xff1a; 向量數據庫是一種專門設計用于高效存儲、索引和檢索高維向量的數據庫。向量是什么&#xff1…

006_測試評估與安全實踐

測試評估與安全實踐 目錄 建立成功標準評估方法測試策略安全最佳實踐隱私保護性能監控 建立成功標準 定義原則 1. 具體明確 清晰定義精確目標避免模糊表述如"良好性能"制定可操作的標準 不好的標準&#xff1a; 模型應該表現良好好的標準&#xff1a; 情感分…

時序預測 | Pytorch實現CNN-KAN電力負荷時間序列預測模型

預測效果 代碼功能 該代碼實現了一個結合卷積神經網絡&#xff08;CNN&#xff09;和Kolmogorov–Arnold網絡&#xff08;KAN&#xff09;的混合模型&#xff08;CNN-KAN&#xff09;&#xff0c;用于時間序列預測任務。核心功能包括&#xff1a; 數據加載與預處理&#xff1…

UI前端與數字孿生結合實踐探索:智慧物流的倉儲優化與管理系統

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;倉儲管理的 “數字孿生革命”傳統物流倉儲正面臨 “效率瓶頸、可視化差、響應滯…

【Android】在平板上實現Rs485的數據通訊

前言 在工業控制領域&#xff0c;Android 設備通過 RS485 接口與 PLC&#xff08;可編程邏輯控制器&#xff09;通信是一種常見的技術方案。最近在實現一個項目需要和plc使用485進行通訊&#xff0c;記錄下實現的方式。 我這邊使用的從平的Android平板&#xff0c;從平里面已經…

MySQL技術筆記-備份與恢復完全指南

目錄 前言 一、備份概述 &#xff08;一&#xff09;備份方式 &#xff08;二&#xff09;備份策略 二、物理備份及恢復 &#xff08;一&#xff09;備份操作 &#xff08;二&#xff09;恢復操作 三、邏輯備份及恢復 &#xff08;一&#xff09;邏輯備份 &#xff0…

SpringBoot或OpenFeign中 Jackson 配置參數名蛇形、小駝峰、大駝峰、自定義命名

SpringBoot或OpenFeign中 Jackson 配置參數名蛇形、小駝峰、大駝峰、自定義命名 前言 在調用外部接口時&#xff0c;對方給出的接口文檔中&#xff0c;入參參數名一會大寫加下劃線&#xff0c;一會又是駝峰命名。 示例如下&#xff1a; {"MOF_DIV_CODE": "xx…

uni-app 途徑站點組件開發與實現分享

在移動應用開發中&#xff0c;涉及到出行、物流等場景時&#xff0c;途徑站點的展示是一個常見的需求。本文將為大家分享一個基于 uni-app 開發的途徑站點組件&#xff0c;該組件能夠清晰展示路線中的各個站點信息&#xff0c;包括站點名稱、到達時間、是否已到達等狀態&#x…

kotlin中集合的用法

從一個實際應用看起以下kotlin中代碼語法正確嗎 var testBeanAIP0200()var testList:List<AIP0200> ArrayList()testList.add(testBean)這段Kotlin代碼存在語法錯誤&#xff0c;主要問題在于&#xff1a;List<AIP0200> 是Kotlin中的不可變集合接口&#xff0c;不能…

深入理解 Java Map 與 Set

文章目錄前言1. 搜索樹1.1 什么是搜索樹1.2 查找1.3 插入1.4 刪除情況一&#xff1a;cur 沒有子節點&#xff08;即為葉子節點&#xff09;情況二&#xff1a;cur 只有一個子節點&#xff08;只有左子樹或右子樹&#xff09;情況三&#xff1a;cur 有兩個子節點&#xff08;左右…