MyBatis 核心入門:從概念到實戰,一篇掌握簡單增刪改查

目錄

一、什么是 MyBatis?為什么要用它?

二、MyBatis 核心概念(通俗理解)

1.SqlSessionFactory

2.SqlSession

3.Mapper接口

4.映射文件(XML)

三、手把手搭建第一個 MyBatis 項目

1. 準備工作

2. 核心配置文件(mybatis-config.xml)

3. 編寫實體類(User.java)

4. 編寫 Mapper 接口(UserMapper.java)

5. 編寫映射文件(UserMapper.xml)

6. 編寫測試類(MyBatisTest.java)

四、核心知識點總結

1.參數傳遞

2.結果映射


一、什么是 MyBatis?為什么要用它?

MyBatis 是一款 Java 半自動化映射框架,核心作用是簡化數據庫操作。

對比傳統 JDBC:

  • 無需手動寫 Connection、Statement、ResultSet 等重復代碼 SQL 語句,減少了50%以上的代碼量。
  • 與 Java 代碼分離,便于維護和優化 自動完成數據庫字段與 Java 實體類的映射。
  • 提供映射標簽,支持對象與數據庫的 ORM 字段關系映射。

簡單說:用 MyBatis 寫數據庫操作,更簡單、更靈活

二、MyBatis 核心概念(通俗理解)

1.SqlSessionFactory

  • 數據庫連接的 “工廠”,通過核心配置文件創建
  • 作用:生產SqlSession(類似生產 “數據庫連接”,同樣也需要關閉資源)

2.SqlSession

  • 數據庫會話對象,相當于“數據庫連接”
  • 作用:獲取Mapper接口,執行SQL操作

3.Mapper接口

  • 定義數據庫操作方法(如 selectUserById、insertUser)
  • 無需實現類,MyBatis 會自動生成代理對象

4.映射文件(XML)

  • 存放 SQL 語句,與 Mapper 接口一一對應
  • 通過標簽(select/insert 等)綁定接口方法

三、手把手搭建第一個 MyBatis 項目

1. 準備工作

數據庫:MySQL,創建 user 表(附建表 SQL):

CREATE TABLE `user` (`id` int(11) PRIMARY KEY AUTO_INCREMENT,`username` varchar(50) NOT NULL,`age` int(3) DEFAULT NULL,`create_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

項目:Maven 工程,引入依賴(pom.xml):

<!-- MyBatis 核心包 -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version>
</dependency>
<!-- MySQL 驅動 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version>
</dependency>

2. 核心配置文件(mybatis-config.xml)

放在 resources 目錄下,配置數據庫連接和映射文件路徑:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><!-- 事務管理:JDBC 方式 --><transactionManager type="JDBC"/><!-- 數據源:連接池方式 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false"/><property name="username" value="root"/> <!-- 你的數據庫用戶名 --><property name="password" value="123456"/> <!-- 你的數據庫密碼 --></dataSource></environment></environments><!-- 映射文件路徑:指定 Mapper XML 位置 --><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

3. 編寫實體類(User.java)

屬性與表字段對應(建議用駝峰命名,如 createTime 對應表 create_time):

public class User {private Integer id;private String username;private Integer age;private LocalDateTime createTime;// 省略 getter、setter、toString 方法
}

4. 編寫 Mapper 接口(UserMapper.java)

定義數據庫操作方法:

public interface UserMapper {//查詢所有用戶List<User> selectAllUser();// 根據 ID 查詢用戶User selectById(Integer id);// 新增用戶int insert(User user);// 根據 ID 修改用戶int updateById(User user);// 根據 ID 刪除用戶int deleteById(Integer id);
}

5. 編寫映射文件(UserMapper.xml)

放在 resources/mapper 目錄下,綁定 Mapper 接口并寫 SQL:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 必須與 Mapper 接口全類名一致 -->
<mapper namespace="com.example.mapper.UserMapper"><!-- 查詢:id 與接口方法名一致,resultType 是返回類型 --><select id="selectById" resultType="com.example.pojo.User">select * from user where id = #{id}</select><!-- 新增:useGeneratedKeys 獲取自增主鍵,keyProperty 綁定實體類屬性 --><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into user(username, age, create_time)values(#{username}, #{age}, #{createTime})</insert><!-- 修改 --><update id="updateById">update user setusername = #{username},age = #{age}where id = #{id}</update><!-- 刪除 --><delete id="deleteById">delete from user where id = #{id}</delete>
</mapper>

#{}是一種常見的占位符語法, 用于將變量或表達式的結果嵌入到雙引號/單引號字符串中,自動轉換為字符串類型。(能夠有效防止sql注入問題)

6. 編寫測試類(MyBatisTest.java)

通過SqlSession執行操作:

public class MyBatisTest {public static void main(String[] args) throws IOException {// 1. 讀取核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");// 2. 創建 SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);// 3. 獲取 SqlSession(true 表示自動提交事務)SqlSession session = factory.openSession(true);// 4. 獲取 Mapper 接口代理對象UserMapper userMapper = session.getMapper(UserMapper.class);// 5. 執行 SQL 操作// 新增用戶User user = new User();user.setUsername("張三");user.setAge(20);user.setCreateTime(LocalDateTime.now());int insert = userMapper.insert(user);System.out.println("新增成功,影響行數:" + insert);System.out.println("新增的用戶 ID:" + user.getId()); // 自增 ID 會回顯// 查詢用戶(用上面新增的 ID)User queryUser = userMapper.selectById(user.getId());System.out.println("查詢結果:" + queryUser);// 修改用戶queryUser.setAge(21);int update = userMapper.updateById(queryUser);System.out.println("修改成功,影響行數:" + update);// 刪除用戶int delete = userMapper.deleteById(user.getId());System.out.println("刪除成功,影響行數:" + delete);// 6. 關閉會話session.close();}
}

四、核心知識點總結

1.參數傳遞

  • 單個參數:直接用 #{參數名}(如 #{id})
  • 多個參數:有兩種方法:(1)傳入參數時放入Map鍵值對,通過鍵名訪問值,達到傳入多個參數的目的;(2)傳入參數時將要傳入的值封裝到實體類中,通過訪問實體類屬性名傳入多個參數
  • 實體類參數:用 #{屬性名}(如 #{username} 對應 user.getUsername())

2.結果映射

  • 表字段與實體屬性名一致:用 resultType 直接指定實體類
  • 符合Mybatis定義映射規則:用 resultType 直接指定實體類,并且在mybatis-config.xml里面配置駝峰映射
  • 不一致:用 resultMap 手動映射
<settings><!--將數據庫中的下劃線映射為駝峰--><setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

位置放于mybatis-config.xml中<environments>前

<resultMap id="userMap" type="com.example.pojo.User"><id column="id" property="id"/> <!-- 主鍵 --><result column="username" property="username"/><result column="age" property="age"/><result column="create_time" property="createTime"/> <!-- 字段與屬性映射 -->
</resultMap>

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

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

相關文章

數據結構初階(12)排序算法—插入排序(插入、希爾)(動圖演示)

2. 常見排序算法的實現2.0 十大排序算法2.1 插入排序 2.1.1 基本思想直接插入排序是一種簡單的插入排序法&#xff1a;基本思想把待排序的記錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中。直到所有的記錄插入完為止&#xff0c;得到一個新的有序序列 。 比 挪 (…

MySQL優化常用的幾個方法

本實例是對慢sql從2萬優化到5千優化方法的匯總。 首先貼上優化效果&#xff1a;1、更新數據時使用ID更新&#xff1b;2、"分頁/輪詢"查詢時先獲取符合數據要求主鍵的最大和最小ID&#xff0c;然后WHERE條件增加ID步增查詢&#xff1b;3、檢查SQL是否命中WHERE條件&am…

深入解析 AUTOSAR:汽車軟件開發的革命性架構

引言在汽車智能化、網聯化、電動化浪潮席卷全球的今天&#xff0c;汽車電子系統的復雜性與日俱增。傳統“煙囪式”的 ECU 開發模式&#xff08;各供應商獨立開發軟硬件&#xff09;帶來了巨大的兼容性、復用性和維護成本挑戰。AUTOSAR&#xff08;AUTomotive Open System ARchi…

計算機視覺(opencv)實戰一——圖像本質、數字矩陣、RGB + 圖片基本操作(灰度、裁剪、替換等)

OpenCV 入門教程&#xff1a; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺庫&#xff0c;廣泛應用于圖像處理、視頻分析、機器學習等領域。 在 Python 中&#xff0c;cv2 是 OpenCV 的主要接口模塊。本文將帶你一步步掌握 cv2…

《探索C++ set與multiset容器:深入有序唯一性集合的實現與應用》

前引&#xff1a;在STL的關聯式容器中&#xff0c;set以其嚴格的元素唯一性和自動排序特性成為處理有序數據的核心工具。其底層基于紅黑樹&#xff08;Red-Black Tree&#xff09;實現&#xff0c;保證了O(log n)的查找、插入與刪除復雜度&#xff01;本文將從底層原理切入&…

各測試平臺功能對比分析(ITP,Postman,Apifox,MeterSphere)

對比ITP與Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口測試? 可視化接口調試&#xff0c;支持多種請求方式? 支持? 支持? 支持場景測試? 多接口串聯測試&#xff0c;支持前后置腳本? Collections功能? 支持? 支持定時任務? 基于Celery的定時…

開源日志log4cplus—如何將 string類型轉為tstring類型,又如何將char*類型轉換為tstring類型?

文章目錄&#x1f527; 一、理解 log4cplus::tstring 的本質?? 二、std::string 轉 tstring 的三種方法? 1. 使用內置宏 LOG4CPLUS_STRING_TO_TSTRING&#xff08;推薦&#xff09;? 2. 手動條件編譯轉換&#xff08;精細控制&#xff09;? 3. 多字節模式下的直接賦值??…

深度學習之CNN網絡簡介

CNN網絡簡單介紹 1.概述 卷積神經網絡&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一種專門用于處理具有網格狀結構數據的深度學習模型。 ? CNN網絡主要有三部分構成&#xff1a;卷積層、池化層和全連接層構成&#xff0c;其中卷積層負責提取圖像中…

【微實驗】基頻提取的MATLAB實現(優化版)

前情提要&#xff1a; 【超詳細】科普&#xff1a;別再只會用自相關&#xff01;YIN 和 PYIN 如何破解音頻隱藏密碼&#xff1f;-CSDN博客 【微實驗】媽媽我的MATLAB會識別聲音的基頻了&#xff01;-CSDN博客 今天用MATLAB把算法封裝成函數&#xff0c;然后調用對比結果。 …

開發 npm 包【詳細教程】(含發布 npm 包,版本號升級,修改包后重新發布等)

1. 給 npm 包取個【唯一】的名字&#xff01; npm 包命名規范 只能包含小寫字母&#xff08;a-z&#xff09;、數字&#xff08;0-9&#xff09;、連字符&#xff08;-&#xff09; 和 下劃線&#xff08;_&#xff09;&#xff0c;不能包含空格、大寫字母、標點符號&#xff…

Secure 第三天作業

實驗需求&#xff1a;1.參考以上拓撲所示&#xff0c;完成以下需求&#xff1a;1&#xff09; 配置各設備 IP 地址2&#xff09; 配置 ZBFW&#xff0c;Inside-1 和 nside-2 屬于內部 Zone&#xff0c;Outside-1 屬于外部 Zonezone security insidezone security outsidezone-p…

Linux應用層-5.計算機網絡(菜鳥學習筆記)

計算機網絡的核心是連接與通信&#xff0c;從底層的物理信號到上層的應用服務&#xff0c;各層協議協同工作---------------------------------------------------------------------------------------一.計算機網絡分類&#xff08;按范圍&#xff09;1?個人區域網&#xff…

[論文閱讀] 人工智能 + 軟件工程 | 大型語言模型對決傳統方法:多語言漏洞修復能力大比拼

大型語言模型對決傳統方法&#xff1a;多語言漏洞修復能力大比拼 論文閱讀&#xff1a;On the Evaluation of Large Language Models in Multilingual Vulnerability RepairarXiv:2508.03470 On the Evaluation of Large Language Models in Multilingual Vulnerability Repair…

計算機網絡2-3:傳輸方式

目錄 串行傳輸和并行傳輸 同步傳輸和異步傳輸 單工、半雙工以及全雙工通信 總結 串行傳輸和并行傳輸 并行傳輸的優點是速度為串行傳輸的n倍&#xff0c;但也存在一個嚴重的缺點即成本高 同步傳輸和異步傳輸 單工、半雙工以及全雙工通信 總結

文檔生成PPT軟件哪個好?深度測評8款word轉ppt生成工具

在日常辦公與教學場景中&#xff0c;如何高效地將Word文檔內容轉化為專業PPT&#xff0c;一直是職場人士、教育工作者及內容創作者的共同痛點。隨著AI技術的普及&#xff0c;一鍵式轉換工具應運而生&#xff0c;它們不僅能精準識別Word中的標題與段落結構&#xff0c;還能自動套…

Azimutt:一款免費開源的多功能數據庫工具

Azimutt 是一款支持數據庫設計、表結構探索與分析、數據查詢以及數據庫文檔生成功能的全棧工具。 Azimutt 是一個免費開源的項目&#xff0c;源代碼托管在 GitHub&#xff1a; https://github.com/azimuttapp/azimutt 功能特性 多數據庫支持&#xff1a;包括主流數據庫 MySQ…

智算賦能:移動云助力“世界一流數據強港”建設之路

2024年5月&#xff0c;某創新產業園區智算中心正式揭牌成立。臺下響起的掌聲不僅是對一個項目的祝賀&#xff0c;更是客戶對未來的期許—— 推動產業結構優化升級&#xff0c;領跑數字經濟轉型發展。5家500強企業、8家上市企業、17家獨角獸企業……該創新產業園區在成為“世界一…

達夢自定義存儲過程實現獲取表完整的ddl語句

--導出表的ddl CREATE OR REPLACE PROCEDURE show_create_table( db IN varchar(255), tb IN varchar(255)) ASsql1 text;ret text : ;cmt text :;sql2 text :; BEGINFOR WSX IN (select TABLEDEF(db,tb) as ddl from dual) LOOPret: ret||WSX.DDL;END LOOP;ret : ret||chr(10…

【ARM】keil提示UVISION: Error: Encountered an improper argument

1、 文檔目標 解決MDK退出debug模式后&#xff0c;提示UVISION: Error: Encountered an improper argument。 2、 問題場景 在退出Debug模式的時候&#xff0c;彈出提示窗口&#xff0c;提示&#xff1a;UVISION: Error: Encountered an improper argument。&#xff08;如圖…

【2025最新版】PDF24 Creator,PDF編輯,合并分割,格式轉換全能工具箱,本地離線版本,完全免費!

軟件介紹&#xff08;文末獲取&#xff09;這款軟件于1999年開發&#xff0c;至今已經有26年了&#xff0c;這26年里它都完全免費&#xff01;簡潔的操作界面&#xff0c;讓用戶輕松上手&#xff0c;高效完成 PDF 文件的處理&#xff0c;方便又實用。這次給大家帶來的是一個本地…