Mybatis
MyBatis 是一款優秀持久層(DAO)框架,用于簡化 JDBC 開發 ,原是 Apache 開源項目 iBatis,經歷遷移改名,2010 年從 Apache 遷到 Google Code 并改名,2013 年 11 月遷至 GitHub,官網為 https://mybatis.org/mybatis-3/zh_CN/index.html ,在分層架構(controller 控制層、service 業務層、dao 持久層 )中,可通過注解(如 @Select
)等方式操作數據庫,像示例中 UserMapper
接口用 @Select("select * from user")
實現查詢全部用戶功能 。
MyBatis 查詢所有用戶數據
一、核心流程概述
利用 MyBatis 結合 SpringBoot 實現查詢所有用戶數據,通過簡潔配置與注解方式,快速搭建數據庫交互功能,核心涉及工程創建、環境配置、代碼編寫三個環節 。
二、步驟拆解與代碼說明
(一)準備工作
- 工程創建與依賴引入
創建 SpringBoot 工程時,在依賴選擇界面勾選MyBatis Framework
、MySQL Driver
等(如演示截圖中New Module
配置 ),讓項目具備 MyBatis 操作數據庫的基礎環境。 - 數據庫與實體類準備
- 搭建數據庫表
user
,包含id
、username
、password
、name
、age
等字段(對應示例數據 )。 - 編寫實體類
User
,映射數據庫表字段:
- 搭建數據庫表
public class User { private Integer id; // IDprivate String username; // 用戶名private String password; // 密碼private String name; // 姓名 private Integer age; // 年齡// 省略Getter、Setter、構造方法等
}
- MyBatis 配置(數據庫連接)
在application.properties
中配置數據庫連接信息,讓 MyBatis 能訪問數據庫:
spring.datasource.url=jdbc:mysql://localhost:3306/web
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=1234
(二)編寫 MyBatis 程序(持久層接口)
定義持久層接口 UserMapper
,用 @Mapper
注解讓 SpringBoot 自動創建代理對象并納入 IOC 容器,通過 @Select
注解編寫 SQL 語句:
package com.itxiaoli.mapper;import com.itxiaoli.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserMapper {/*** 查詢所有用戶信息* @return 包含所有用戶數據的 List<User>*/@Select("select * from user")public List<User> findAll();
}
@Mapper
:關鍵注解,觸發 MyBatis 動態代理機制,運行時生成接口實現類,方便注入使用。@Select
:指定要執行的 SQL 語句,這里 “select * from user
” 實現查詢user
表全部數據,返回List<User>
結果 。
三、關鍵要點總結
- 依賴與配置:通過 SpringBoot 初始化工程并選對依賴,配合
application.properties
配置數據庫,為 MyBatis 運行鋪路。 - 注解驅動:
@Mapper
托管接口實現類,@Select
簡化 SQL 編寫,無需額外 XML 映射文件(簡單場景下 ),快速實現數據庫查詢。 - 分層規范:持久層接口命名遵循
XxxMapper
規范,契合 MyBatis 開發習慣,清晰劃分數據訪問層級,讓代碼結構更規整 。
這套流程能高效實現 “查詢所有用戶數據” 需求,是 MyBatis 基礎且典型的應用場景,后續可拓展復雜查詢、增刪改操作,或結合 XML 配置優化 SQL 管理 。
四、JDBC VS Mybatis
編程方式與代碼復雜度
- JDBC:代碼較為繁瑣。以查詢用戶數據為例,需要加載數據庫驅動(
Class.forName("com.mysql.cj.jdbc.Driver")
),建立數據庫連接(DriverManager.getConnection(url, "root", "1234")
),創建并執行 SQL 語句(PreparedStatement ps = connection.prepareStatement("select * from user")
),手動處理結果集(遍歷ResultSet
并將數據封裝到自定義對象 ),最后釋放資源(resultSet.close()
、ps.close()
、connection.close()
) 。過程中代碼量大,容易出錯,尤其是處理復雜查詢和結果集映射時,代碼會更加冗長。 - MyBatis:通過簡潔的注解或 XML 配置來定義 SQL 語句。例如使用
@Mapper
注解標識持久層接口,@Select
注解編寫 SQL 查詢語句 ,MyBatis 會自動處理 SQL 執行和結果映射,大大簡化了數據訪問層的代碼編寫,提高了開發效率,代碼結構也更加清晰。
數據庫連接與資源管理
- JDBC:在 JDBC 中,每次執行數據庫操作都需要手動建立和關閉數據庫連接。頻繁的連接創建與關閉會消耗大量資源,影響性能,而且如果資源關閉操作出現遺漏,可能導致數據庫連接泄漏等問題。
- MyBatis:通常與數據庫連接池(如 HikariCP ,在 Spring Boot 項目中默認集成 )結合使用。通過在配置文件(如
application.properties
)中配置數據庫連接信息,連接池負責管理連接的創建、分配和回收,減少了連接創建的開銷,提高了系統的性能和穩定性。
可維護性與可擴展性
- JDBC:SQL 語句通常以硬編碼的方式嵌入到 Java 代碼中,當 SQL 需要修改時,需要在 Java 代碼中查找并修改對應的 SQL 片段,尤其是在大型項目中,修改和維護成本較高。此外,對于不同數據庫的兼容性支持,需要開發者手動處理 SQL 語法差異,擴展性較差。
- MyBatis:SQL 語句與 Java 代碼分離(使用注解時,SQL 也相對獨立;使用 XML 配置時更明顯 ),便于集中管理和維護 SQL。當需要修改 SQL 時,只需在對應的注解或 XML 文件中進行修改即可。同時,MyBatis 提供了良好的數據庫兼容性,通過配置不同的數據庫方言,可以方便地切換不同的數據庫,擴展性更強。
數據映射
- JDBC:從
ResultSet
中獲取數據并封裝到 Java 對象中,需要開發者手動編寫代碼進行數據類型轉換和賦值,操作繁瑣且容易出錯。 - MyBatis:具備強大的自動映射功能,能夠根據數據庫表結構和 Java 實體類的屬性自動進行映射,將查詢結果直接封裝到對應的實體類對象中,減少了手動映射的工作量,提高了開發效率和代碼的準確性。
總的來說,MyBatis 相比 JDBC 在開發效率、代碼維護、資源管理等方面具有明顯優勢,更適合在企業級開發中使用,尤其是在復雜的業務場景下 。不過,了解 JDBC 有助于理解數據庫操作的底層原理,而且在一些輕量級或對性能要求極致且業務簡單的場景中,JDBC 也有其用武之地。
數據庫連接池
一、核心概念
數據庫連接池是管理數據庫連接(Connection)的容器,負責分配、回收連接,讓應用復用已有連接,而非每次新建,避免連接泄漏。
二、核心優勢
- 資源復用:重復利用連接,減少創建 / 銷毀連接的資源開銷(如網絡握手、數據庫認證)。
- 提升響應速度:直接從池內拿現成連接,無需等待新建,系統響應更快。
- 避免連接泄漏:自動釋放空閑過久的連接,防止因未關閉連接導致的資源耗盡問題。
三、技術規范與實現
- 標準接口:
DataSource
(Java 官方定義),第三方通過實現此接口提供連接池,核心方法getConnection()
獲取數據庫連接。 - 常見產品:
C3P0
:經典老牌連接池,配置靈活但性能略遜。DBCP
:Apache 旗下,穩定但功能相對基礎。Druid
(阿里開源):功能強大(支持監控、防 SQL 注入等),性能優秀,是 Java 生態常用選擇。Hikari
:Spring Boot 默認連接池,輕量、高性能,優化極致,主流項目首選。
四、使用示例(以 Druid 為例,Spring Boot 場景)
-
引入依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.19</version> </dependency>
-
配置連接池
指定連接池類型、數據庫地址、賬號密碼等:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://localhost:3306/web spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=1234
五、小結
數據庫連接池通過 “復用連接 + 管理生命周期”,解決了直連數據庫的性能與資源問題。記住核心點:
- 角色:連接的 “容器管家”,分配、回收連接。
- 價值:省資源、提速度、防泄漏。
- 實現:基于
DataSource
接口,主流產品各有側重(Hikari 輕量默認、Druid 功能豐富)。
簡單說,連接池就是讓數據庫連接 “按需復用、自動管理” 的工具,是 Java 開發中優化數據庫交互的基礎手段 。
Mybatis對數據庫表增刪改查
一、查詢操作
(一)、查詢所有信息
- 實現方式:在
UserMapper
接口中,通過@Select
注解定義查詢 SQL 語句,如@Select("select * from user")
,該注解讓 MyBatis 自動執行對應的查詢邏輯,將查詢結果映射為User
實體類的集合返回 。
@Select("select * from user")
public List<User> findAll();
- 測試驗證:在測試類
MybaitsQuickstartApplicationTests
里,注入UserMapper
后,調用findAll
方法執行查詢,通過遍歷結果集userList.forEach(user -> System.out.println(user));
,驗證查詢功能是否正常,檢查能否正確獲取數據庫中user
表的全部數據 。
@Test
public void testFindAll(){List<User> userList = userMapper.findAll();userList.forEach(user -> System.out.println(user));
}
- 關鍵優勢:利用 MyBatis 注解方式,無需額外編寫 XML 映射文件,簡化了簡單查詢場景的配置,讓查詢邏輯與接口定義緊密結合,方便維護,同時 MyBatis 自動完成結果集到實體類的映射,提升開發效率 。
(二)、根據用戶名和密碼查詢用戶信息
/*** 根據username和password查詢用戶信息*/@Select("SELECT * FROM user WHERE username=#{username} AND password=#{password}")public User findByUsernameAndPassword(@Param("username") String username,@Param("password") String password);
[!CAUTION]
@Param
是 MyBatis 中多參數傳遞時的常用注解,通過顯式命名參數,實現 SQL 語句與方法參數的精準綁定,提升代碼可讀性和維護性,是日常開發中推薦的參數傳遞方式。
/*** 測試根據用戶名和密碼查詢用戶信息*/@Testpublic void testFindByUsernameAndPassword() {User user = userMapper.findByUsernameAndPassword("小王", "123456");System.out.println(user);}
[!NOTE]
基于官方骨架創建的springboot項目中,接口編譯時會保留方法形參名,@Param注解可以省略 (#{形參名})。
二、刪除操作
- 實現方式:在
UserMapper
接口中,使用@Delete
注解編寫刪除 SQL,@Delete("DELETE FROM user WHERE id = #{id}")
,其中#{id}
是 MyBatis 的占位符,會生成預編譯 SQL,避免 SQL 注入風險,方法返回Integer
類型,用于接收刪除操作影響的行數 。
@Delete("DELETE FROM user WHERE id = #{id}")
public Integer deleteById(Integer id);
- 測試驗證:測試類中注入
UserMapper
,調用deleteById
方法并傳入要刪除的用戶id
(如5
),通過輸出返回的影響行數System.out.println("受影響的記錄數據" + i);
,判斷刪除操作是否執行成功,驗證刪除邏輯的正確性 。
@Test
public void testDeleteById(){Integer i= userMapper.deleteById(5);System.out.println("受影響的記錄數據" + i);
}
- 注意要點:DML 操作(增刪改)的返回值代表執行后影響的行數,這是判斷操作是否生效的重要依據;編寫刪除 SQL 時,合理使用
#{}
占位符保障安全,若因特殊需求(如動態表名)需用${}
,要做好參數校驗防止 SQL 注入 。
三、#{} VS ${}
符號 | 說明 | 場景 | 優缺點 |
---|---|---|---|
#{…} | 占位符。執行時,會將#{…}替換為?,生成預編譯SQL | 參數值傳遞 | 安全、性能高 (推薦) |
${…} | 拼接符。直接將參數拼接在SQL語句中,**存在SQL注入問題 ** | 表名、字段名動態設置時使用 | 不安全、性能低 |
四、增加操作
/*** 添加用戶信息* @param user* @return*/@Insert("INSERT INTO user (username, password, name,age) VALUES (#{username}, #{password}, #{name}, #{age})")public void insert(User user);
/*** 測試添加*/@Testpublic void testInsert(){User user=new User(null,"小高","123456","小高",18);userMapper.insert(user);}
五、修改操作
/*** 更新用戶信息*/@Update("UPDATE user SET username=#{username},password=#{password},name=#{name},age=#{age} WHERE id=#{id}")public void update(User user);
/*** 測試更新*/@Testpublic void testUpdate(){User user=new User(4,"小王","123456","小王",108);userMapper.update(user);}
XML映射配置
官方說明:https://mybatis.net.cn/getting-started.html
一、XML 映射配置核心規則
在 MyBatis 里,除注解配置 SQL,還能通過 XML 配置文件寫 SQL,需遵循以下規則:
(一)文件命名與位置(同包同名)
XML 映射文件名稱要和 Mapper 接口名稱一致,且放在相同包下(用 /
建目錄,而非 .
,比如 Mapper 接口是 com.it.mapper.UserMapper
,XML 文件就放 src/main/resources/com/it/mapper/UserMapper.xml
,保證 “同包同名” )。
(二)namespace 屬性
XML 映射文件的 namespace
屬性,和 Mapper 接口的全限定名一致。像 Mapper 接口是 com.it.mapper.UserMapper
,XML 里就寫 <mapper namespace="com.it.mapper.UserMapper">
,這樣 MyBatis 才能關聯接口和 XML 里的 SQL 。
(三)SQL 語句匹配
XML 里 SQL 語句的 id
,要和 Mapper 接口中的方法名一致,返回類型也得匹配。比如接口有 List<User> findAll();
方法,XML 中就寫 <select id="findAll" resultType="com.itheima.pojo.User">
,確保調用接口方法時,能找到對應 SQL 執行。
二、注解與 XML 開發選擇
(一)注解開發場景
MyBatis 注解適合簡單增刪改查(CRUD )。像單表的簡單查詢、插入,用 @Select
@Insert
等注解,直接在 Mapper 接口寫 SQL ,簡潔高效,少了 XML 文件配置的繁瑣。
(二)XML 開發場景
若要實現復雜 SQL 功能(比如多表關聯查詢、動態 SQL 拼接 ),推薦用 XML 配置。XML 能更清晰組織復雜 SQL ,方便維護,還支持動態標簽(<if>
<foreach>
等 ),應對多變業務需求。
三、實際應用要點
- 目錄創建:建 XML 存放目錄,牢記用
/
分隔包名(如com/it/mapper
),別用.
,否則編譯后文件位置不對,MyBatis 找不到映射文件。 - 嚴格匹配規則:開發時,仔細核對 XML 文件名、
namespace
、SQL 的id
與 Mapper 接口,稍有不匹配,就會報 “找不到 SQL 語句” 等錯誤。 - 合理選開發方式:簡單功能優先用注解,減少配置;復雜場景選 XML ,讓 SQL 管理更靈活,結合二者優勢,提升開發效率與代碼可維護性。
通過掌握這些,就能正確用 XML 配置 MyBatis 映射,根據需求選注解或 XML 開發,保障 MyBatis 持久層操作穩定、高效 。
四 手動指定XML文件目錄
#指定XML映射配置文件的位置
mybatis.mapper-locations=classpath:文件名/*.xml