深入MyBatis:CRUD操作與高級查詢實戰

引言

在上一篇文章中,我們介紹了Mybatis的基礎使用。

如有需要請移步查看:

MyBatis入門:快速掌握用戶查詢實戰https://blog.csdn.net/qq_52331401/article/details/149270402?spm=1001.2014.3001.5502

今天,我將通過一個完整的用戶管理系統示例,深入講解Mybatis的CRUD操作、參數傳遞、模糊查詢以及聚合函數等高級功能。

項目升級概覽

相比基礎版本,本次項目增加了以下功能:

  1. 完整的CRUD操作(增刪改查)
  2. 多種查詢方式(ID查詢、模糊查詢)
  3. 聚合函數使用
  4. 數據庫連接信息外部化配置
  5. 更規范的測試類結構

核心代碼解析

實體類(User.java)

實體類保持不變,作為數據載體:

public class User implements Serializable {private Integer id;private String username;private Date birthday;private String sex;private String address;// 省略getter/setter和toString方法
}

Mapper接口(UserMapper.java)

接口中定義了完整的CRUD操作方法:

public interface UserMapper {List<User> findAll();          // 查詢所有用戶User findById(Integer userId); // 根據ID查詢void insert(User user);        // 新增用戶void update(User user);        // 修改用戶void delete(Integer userId);   // 刪除用戶List<User> findByName(String username); // 模糊查詢Integer findByCount();         // 查詢總數
}

Mapper XML配置(UserMapper.xml)

對應接口的SQL實現:

<mapper namespace="cn.tx.mapper.UserMapper"><!-- 查詢所有 --><select id="findAll" resultType="cn.tx.domain.User">select * from user</select><!-- ID查詢 --><select id="findById" resultType="cn.tx.domain.User" parameterType="int">select * from user where id = #{id}</select><!-- 新增用戶(返回自增ID) --><insert id="insert" parameterType="cn.tx.domain.User"><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select last_insert_id()</selectKey>insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})</insert><!-- 更新用戶 --><update id="update" parameterType="cn.tx.domain.User">update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}</update><!-- 刪除用戶 --><delete id="delete" parameterType="Integer">delete from user where id=#{id}</delete><!-- 模糊查詢(兩種方式) --><select id="findByName" resultType="cn.tx.domain.User" parameterType="string"><!-- select * from user where username like #{username} -->select * from user where username like '%${value}%'</select><!-- 查詢總數 --><select id="findByCount" resultType="int">select count(*) from user</select>
</mapper>

配置文件優化

數據庫連接信息向上提取到jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis_db
jdbc.username=root
jdbc.password=123456

SqlMapConfig.xml引用外部配置:

<configuration><properties resource="jdbc.properties"/><!-- 其他配置 --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource>
</configuration>

測試類詳解

測試類采用JUnit4,使用@Before和@After優化:

public class UserTest {private InputStream in;private SqlSession session;private UserMapper mapper;@Beforepublic void init() throws Exception {in = Resources.getResourceAsStream("SqlMapConfig.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);session = factory.openSession();mapper = session.getMapper(UserMapper.class);}@Afterpublic void destory() throws IOException {session.close();in.close();}// 測試方法...
}

查詢測試

@Test
public void testFindAll() {List<User> list = mapper.findAll();list.forEach(System.out::println);
}@Test
public void testFindById() {User user = mapper.findById(1);System.out.println(user);
}

增刪改測試

@Test
public void testInsert() {User user = new User();user.setUsername("測試用戶");user.setBirthday(new Date());user.setSex("男");user.setAddress("北京");mapper.insert(user);session.commit(); // 增刪改需要提交事務System.out.println("新增ID:" + user.getId());
}@Test
public void testUpdate() {User user = mapper.findById(41);user.setUsername("修改后的名字");mapper.update(user);session.commit();
}@Test
public void testDelete() {mapper.delete(48);session.commit();
}

高級查詢測試

// 模糊查詢方式一:參數中帶%
@Test
public void testFindByName() {List<User> list = mapper.findByName("%王%");list.forEach(System.out::println);
}// 模糊查詢方式二:SQL中使用${value}
// 注意:這種方式有SQL注入風險,不推薦@Test
public void testFindByCount() {Integer count = mapper.findByCount();System.out.println("用戶總數:" + count);
}

關鍵技術點解析

參數傳遞

  • 簡單類型:#{參數名}
  • 對象類型:#{屬性名}

模糊查詢兩種方式

  • 安全方式:like #{參數}(需要在參數中包含%)
  • 拼接方式:like ‘%${value}%’(有SQL注入風險)

返回自增ID

<selectKey keyProperty="id" order="AFTER" resultType="int">select last_insert_id()
</selectKey>

事務控制

  • 增刪改操作需要手動commit()
  • 可以再openSession時設置自動提交:openSession(true)

總結

MyBatis的靈活性和強大功能使其成為Java持久層開發的優秀選擇。希望這篇博客能幫助你深入理解MyBatis的核心用法!

完整代碼已提供,建議讀者實際運行測試類體會不同操作的效果。如有任何問題,歡迎留言討論。

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

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

相關文章

Flink DataStream API詳解(二)

一、引言 咱兩書接上回&#xff0c;上一篇文章主要介紹了DataStream API一些基本的使用&#xff0c;主要是針對單數據流的場景下&#xff0c;但是在實際的流處理場景中&#xff0c;常常需要對多個數據流進行合并、拆分等操作&#xff0c;以滿足復雜的業務需求。Flink 的 DataS…

Unity3D游戲線上崩潰排查指南

前言 排查Unity3D線上游戲崩潰是個系統工程&#xff0c;需要結合工具鏈、日志分析和版本管理。以下是詳細的排查指南和關鍵步驟&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗呀&#xff01; 一、崩潰信息收…

DPDK性能優化實踐:系統級性能調優的方法論與實戰(一套通用的方法論)

性能優化的挑戰與現實困境 在高性能網絡處理領域&#xff0c;性能優化往往被視為一門“玄學”而非科學。許多開發者在面對性能瓶頸時&#xff0c;要么盲目追求單一指標的極致優化&#xff0c;要么采用"試錯法"進行零散的局部調優&#xff0c;結果往往是投入大量精力卻…

Docker的/var/lib/docker/目錄占用100%的處理方法

文章目錄 一、問題描述 二、解決措施 三、可能遇到的問題 問題1、問題描述&#xff1a;執行 sudo systemctl stop docker 命令時&#xff0c;提示 Warning: Stopping docker.service, but it can still be activated by: docker.socket 問題2、問題描述&#xff1a;執行 s…

【UE教程/進階】Slate鏈式編輯原理

目錄鏈式編輯操作" . "操作" "操作" [ ] "鏈式編輯 SNew().&#xfeff;[] 操作" . " SLATE_ARGUMENT(ArgType, ArgName) 宏 調用宏 SLATE_PRIVATE_ARGUMENT_VARIABLE(ArgType, ArgName) &#xff0c;在FArgument結構體中添加了變量…

將手工建模模型(fbx、obj)轉換為3dtiles的免費工具!

文章目錄1、工具下載2、使用說明3、詳細說明命令行格式示例命令參數說明4、源碼地址1、工具下載 百度網盤下載鏈接 選擇最新版本下載即可&#xff0c;支持Linux和Windows系統 2、使用說明 1&#xff09;按住鍵盤winr鍵&#xff0c;在彈出的窗口中輸入cmd 2&#xff09;點擊…

FreeRTOS源碼學習之內核初始化

目錄 前言 一、主函數內容 二、osKernelInitialize ()內核初始化函數內容 三、IS_IRQ()宏定義中斷檢測函數內容 四、如果這篇文章能幫助到你&#xff0c;請點個贊鼓勵一下吧ξ( ?&#xff1e;??)~ 前言 使用STM32CubeMX添加FreeRTOS進入工程之后&#xff0c;會自動在ma…

Docker—— 鏡像構建原因

在現代軟件開發和運維中&#xff0c;Docker已成為一種非常流行的工具&#xff0c;它通過容器化應用程序來簡化部署過程。然而&#xff0c;默認的官方鏡像往往只能滿足基礎需求&#xff0c;無法涵蓋所有特定項目的具體要求。原因說明系統級改動無法通過 volume 實現修改用戶、刪…

鋰電池自動化生產線的現狀與發展

鋰電池自動化生產線的概述鋰電池自動化生產線是指采用自動化設備和控制系統&#xff0c;實現鋰電池從原材料到成品的全流程自動化生產過程。隨著新能源產業的快速發展&#xff0c;鋰電池作為重要的儲能元件&#xff0c;其生產制造技術也在不斷進步。自動化生產線通過減少人工干…

java底層的native和沙箱安全機制

沙箱安全機制沙箱&#xff08;Sandbox&#xff09;安全機制是一種將程序或代碼運行在隔離環境中的安全技術&#xff0c;旨在限制其對系統資源&#xff08;如文件系統、網絡、內存、其他進程等&#xff09;的訪問權限&#xff0c;從而降低潛在惡意代碼帶來的風險。其核心思想是“…

【分享】文件擺渡系統適配醫療場景:安全與效率兼得

根據國家信息安全相關法規要求&#xff0c;醫院為了網絡安全&#xff0c;大多會采用網閘等隔離手段&#xff0c;將網絡隔離為內網和外網&#xff0c;但網絡隔離后&#xff0c;醫院的內外網間仍存在較為頻繁的文件擺渡需求。文件擺渡系統則是可以解決跨網絡或跨安全域文件傳輸中…

vscode 中的 mermaid

一、安裝軟件 Mermaid preview Mermaid support 二、運行命令 創建.md 文件右鍵選擇 ?Open Preview?&#xff08;或按 CtrlShiftV&#xff09; 三、流程圖 注意&#xff1a; 要md 文件要保留 mermaid 1. #mermaid-svg-nchqbvlWePe5KCwJ {font-family:"trebuchet ms"…

微服務引擎 MSE 及云原生 API 網關 2025 年 6 月產品動態

點擊此處&#xff0c;了解微服務引擎 MSE 產品詳情。

【TCP/IP】7. IP 路由

7. IP 路由7. IP 路由概述7.1 直接傳遞與間接傳遞7.2 IP 路由核心機制7.3 路由表7.3.1 路由表的構成7.3.2 信宿地址采用網絡地址的好處7.3.3 下一跳地址的優勢7.3.4 特殊路由表項7.3.5 路由算法7.4 靜態路由7.4.1 特點7.4.2 自治系統&#xff08;AS&#xff09;7.4.3 配置命令7…

xFile:高性能虛擬分布式加密存儲系統——Go

xFile&#xff1a;高性能虛擬分布式加密存儲系統 目錄xFile&#xff1a;高性能虛擬分布式加密存儲系統1 背景介紹2 設計初衷與目標3 項目簡介4 系統架構5 核心優勢1. 真正的分布式塊存儲2. 塊級加密與壓縮&#xff0c;安全高效3. 靈活的索引與元數據管理4. 多用戶與權限體系5. …

時序數據庫:高效處理時間序列數據的核心技術

時序數據庫概述時序數據庫&#xff08;Time Series Database&#xff0c;TSDB&#xff09;是一種專門為存儲、處理和查詢時間序列數據而優化的數據庫系統。隨著物聯網、金融科技、工業互聯網等領域的快速發展&#xff0c;時序數據呈現出爆炸式增長&#xff0c;傳統的關系型數據…

面試官:你再問TCP三次握手,我就要報警了!

CP三次握手和四次揮手&#xff0c;是面試官最愛問的“開場白”之一 別看它基礎&#xff0c;真要講清楚細節&#xff0c;分分鐘讓你冷汗直流&#xff01; 這玩意兒就跟程序員相親一樣&#xff1a; 表面上問的是“你老家哪的” 實際上是在試探你有沒有房、有沒有車、能不能落…

RuoYi+Uniapp(uni-ui)開發商城系統

如果你正在考慮用 RuoYi 和 UniApp&#xff08;uni-ui&#xff09;搭建一套商城系統&#xff0c;那這套組合確實值得好好研究。它整合了 RuoYi 的快速開發能力和 UniApp 的跨平臺特性&#xff0c;在高效開發的同時還能兼顧多端適配的需求。下面從技術架構、功能模塊、開發實踐到…

面試150 二叉樹的最大高度

思路 考慮從遞歸出發&#xff0c;聯想遞歸三部曲&#xff1a;返回什么、傳入的參數是什么、遍歷的方式是什么。此題現在需要我們整個樹&#xff0c;并且需要從根節點出發&#xff0c;因此我們選擇先序遍歷即可。另一張辦法&#xff0c;則是選擇通過隊列實現層次遍歷&#xff0c…

從零實現一個GPT 【React + Express】--- 【2】實現對話流和停止生成

摘要 這是本系列文章的第二篇&#xff0c;開始之前我們先回顧一下上一篇文章的內容&#xff1a; 從零實現一個GPT 【React Express】— 【1】初始化前后端項目&#xff0c;實現模型接入SSE 在這一篇中&#xff0c;我們主要創建了前端工程和后端工程&#xff0c;這里貼一下我…