JdbcTemplate和MyBatis的區別

在 Java 后端開發中,JdbcTemplate(Spring 框架提供)和 MyBatis(持久層框架)都是用于簡化數據庫操作的工具,但它們的設計理念、使用方式、靈活性和適用場景有顯著差異。下面從核心定位、核心特性、使用方式、優缺點等維度進行全面對比

一、核心定位與設計理念

對比維度JdbcTemplateMyBatis
所屬框架Spring 框架內置(spring-jdbc 模塊)獨立的持久層框架(可與 Spring 整合)
設計核心封裝 JDBC 細節,簡化“模板化”SQL操作專注于 SQL 與 Java 代碼的解耦,支持 SQL 靈活定制
定位“輕量級 JDBC 工具”,無 ORM 特性“半自動化 ORM 框架”(需手動寫 SQL,自動映射結果)
核心目標減少 JDBC 重復代碼(如連接管理、異常處理)平衡 SQL 靈活性與代碼簡潔性,避免硬編碼 SQL

二、核心特性對比

特性JdbcTemplateMyBatis
SQL 編寫位置硬編碼在 Java 代碼中(字符串形式)寫在 XML 映射文件或 Java 注解中
參數映射手動通過 ? 占位符傳參(如 update("SELECT * FROM user WHERE id = ?", 1)支持 #{}(預編譯,防注入)${}(字符串拼接),自動映射 Java 對象參數
結果集映射需手動處理 ResultSet(如用 RowMapper 轉 Java 對象)自動映射(SQL 列名與 Java 對象屬性名匹配,支持自定義映射規則)
動態 SQL無原生支持,需手動用字符串拼接(易出錯、有注入風險)原生支持動態 SQL(<if><foreach><choose> 等標簽),安全且靈活
緩存支持無內置緩存,需依賴 Spring 緩存(如 @Cacheable內置一級緩存(SqlSession 級別)和二級緩存(Mapper 級別),支持整合第三方緩存(如 Redis)
批量操作支持但需手動調用 batchUpdate(),代碼較繁瑣支持 BatchExecutor,配合 <foreach> 可簡化批量插入/更新
存儲過程調用需手動處理 CallableStatement,代碼復雜原生支持存儲過程(<select statementType="CALLABLE">
XML 配置無需額外 XML,依賴 Spring 配置文件(如數據源)需配置核心配置文件(mybatis-config.xml)和映射文件(XxxMapper.xml
代碼侵入性高(SQL 與 Java 代碼耦合)低(SQL 與 Java 代碼分離)

三、使用方式示例(以“查詢用戶”為例)

通過具體代碼對比,更直觀理解兩者差異。

1. JdbcTemplate 實現

需先在 Spring 配置數據源(如 application.yml),再注入 JdbcTemplate

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.example.admin.entity.User;@Repository
public class UserDao {// 注入 Spring 自動配置的 JdbcTemplate@Autowiredprivate JdbcTemplate jdbcTemplate;// 查詢單個用戶public User getUserById(Long id) {// 1. SQL 硬編碼在代碼中String sql = "SELECT id, username, email FROM user WHERE id = ?";// 2. 手動用 RowMapper 映射 ResultSet 到 User 對象RowMapper<User> rowMapper = (rs, rowNum) -> {User user = new User();user.setId(rs.getLong("id"));user.setUsername(rs.getString("username"));user.setEmail(rs.getString("email"));return user;};// 3. 執行查詢并返回結果return jdbcTemplate.queryForObject(sql, rowMapper, id);}
}
2. MyBatis 實現

分 3 步:定義 Mapper 接口、編寫 XML 映射文件、配置 MyBatis(Spring Boot 中可自動配置)。

步驟 1:定義 Mapper 接口(無實現類)
import org.apache.ibatis.annotations.Mapper;
import com.example.admin.entity.User;@Mapper // 標記為 MyBatis Mapper 接口,Spring 自動掃描
public interface UserMapper {// 方法名與 XML 中 SQL 的 id 對應User getUserById(Long id);
}
步驟 2:編寫 XML 映射文件(UserMapper.xml

放在 resources/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.admin.mapper.UserMapper"><!-- id 對應接口方法名,resultType 指定返回值類型(自動映射) --><select id="getUserById" resultType="com.example.admin.entity.User">SELECT id, username, email FROM user WHERE id = #{id}<!-- #{id} 自動接收參數,預編譯防 SQL 注入 --></select>
</mapper>
步驟 3:Service 層調用 Mapper
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.admin.entity.User;
import com.example.admin.mapper.UserMapper;@Service
public class UserService {@Autowiredprivate UserMapper userMapper; // 注入 Mapper 接口(MyBatis 動態代理生成實現類)public User getUserById(Long id) {return userMapper.getUserById(id); // 直接調用接口方法}
}

四、優缺點對比

框架優點缺點
JdbcTemplate1. 輕量級,無額外依賴(僅依賴 Spring)
2. 學習成本低,上手快
3. 代碼簡潔(適合簡單 SQL 操作)
4. 靈活控制 JDBC 細節(如自定義 ResultSet 處理)
1. SQL 硬編碼,維護困難(復雜項目中代碼混亂)
2. 無動態 SQL 支持,拼接 SQL 易出錯
3. 無自動映射,需手動寫 RowMapper
4. 不支持緩存,批量操作繁瑣
MyBatis1. SQL 與代碼分離,維護性好
2. 原生動態 SQL,支持復雜查詢
3. 自動參數/結果映射,減少重復代碼
4. 內置緩存,提升性能
5. 支持存儲過程、批量操作
1. 需額外學習 MyBatis 語法(XML 標簽、配置規則)
2. 復雜業務(多表關聯)需手動寫 SQL,工作量大
3. 無完全自動化 ORM(對比 Hibernate)

五、選型建議

根據項目規模、SQL 復雜度、團隊技術棧選擇:

場景推薦框架理由
小型項目/工具類(如你之前的“在線工具集管理后臺”初期)JdbcTemplate需求簡單,SQL 不復雜,無需額外學習成本,快速開發
中大型項目(多表關聯、動態 SQL 多)MyBatisSQL 靈活定制,維護性好,支持動態 SQL 和緩存,適合復雜業務場景
團隊不熟悉 MyBatis,更熟悉 SpringJdbcTemplate降低學習成本,利用現有 Spring 技術棧
需頻繁調整 SQL(如報表統計、復雜查詢)MyBatisSQL 獨立存儲,修改無需重新編譯代碼,迭代效率高
簡單 CRUD 操作占比高可結合 MyBatis-PlusMyBatis-Plus 是 MyBatis 的增強工具,提供“無 SQL CRUD”(如 baseMapper.insert(user)),兼顧靈活性和效率

六、補充:MyBatis-Plus 簡介

如果你使用 MyBatis,推薦搭配 MyBatis-Plus(簡稱 MP),它是 MyBatis 的“增強工具”,不改變 MyBatis 核心邏輯,卻能大幅減少重復 CRUD 代碼:

  • 提供 BaseMapper 接口,內置 insert/deleteById/updateById/selectList 等方法,無需寫 XML;
  • 支持 Lambda 表達式查詢(如 query().eq(User::getId, 1).one());
  • 原生支持分頁、批量操作、邏輯刪除等功能。

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

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

相關文章

埃氏篩|樹dfs|差分計數

lc525把數組里的0換成-1&#xff0c;求子數組和為零的最長長度用哈希表記錄前綴和首次出現的位置通過找相同前綴和的位置差得出最長的0和1數量相等的子數組長度。class Solution { public:int findMaxLength(vector<int>& nums) {unordered_map<int,int>hashta…

(JVM)Java 對象創建的完整過程

在日常開發和面試中&#xff0c;經常會被問到 “Java 中對象是如何被創建的&#xff1f;” 表面上只是一個 new 關鍵字&#xff0c;但 JVM 在幕后完成了一系列復雜操作。 可以總結為以下 六大步驟&#xff1a;類加載檢查 → 分配內存 → 內存清零 → 設置對象頭 → 執行構造函數…

數據庫優化提速(三)JSON數據類型在酒店管理系統搜索—仙盟創夢IDE

在 MySQL 中&#xff0c;JSONB 類型&#xff08;MySQL 中實際為 JSON 類型&#xff0c;功能類似 PostgreSQL 的 JSONB&#xff0c;支持高效的 JSON 數據存儲和查詢&#xff09;非常適合存儲半結構化數據&#xff0c;例如酒店入住客人的復雜信息&#xff08;包含客人基本信息、入…

小程序全局狀態管理:使用MobX進行跨組件數據共享詳解(九)

一、定義全局數據共享&#xff08;又叫&#xff1a;狀態管理&#xff09;是為了解決組件之間數據共享的問題&#xff1b;全局數據共享方案&#xff1a;VueX、Redux、MobX等&#xff1b;二、小程序全局數據共享方案使用mobx-miniprogram配合mobx-miniprogram-bindings實現全局數…

生成模型 | DDPM -> Imrpoved DDPM -> DDIM

DDPM: Denoising Diffusion Probabilistic Models 采樣過程中的迭代計算為&#xff1a; xt?11αt(xt?1?αt1?αˉ?θ(xt,t))β~tzx_{t-1} \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}}}\epsilon_{\theta}(x_t, t)) \sqrt{\tilde{\beta…

Linux驅動之DMA(三)

目錄一、驅動內容1. 核心結構體解析2. 關鍵模塊解析3. 驅動初始化流程4. 關鍵寄存器操作5. 典型工作流程6. 代碼特點7. 重要函數列表8. 使用示例二、驅動中DMA的使用1. DMA通道初始化&#xff08;imx_uart_dma_init&#xff09;2. DMA發送流程&#xff08;imx_uart_dma_tx&…

MongoDB 分片集群把非分片集合轉成分片集合

記得關注一下博主&#xff0c;博主每天都會更新IT技術&#xff0c;讓你有意想不到的小收獲哦^_^ 文章目錄*記得關注一下博主&#xff0c;博主每天都會更新IT技術&#xff0c;讓你有意想不到的小收獲哦^_^*一、MongDB集群啟停止1、MonogoDB分片集群服務啟動順序(三臺主機都要操作…

mybatis過渡到mybatis-plus過程中需要注意的地方

將 MyBatis 升級為 MyBatis-Plus&#xff08;簡稱 MP&#xff09;是一個平滑過渡的過程&#xff0c;因為 MP 是 MyBatis 的增強工具&#xff08;而非替代&#xff09;&#xff0c;但仍有一些關鍵注意事項需要關注&#xff0c;以確保升級后功能兼容且能充分利用 MP 的特性&#…

openEuler系統中如何將docker安裝在指定目錄

在 openEuler 中&#xff0c;Docker 的默認數據存儲目錄為 /var/lib/docker&#xff08;程序文件通常安裝在系統默認路徑&#xff0c;一般無需修改&#xff09;。若需將 Docker 數據&#xff08;鏡像、容器、卷等&#xff09;存儲到指定目錄&#xff0c;可通過修改 Docker 配置…

2.4 我國金融市場的監管體制

1、國務院金融發展委員會職責 2、中國人民銀行職責

PHP - 實例屬性訪問與靜態方法調用的性能差異解析

觀察到了一個看似矛盾的現象&#xff1a;實例屬性訪問更快&#xff0c;但靜態方法調用更快。這實際上是兩種不同的操作&#xff0c;下面我將詳細解釋其中的原理和差異。1. 實例屬性訪問為什么快訪問機制class MyClass {public $instanceProp 1; }$obj new MyClass(); $value …

音視頻面試題集錦第 31 期

音視頻面試題集錦第 31 期&#xff1a; 1、I 幀、P 幀和 B 幀的概念及區別&#xff1f;2、視頻編碼中的碼率控制技術有哪些&#xff1f;3、音頻采樣參數有哪些&#xff1f;4、RTMP 和 HLS 協議各有什么特點&#xff1f;如何選擇&#xff1f;5、WebRTC 中的 ICE、STUN、TURN 各…

企業視頻庫管理高效策略

內容概要本文全面探討企業視頻庫管理的高效策略&#xff0c;旨在幫助組織優化視頻資源處理。首先&#xff0c;我們將介紹企業視頻庫管理的基本概念和核心價值。接著&#xff0c;深入分析智能分類核心技術如何通過AI算法實現視頻自動歸類。之后&#xff0c;闡述云集成實現路徑&a…

WebSocket和跨域問題

WebSocket 特點 WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。簡單來說&#xff0c;它就像是在客戶端和服務器之間建立了一條"專用通道"&#xff0c;雙方可以隨時主動發送消息給對方&#xff0c;而不需要像HTTP那樣總是由客戶端發起請求。 同一時間、雙向…

微服務-19.什么是網關

一.網關曾經我們的項目是單體項目&#xff0c;前端只需要請求8080端口&#xff0c;就可以獲取所有需要的數據和服務并進行渲染。但是拆分成微服務后&#xff0c;會面臨幾大問題&#xff1a;1.但是現在我們將該單體項目拆分成了微服務項目&#xff0c;每個項目都有自己獨立的端口…

從字節碼層面剖析以太坊智能合約創建原理

1. 引言 閱讀完本文之后&#xff0c;將能理解一下字節碼含義&#xff1a; 608060405260405160893803806089833981016040819052601e916025565b600055603d565b600060208284031215603657600080fd5b5051919050565b603f80604a6000396000f3fe6080604052600080fdfea2646970667358221…

typora無需激活版及最新激活版方法!雙擊安裝就能用

介紹 Typora 是一款Markdown編輯器&#xff0c;支持實時預覽&#xff0c;所見即所得。跨平臺&#xff0c;支持Windows、macOS、Linux。適合寫作、筆記、技術文檔等。本教程將提供合法安全的安裝方案&#xff0c;并解決常見問題&#xff0c;助你高效完成部署&#xff01; 直接…

基于Java、GeoTools與PostGIS的對跖點求解研究

目錄 前言 一、對跖點簡介 1、地理學定義 2、人生哲學含義 二、對跖點求解 1、Java求解 2、Geotools求解 3、PostGIS求解 4、三種計算方法的對比 5、Leaflet展示對跖點 三、總結 前言 在地理信息系統&#xff08;GIS&#xff09;領域&#xff0c;對跖點&#xff08;A…

Linux-函數的使用-編寫監控腳本

Linux-函數的使用-編寫監控腳本前言一、監控cpu二、采集內存的使用信息三、采集磁盤和分區的使用信息四、顯示進程的信息前言 編寫監控腳本實現以下功能 監控cpu&#xff0c;內存&#xff0c;磁盤&#xff0c;進程等信息&#xff0c;每隔5分鐘記錄這些信息到日志文件里perform…

Authelia:開源雙因素認證與單點登錄解決方案

項目標題與描述 Authelia是一個開源的認證和授權服務器&#xff0c;專注于為應用程序提供雙因素認證&#xff08;2FA&#xff09;和單點登錄&#xff08;SSO&#xff09;功能。通過Web門戶&#xff0c;Authelia能夠作為身份和訪問管理&#xff08;IAM&#xff09;系統&#xff…