MyBatis從入門到面試:掌握持久層框架的精髓

MyBatis從入門到面試:掌握持久層框架的精髓

前言

在Java企業級應用開發中,持久層框架的選擇至關重要。MyBatis作為一款優秀的半自動化ORM框架,以其靈活的SQL定制能力和良好的性能表現,成為了眾多開發者的首選。本文將帶你從MyBatis的基礎入門開始,逐步深入核心概念,最后為你準備面試常見問題,助你全面掌握MyBatis。

一、MyBatis入門篇

1.1 什么是MyBatis?

MyBatis是一款優秀的持久層框架,它支持自定義SQL、存儲過程以及高級映射。MyBatis避免了幾乎所有的JDBC代碼和手動設置參數以及獲取結果集的工作,可以通過簡單的XML或注解來配置和映射原始類型、接口和Java POJO為數據庫中的記錄。

1.2 環境搭建與配置

首先,我們需要在項目中引入MyBatis依賴:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
</dependency>

接下來創建MyBatis的核心配置文件mybatis-config.xml

<?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"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/mapper/UserMapper.xml"/></mappers>
</configuration>

1.3 第一個MyBatis程序

創建實體類:

public class User {private Long id;private String name;private String email;// 構造方法、getter和setter省略
}

創建Mapper接口:

public interface UserMapper {User selectUserById(Long id);
}

創建Mapper XML文件:

<?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">
<mapper namespace="com.example.mapper.UserMapper"><select id="selectUserById" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id}</select>
</mapper>

使用MyBatis API執行查詢:

public class MyBatisExample {public static void main(String[] args) {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUserById(1L);System.out.println(user.getName());}}
}

二、MyBatis核心概念解析

2.1 SqlSessionFactory與SqlSession

  • SqlSessionFactory:每個MyBatis應用都以一個SqlSessionFactory實例為核心,它是線程安全的,一旦創建應在應用運行期間一直存在
  • SqlSession:代表一次數據庫會話,不是線程安全的,每個線程都應該有它自己的SqlSession實例

2.2 Mapper接口與XML映射文件

MyBatis通過動態代理技術將Mapper接口與XML映射文件關聯起來:

// Mapper接口
public interface UserMapper {@Insert("INSERT INTO user(name, email) VALUES(#{name}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id")int insertUser(User user);@Select("SELECT * FROM user WHERE id = #{id}")User selectUserById(Long id);
}

或者使用XML配置:

<mapper namespace="com.example.mapper.UserMapper"><insert id="insertUser" parameterType="com.example.entity.User"useGeneratedKeys="true" keyProperty="id">INSERT INTO user(name, email) VALUES(#{name}, #{email})</insert>
</mapper>

2.3 動態SQL

MyBatis提供了強大的動態SQL功能:

<select id="findUsers" parameterType="map" resultType="User">SELECT * FROM user<where><if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="email != null">AND email = #{email}</if><choose><when test="orderBy == 'name'">ORDER BY name</when><otherwise>ORDER BY id</otherwise></choose></where>
</select>

2.4 結果映射

MyBatis支持復雜的結果映射:

<resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><result property="email" column="email"/><collection property="posts" ofType="Post"><id property="id" column="post_id"/><result property="title" column="post_title"/><result property="content" column="post_content"/></collection>
</resultMap>

三、MyBatis高級特性

3.1 插件開發

MyBatis允許用戶使用插件攔截的方法調用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

示例:實現一個簡單的SQL執行時間統計插件

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class SqlExecuteTimeInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {long start = System.currentTimeMillis();Object result = invocation.proceed();long end = System.currentTimeMillis();System.out.println("執行耗時: " + (end - start) + "ms");return result;}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}

3.2 緩存機制

MyBatis提供兩級緩存:

  • 一級緩存:SqlSession級別的緩存,默認開啟
  • 二級緩存:Mapper級別的緩存,需要手動配置開啟
<!-- 在Mapper XML中開啟二級緩存 -->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

3.3 類型處理器

自定義類型處理器處理特殊數據類型:

public class StringArrayTypeHandler extends BaseTypeHandler<String[]> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, String.join(",", parameter));}@Overridepublic String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {String value = rs.getString(columnName);return value != null ? value.split(",") : null;}// 其他方法省略
}

四、MyBatis面試常見問題

4.1 基礎概念類

1. MyBatis和Hibernate有什么區別?

  • MyBatis是半自動ORM框架,需要手動編寫SQL;Hibernate是全自動框架,自動生成SQL
  • MyBatis更靈活,適合復雜查詢和性能優化場景;Hibernate開發效率更高,適合傳統CRUD操作
  • MyBatis學習曲線較平緩;Hibernate學習曲線較陡峭

2. #{}和${}的區別是什么?

  • #{}是預編譯處理,可以有效防止SQL注入
  • ${}是字符串替換,有SQL注入風險,一般用于order by等非值替換場景

4.2 高級特性類

1. MyBatis的插件運行原理是什么?

MyBatis使用責任鏈模式,通過動態代理組織多個插件。當執行目標方法時,會按照插件配置的順序依次調用插件的intercept方法。

2. MyBatis如何實現分頁?

  • 物理分頁:使用RowBounds或分頁插件(如PageHelper)
  • 邏輯分頁:使用ResultSet的absolute方法,但數據量大時性能較差

4.3 性能優化類

1. MyBatis如何進行批量操作?

try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {UserMapper mapper = session.getMapper(UserMapper.class);for (int i = 0; i < 1000; i++) {User user = new User("name" + i, "email" + i);mapper.insertUser(user);}session.commit();
}

2. 如何優化MyBatis查詢性能?

  • 合理使用緩存
  • 使用延遲加載
  • 優化SQL語句
  • 使用連接池
  • 避免N+1查詢問題

五、總結

MyBatis作為一個靈活、高效的持久層框架,在現代Java開發中占據重要地位。通過本文的學習,你應該已經掌握了MyBatis從基礎使用到高級特性的核心知識,并為面試做好了充分準備。記住,框架只是工具,真正重要的是理解其背后的設計思想和原理,這樣才能在實際項目中靈活運用,解決復雜問題。

希望這篇博客對你有所幫助,祝你學習進步,面試順利!


延伸閱讀

  • MyBatis官方文檔
  • MyBatis-Spring整合指南
  • MyBatis Generator代碼生成器

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

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

相關文章

5.Three.js 學習(基礎+實踐)

Three.js 是 “WebGL 的封裝庫”&#xff0c;幫你屏蔽了底層的著色器 / 緩沖區細節&#xff0c;專注于 “3D 場景搭建”&#xff0c;開發效率高&#xff0c;是通用 3D 開發的首選。他的核心是 “場景 - 相機 - 渲染器” 的聯動邏輯&#xff0c;先掌握基礎組件&#xff0c;再學進…

消火栓設備工程量計算 -【圖形識別】秒計量

消火栓設備工程量計算 -【圖形識別】秒計量 消防系統的消火栓設備水槍、水帶和消火栓組成&#xff0c;根據清單定額規則計算消火栓設備工程量。通過CAD快速看圖的圖形識別框選圖紙就能自動數出消火栓數量&#xff0c;省時又準確&#xff0c;是工程人做消防算量的好幫手。 一、…

Docker 與 VSCode 遠程容器連接問題深度排查與解決指南

Docker 與 VSCode 遠程容器連接問題深度排查與解決指南 引言 Visual Studio Code 的 Remote - Containers 擴展極大地提升了開發體驗&#xff0c;它將開發環境容器化&#xff0c;保證了環境的一致性&#xff0c;并允許開發者像在本地一樣在容器內進行編碼、調試和運行。然而&…

愛圖表:鏑數科技推出的智能數據可視化平臺

本文轉載自&#xff1a;https://www.hello123.com/aitubiao ** 一、? AI 圖表&#xff1a;智能數據可視化好幫手 愛圖表是鏑數科技旗下的一款智能數據可視化工具&#xff0c;它能讓復雜的數字和報表變得直觀又好懂。接入了先進的DeepSeek 系列 AI 模型&#xff0c;它不僅會做…

ENVI系列教程(四)——圖像幾何校正

目錄 1 概述 1.1 控制點選擇方式 1.2 幾何校正模型 1.3 控制點的預測與誤差計算 2 詳細操作步驟 2.1 掃描地形圖的幾何校正 2.1.1 第一步:打開并顯示圖像文件 2.1.2 第二步:啟動幾何校正模塊 2.2 Landsat5 影像幾何校正 2.2.1 第一步:打開并顯示圖像文件 2.2.2 第…

STM32-FreeRTOS操作系統-消息隊列

引言在嵌入式開發領域&#xff0c;STM32與FreeRTOS的結合應用極為廣泛。本文將探討如何在STM32上使用FreeRTOS實現消息隊列功能&#xff0c;助力高效任務通信與系統協作。消息隊列定義消息隊列是一種在 FreeRTOS 中用于任務間通信的機制。它允許任務將消息發送到隊列中&#xf…

【開題答辯全過程】以 C語言程序設計課程網站為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

手機上有哪些比較好用的待辦事項提醒工具

在快節奏的現代工作中&#xff0c;我們每天都要面對大量的任務與事務。從項目截止日期、客戶會議&#xff0c;到日常的工作安排&#xff0c;瑣碎的事項容易讓人顧此失彼。 手機待辦事項工具早已突破傳統“記事本”的局限&#xff0c;成為移動辦公場景下的效率核心。它們通過任務…

Mysql數據庫事務全解析:概念、操作與隔離級別

MySQL系列 文章目錄MySQL系列一、什么是事務1.1事務的核心概念1.2、 事務的四大屬性&#xff08;ACID&#xff09;1.2.1 原子性&#xff08;Atomicity&#xff09;1.2.2 一致性&#xff08;Consistency&#xff09;1.2.3 隔離性&#xff08;Isolation&#xff09;1.2.4 持久性&…

【MCU EEPROM開發教程】

簡單來說把eeprom芯片當成一個傳感器來使用&#xff0c;通過IIC/SPI等協議對芯片進行讀寫操作&#xff0c;具體的讀寫操作涉及到一些算法—怎么樣讀寫更加快速&#xff0c;以及一些異常錯誤處理。 應用場景&#xff1a; 對于一些掉電也不能丟失的數據要存在eeprom/flash中&…

Docker將鏡像搬移到其他服務上的方法

導出/加載鏡像&#xff08;保留分層、標簽&#xff09;和導出/導入容器快照&#xff08;僅文件系統&#xff0c;丟失鏡像歷史與標簽&#xff09;。 一、把鏡像打包帶走&#xff08;推薦&#xff09; 適合把一個或多個鏡像搬到離線/內網機器&#xff0c;保留分層與標簽。 在源服…

Ubuntu 系統安裝 Miniconda 完整方法與注意事項

一、完整安裝步驟 1. 下載 Miniconda 安裝包 Miniconda 安裝包為 .sh 格式腳本,下載途徑分兩種: 方式 1:瀏覽器下載(適合新手) 訪問 Miniconda 官方下載頁,選擇對應系統版本(Ubuntu 選 Miniconda3-latest-Linux-x86_64.sh),默認保存到用戶目錄的 ~/Downloads 文件夾…

【后端】數據庫四大范式詳細解析

梳理一下 MySQL&#xff08;或關系型數據庫&#xff09;中的第一、二、三、四范式&#xff0c;這是數據庫設計中非常重要的規范化理論。1?? 第一范式 (1NF&#xff1a;First Normal Form)定義&#xff1a;字段具有原子性&#xff0c;不可再分。數據表中每一列都必須是不可分割…

HarmonyOS后臺任務調度:JobScheduler與WorkManager實戰指南

本文將深入探討HarmonyOS 5&#xff08;API 12&#xff09;中的后臺任務調度機制&#xff0c;重點講解JobScheduler和WorkManager的使用方法、適用場景及最佳實踐&#xff0c;幫助開發者實現高效、智能的后臺任務管理。 1. 后臺任務調度概述 HarmonyOS提供了兩種主要的后臺任務…

Prompt工程實踐

你在寫prompt時候&#xff0c;是不是總覺得大模型它不聽話。要么答非所問、要么一堆廢話。扒開思考過程仔細閱讀時而覺得它聰明絕頂&#xff0c;時而又覺得它愚蠢至極。明明已經對了怎么又推理到錯的地方去了&#xff0c;明明在提示詞中提醒過了不要這么思考它怎么就瞎想了。這…

基于springboot的畢業旅游一站式定制系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的設計程序開發&#xff0c;開發過上千套設計程序&#xff0c;沒有什么華麗的語言&#xff0c;只有實…

輸入1.8V~5.5V 輸出28V DCDC升壓芯片TLV61046A

今天來一款TI的升壓芯片TLV61046A。輸入電壓范圍1.8V~5.5V。最高可以輸出28V。開關電流980mA&#xff0c;那具體能輸出多大的電流就得看輸入輸出的電壓了。以上面的輸入3.6V輸出12V為例&#xff0c;效率是85%&#xff0c;那最高可以輸出的電流就差不多只有200mA左右。封裝也是非…

ubuntu22.04源碼安裝ffmpeg-4.4

# ubuntu22.04源碼安裝ffmpeg-4.4cd /tmpwget https://ffmpeg.org/releases/ffmpeg-4.4.6.tar.xztar -xvf ffmpeg-4.4.6.tar.xzcd ffmpeg-4.4.6apt updateapt install -y yasm pkg-config libx264-dev libx265-dev libvpx-dev libfdk-aac-dev libmp3lame-dev libopus-dev libav…

Pyhon中字符串常用的函數

一、字符串的格式化1.format()方法format()是 Python 中用于字符串格式化的方法&#xff0c;通過占位符&#xff08;如 {}&#xff09;動態插入變量或表達式。name小明 age18 grade99.556245585 information"我是{}&#xff0c;今年{}歲了,考試得分&#xff1a;{:.2f}&quo…

小迪安全v2023學習筆記(八十一講)—— 框架安全ThinkPHPLaravelStruts2SpringBootCVE復現

文章目錄前記服務攻防——第八十一天開發框架安全&SpringBoot&Struts2&Laravel&ThinkPHP&CVE復現開發框架 - 常見語言開發框架PHP - 框架安全-Thinkphp&LaravelLaravel漏洞介紹漏洞復現CVE-2021-3129ThinkPHP漏洞介紹漏洞復現CVE-2018-1002015QVD-2022…