Java——MyBatis從入門到精通:一站式學習指南

MyBatis從入門到精通:一站式學習指南

作為一款優秀的半自動ORM框架,MyBatis以其靈活的SQL控制和簡潔的配置方式,成為Java后端開發中持久層框架的首選。本文將從基礎概念到高級特性,全面講解MyBatis的使用方法,包含實用代碼示例和最佳實踐。

一、MyBatis核心概念

1. 什么是MyBatis?

MyBatis是一款半自動ORM(對象關系映射)框架,本質是對JDBC的封裝。與全自動ORM框架(如Hibernate)不同,MyBatis需要開發者手動編寫SQL語句,但免除了JDBC中繁瑣的連接管理、參數設置和結果集解析工作。

其核心優勢在于:

  • 支持自定義SQL,便于復雜查詢和性能優化
  • 強大的結果映射能力,自動完成數據庫記錄與Java對象的轉換
  • 輕量靈活,易于集成Spring等主流框架
  • 適用于高并發、大數據量的互聯網項目

2. 核心組件

MyBatis的工作流程依賴于以下核心組件:

  • SqlSessionFactory:會話工廠,由SqlSessionFactoryBuilder根據配置文件創建,全局唯一
  • SqlSession:數據庫會話對象,用于執行SQL操作,生命周期為方法級
  • Mapper接口:定義數據庫操作方法的接口,無需實現類,MyBatis通過動態代理生成實現
  • 映射文件:存儲SQL語句和映射規則,與Mapper接口對應

二、環境搭建(Maven)

1. 引入依賴

pom.xml中添加MyBatis核心依賴和數據庫驅動:

<dependencies><!-- MyBatis核心包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!-- MySQL驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency><!-- 單元測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

2. 核心配置文件

創建mybatis-config.xml(放在resources目錄下),配置數據庫連接和映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 環境配置 --><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 注冊映射文件 --><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

三、基本CRUD操作

1. 定義實體類

創建與數據庫表對應的POJO類:

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

2. Mapper接口與映射文件

(1)Mapper接口
public interface UserMapper {// 查詢所有用戶List<User> findAll();// 根據ID查詢User findById(Integer id);// 新增用戶void add(User user);// 更新用戶void update(User user);// 刪除用戶void delete(Integer id);
}
(2)映射文件(UserMapper.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><!-- 查詢所有 --><select id="findAll" resultType="com.example.pojo.User">select * from user</select><!-- 根據ID查詢 --><select id="findById" parameterType="int" resultType="com.example.pojo.User">select * from user where id = #{id}</select><!-- 新增 --><insert id="add" parameterType="com.example.pojo.User">insert into user(username, sex, address) values(#{username}, #{sex}, #{address})</insert><!-- 更新 --><update id="update" parameterType="com.example.pojo.User">update user set username = #{username}, sex = #{sex}, address = #{address} where id = #{id}</update><!-- 刪除 --><delete id="delete" parameterType="int">delete from user where id = #{id}</delete>
</mapper>

3. 測試代碼

public class UserMapperTest {private SqlSession session;private UserMapper userMapper;@Beforepublic void init() throws IOException {// 讀取配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");// 創建SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);// 獲取SqlSessionsession = factory.openSession();// 獲取Mapper代理對象userMapper = session.getMapper(UserMapper.class);}@Testpublic void testFindAll() {List<User> users = userMapper.findAll();users.forEach(System.out::println);}@Testpublic void testAdd() {User user = new User();user.setUsername("張三");user.setSex("男");user.setAddress("北京");userMapper.add(user);session.commit(); // 手動提交事務}@Afterpublic void destroy() {session.close();}
}

注意:MyBatis的事務默認手動提交,執行增刪改操作后需調用session.commit()

四、動態SQL

動態SQL是MyBatis的強大特性,可根據條件動態生成SQL片段,避免手動拼接SQL的繁瑣和錯誤。

1. <if>標簽:條件判斷

<select id="findByCondition" parameterType="com.example.pojo.User" resultType="com.example.pojo.User">select * from user<where><if test="username != null and username != ''">and username like #{username}</if><if test="sex != null and sex != ''">and sex = #{sex}</if></where>
</select>
  • <where>標簽會自動處理多余的AND,替代傳統的where 1=1寫法

2. <foreach>標簽:遍歷集合

用于批量操作(如批量刪除):

<delete id="deleteBatch" parameterType="int">delete from user where id in<foreach collection="array" open="(" close=")" separator="," item="id">#{id}</foreach>
</delete>
  • collection:集合類型(數組用array,List用list
  • item:遍歷的元素名
  • open/close:SQL片段的開始/結束符
  • separator:元素間的分隔符

3. <choose>標簽:多條件分支

類似Java的switch-case

<select id="findByLevel" parameterType="User" resultType="User">select * from user<where><choose><when test="level == 1">and age &lt; 18</when><when test="level == 2">and age between 18 and 30</when><otherwise>and age &gt; 30</otherwise></choose></where>
</select>

五、緩存機制

MyBatis提供兩級緩存,用于減少數據庫交互,提高查詢效率。

1. 一級緩存

  • 作用域:SqlSession(會話級)
  • 特性:默認開啟,同一SqlSession內的相同查詢會復用緩存
  • 失效場景:執行增刪改操作、調用clearCache()commit()、關閉SqlSession
@Test
public void testL1Cache() {// 第一次查詢(從數據庫獲取)User user1 = userMapper.findById(1);// 第二次查詢(從一級緩存獲取)User user2 = userMapper.findById(1);System.out.println(user1 == user2); // true
}

2. 二級緩存

  • 作用域:SqlSessionFactory(應用級)
  • 特性:需手動開啟,同一工廠創建的SqlSession共享緩存
  • 要求:緩存的POJO需實現Serializable接口

開啟步驟:

  1. 配置全局開關(mybatis-config.xml):
<settings><setting name="cacheEnabled" value="true"/>
</settings>
  1. 在映射文件中聲明緩存:
<mapper namespace="com.example.mapper.UserMapper"><cache size="1024"/> <!-- 開啟二級緩存 --><!-- SQL語句... -->
</mapper>
  1. 實體類實現序列化:
public class User implements Serializable {// 字段和方法...
}

六、關聯查詢

MyBatis支持一對一、一對多等關聯查詢,通過<association><collection>標簽實現。

1. 一對一查詢(如學生-班級)

<resultMap id="studentMap" type="com.example.pojo.Student"><id property="id" column="sid"/><result property="name" column="sname"/><!-- 關聯班級對象 --><association property="clazz" column="cid" javaType="com.example.pojo.Clazz"><id property="id" column="cid"/><result property="name" column="cname"/></association>
</resultMap><select id="findStudentWithClazz" resultMap="studentMap">select s.id sid, s.name sname, c.id cid, c.name cnamefrom student s left join clazz c on s.cid = c.id
</select>

2. 一對多查詢(如班級-學生)

<resultMap id="clazzMap" type="com.example.pojo.Clazz"><id property="id" column="cid"/><result property="name" column="cname"/><!-- 關聯學生集合 --><collection property="students" column="cid" ofType="com.example.pojo.Student"><id property="id" column="sid"/><result property="name" column="sname"/></collection>
</resultMap><select id="findClazzWithStudents" resultMap="clazzMap">select c.id cid, c.name cname, s.id sid, s.name snamefrom clazz c left join student s on c.id = s.cid
</select>

七、MyBatis Generator自動生成代碼

MyBatis Generator(MBG)是官方代碼生成器,可根據數據庫表自動生成POJO、Mapper接口和映射文件,減少重復工作。

1. 配置MBG插件(pom.xml)

<build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.7</version><configuration><configurationFile>src/main/resources/generatorConfig.xml</configurationFile><overwrite>true</overwrite></configuration></plugin></plugins>
</build>

2. 編寫配置文件(generatorConfig.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration><!-- 數據庫驅動路徑 --><classPathEntry location="F:/maven/repository/mysql/mysql-connector-java/8.0.26/mysql-connector-java-8.0.26.jar"/><context id="mysql" targetRuntime="MyBatis3"><!-- 去除注釋 --><commentGenerator><property name="suppressAllComments" value="true"/></commentGenerator><!-- 數據庫連接 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mybatis_db"userId="root"password="root"/><!-- 生成POJO --><javaModelGenerator targetPackage="com.example.pojo" targetProject="src/main/java"/><!-- 生成映射文件 --><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/><!-- 生成Mapper接口 --><javaClientGenerator type="XMLMAPPER"targetPackage="com.example.mapper"targetProject="src/main/java"/><!-- 指定表 --><table tableName="user"/></context>
</generatorConfiguration>

3. 運行生成命令

在Maven插件中執行mybatis-generator:generate,自動生成以下文件:

  • User.java:POJO類
  • UserMapper.java:Mapper接口
  • UserMapper.xml:映射文件
  • UserExample.java:復雜查詢條件構建類

八、分頁插件PageHelper

PageHelper是MyBatis常用的分頁插件,可簡化分頁查詢實現。

1. 引入依賴

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.0</version>
</dependency>

2. 配置插件(mybatis-config.xml)

<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/></plugin>
</plugins>

3. 使用示例

@Test
public void testPage() {// 設置分頁參數(頁碼從1開始,每頁3條)PageHelper.startPage(1, 3);// 執行查詢List<User> users = userMapper.findAll();// 封裝分頁結果PageInfo<User> pageInfo = new PageInfo<>(users);System.out.println("總條數:" + pageInfo.getTotal());System.out.println("總頁數:" + pageInfo.getPages());System.out.println("當前頁數據:" + pageInfo.getList());
}

總結

MyBatis以其靈活性和高效性,在Java持久層框架中占據重要地位。本文從環境搭建到高級特性,涵蓋了MyBatis的核心用法,包括CRUD操作、動態SQL、緩存機制、關聯查詢等。掌握這些內容后,可輕松應對日常開發中的數據庫操作需求。

建議在實際項目中根據場景選擇XML配置或注解開發(XML更適合復雜SQL,注解更簡潔),并合理使用緩存和分頁插件優化性能。

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

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

相關文章

面試150 添加與搜索單詞--數據結構設計

思路 通過哈希法去實現&#xff0c;這里主要描述search的思路&#xff1a;如果’.‘不在word中&#xff0c;我們只需要去查詢word在不在set中。如果’.‘存在&#xff0c;我們對哈希中的字符串進行遍歷w&#xff0c;如果當前字符串的長度不等于word跳過,對word進行遍歷&#xf…

學習打卡網站(搭子版本)

概述 之前用了網上的一些學習打卡類app&#xff0c;基本都是收費的&#xff0c;而且有些自己想要的功能卻沒有&#xff0c;甚至還有廣告&#xff0c;正好暑假是個需要容易懶惰的時間&#xff0c;所以干脆自己做了一個能和學習搭子一起記錄計劃的小網站。 昨天早上開始寫&#x…

分享如何在Window系統的云服務器上部署網站及域名解析+SSL

最近看到阿里云的服務器有個199的活動&#xff0c;買了個2核4G帶寬5M的服務器&#xff0c;用于小網站的運營也足夠&#xff0c;于是就買一個&#xff0c;并且我還挑了個新加坡的站點&#xff0c;本想著運營獨立站&#xff0c;用新加坡的站點外網訪問會更友好一點。于是問題就來…

FastAdmin系統框架通用操作平滑遷移到新服務器的詳細步驟-優雅草卓伊凡

FastAdmin系統框架通用操作平滑遷移到新服務器的詳細步驟-優雅草卓伊凡我們蜻蜓hr系統采用的后端框架就是fastadmin&#xff0c;因此我們平穩遷移以此為例&#xff0c;為什么要遷移一份是因為有甲方需要。遷移FastAdmin系統到新服務器需要確保數據完整性和系統功能正常。以下是…

Request和Response相關介紹

Request 和 Response 是什么&#xff1f; Request&#xff08;請求對象&#xff09;&#xff1a;用來接收瀏覽器發過來的數據。 Response&#xff08;響應對象&#xff09;&#xff1a;用來把服務器處理后的結果返回給瀏覽器。 1. request 的作用&#xff08;獲取請求數據&am…

Springboot 實現熱部署

spring為開發者提供了一個名為spring-boot-devtools的模塊來使Spring Boot應用支持熱部署&#xff0c;提高開發者的開發效率&#xff0c;無需手動重啟Spring Boot應用。引入依賴<dependency><groupId>org.springframework.boot</groupId><artifactId>s…

虛擬機擴展磁盤容量后擴展分區大小

1. 首先檢查磁盤剩余空間sudo fdisk -l /dev/sda2. 如果有未分配空間&#xff0c;直接擴展分區sudo fdisk /dev/sda在fdisk交互界面中&#xff0c;依次寫入d # 刪除分區 3 # 例如選擇分區3&#xff08;/dev/sda3&#xff09; n # 新建分區 p # 主分區 3 # 分區號3 # 起始扇…

元宇宙與游戲:虛實交融的數字文明新紀元

引言&#xff1a;當游戲遇見元宇宙在紐約現代藝術博物館&#xff08;MoMA&#xff09;的"虛擬世界"特展中&#xff0c;一幅數字藝術作品《元宇宙誕生》引發觀展熱潮。這幅由AI與人類藝術家共同創作的作品&#xff0c;描繪了游戲《堡壘之夜》的虛擬演唱會與現實世界交…

音視頻學習(四十二):H264幀間壓縮技術

必要性與優勢 原始數字視頻數據量龐大&#xff0c;未經壓縮的視頻難以有效傳輸和存儲。例如&#xff0c;一個 1080p、30fps 的無壓縮視頻&#xff0c;每秒數據量可達數百兆比特。視頻壓縮的目標是在保證視覺質量的前提下&#xff0c;最大限度地減少數據冗余。視頻數據中存在多種…

微服務雪崩防護最佳實踐之sentinel

思考1、當服務訪問量達到一定程度&#xff0c;流量扛不住的時候&#xff0c;該如何處理&#xff1f;2、服務之間相互依賴&#xff0c;當服務A出現響應時間過長&#xff0c;影響到服務B的響應&#xff0c;進而產生連鎖反應&#xff0c;直至影響整個依賴鏈上的所有服務&#xff0…

阿里云監控及運維常見問題

云監控介紹&#xff1a;阿里云的云監控服務&#xff08;CloudMonitor&#xff09;是一款簡單易用、功能強大的監控工具&#xff0c;主要用來幫助用戶實時監控阿里 云上的各種資源&#xff08;比如服務器、數據庫、網絡等&#xff09;&#xff0c;并在出現問題時及時發出警報&am…

深入解析 vLLM 分布式推理與部署策略

在當今人工智能快速發展的時代&#xff0c;大型語言模型&#xff08;LLM&#xff09;的推理和部署面臨著諸多挑戰&#xff0c;尤其是當模型規模日益龐大時&#xff0c;如何高效地利用硬件資源成為關鍵問題。vLLM 作為一種強大的工具&#xff0c;為分布式推理和部署提供了多種策…

PostgreSQL 終端命令詳解及實際應用案例

PostgreSQL 作為一款功能強大的開源關系型數據庫&#xff0c;其終端命令是數據庫管理員、開發人員日常操作的核心工具。這些命令覆蓋數據庫連接、對象管理、數據操作、備份恢復、權限控制等多個維度&#xff0c;掌握其實際應用場景能顯著提升工作效率。本文結合不同行業的實操案…

步進電機基礎

1、ENABLE ̄\overline{ENABLE}ENABLE 的意思&#xff1a; ENABLE上面的橫線表示這是一個低電平有效的信號&#xff1a;當ENABLE信號為低電平&#xff08;0V或邏輯0&#xff09;時&#xff0c;芯片被使能&#xff08;激活&#xff09;當ENABLE信號為高電平&#xff08;VDD或邏輯…

Redis進階--緩存

目錄 一、引言 二、介紹 1.為什么Mysql的速度慢呢&#xff1f; 2.緩存更新策略 1.定期生成 2.實時生成 3.redis的內存淘汰機制 4.注意事項 1.緩存預熱 2.緩存穿透 3.緩存擊穿 4.緩存雪崩 三、總結 一、引言 本篇文章將介紹Redis其中一個重要的作用&#xff0c;作為…

微軟原版系統下載的幾個好用網站

“不要因為走得太遠&#xff0c;而忘記為什么出發。” 愿每一位Windows用戶&#xff0c;都能在這份情懷中找到屬于自己的小確幸&#xff01;滿滿的情懷&#xff01; 微軟官方渠道 微軟官網提供純凈的ISO鏡像下載&#xff0c;適用于Windows 10/11等系統。訪問Microsoft官網下…

kotlin Flow快速學習2025

其實&#xff0c;第一章節&#xff0c;只是讓你了解下Flow的基本情況。我們開發中&#xff0c;基本很少使用這種模式。所以來講&#xff0c;我們甚至可以直接使用StateFlow和SharedFlow才是正途。這是很多教程沒有說明的點。所以第一章隨便瀏覽下即可。日后再補充理解都是可以的…

【人工智能99問】什么是教師強制?(16/99)

文章目錄什么是教師強制&#xff1f;教師強制&#xff08;Teacher Forcing&#xff09;的定義原比例&#xff08;Original Proportion&#xff09;教師強制的舉例說明&#xff08;一&#xff09;教師強制的舉例說明&#xff08;二&#xff09;優點和缺點解決曝光偏差的方法什么…

【WPF】WPF 自定義控件之依賴屬性

&#x1f4e6; WPF 自定義控件之依賴屬性 在開發 WPF 應用時&#xff0c;自定義控件能幫助我們復用邏輯和樣式&#xff0c;但我很快會遇到一個問題&#xff1a;在控件內部如何支持數據綁定和屬性變更通知&#xff1f;特別是我們繼承自 Control 的時候&#xff0c;已經不能再繼承…

DOM型XSS破壞

目錄 首先 然后 第一種 第二種&#xff08;DOM&#xff09; HTMLCollection HTML Relationships Custom 解 首先 <script>//urlencode解碼 //location接口的hash屬性是一個字符串&#xff0c;包含一個“#”后跟位置URL的片段標識符。如果URL沒有片段標識符&#…