MyBatis:SQL 與 Java 的「智能翻譯官」
—— 用 極簡的方式 連接數據庫和 Java 對象,告別 JDBC 的繁瑣操作!
核心定位:半自動化 ORM 框架
對比項 | JDBC 原生操作 | MyBatis 解決方案 |
---|---|---|
SQL 編寫 | 拼字符串(易出錯、難維護) | XML/注解 清晰隔離 SQL |
結果映射 | 手動遍歷 ResultSet → 對象 | 自動映射 結果到 Java 對象 |
連接管理 | 手動開/關 Connection、Statement | 自動管理資源(防泄漏) |
參數傳遞 | setString(1, “Alice”) 硬編碼 | 動態參數(#{} 防 SQL 注入) |
📌 ORM (對象關系映射):將數據庫表 自動映射為 Java 對象(如
User
類 →user
表)
核心組件圖解
核心優勢詳解
1. SQL 自由掌控
? 靈活編寫復雜 SQL(存儲過程、多表 JOIN)
? 動態 SQL:根據條件智能拼接 SQL 片段
<select id="findUsers">SELECT * FROM users<where><if test="name != null"> <!-- 動態條件 -->AND name = #{name}</if><if test="minAge != null">AND age >= #{minAge}</if></where>
</select>
2. 自動對象映射
數據庫字段 → Java 對象屬性(支持嵌套對象)
<resultMap id="userMap" type="User"><id property="id" column="user_id"/> <!-- 主鍵映射 --><result property="name" column="user_name"/><!-- 字段映射 --><!-- 嵌套對象映射 --><association property="dept" javaType="Department"><result property="deptName" column="dept_name"/></association>
</resultMap>
3. 解耦神器
- SQL 與 Java 代碼分離(XML 管理 SQL)
- 接口 + 注解 零 SQL 侵入方案(推薦)
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User getUserById(int id);
}
核心操作流程(以查詢為例)
- 定義 Mapper 接口
public interface UserMapper {User getUserById(@Param("id") int id);
}
- 編寫 SQL 映射(XML 或注解)
<!-- UserMapper.xml -->
<select id="getUserById" resultType="User">SELECT * FROM users WHERE id = #{id}
</select>
- 調用 MyBatis API
// 1. 加載配置(數據源、Mapper 路徑)
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);// 2. 獲取會話
try (SqlSession session = factory.openSession()) {// 3. 獲取 Mapper 代理對象UserMapper mapper = session.getMapper(UserMapper.class);// 4. 執行查詢 → 自動返回 User 對象User user = mapper.getUserById(1001);
}
進階特性
特性 | 用途 |
---|---|
一級/二級緩存 | 減少數據庫查詢(一級緩存默認開啟,二級緩存需手動配置) |
插件機制 | 攔截 SQL 執行(實現分頁、審計等) |
類型處理器 | 自定義 Java 類型 ? 數據庫類型轉換(如 List 轉 JSON 存儲) |
動態 SQL 標簽 | <foreach> , <choose> , <bind> 簡化復雜查詢 |
適用場景
- ? 需精細控制 SQL 的項目(如金融系統、報表查詢)
- ? 遺留數據庫(表設計不符合 ORM 規范)
- ? 高性能需求場景(比全自動 ORM 如 Hibernate 更輕量)
- ? 簡單 CRUD 小項目(可選 Spring Data JPA)
代碼對比:JDBC vs MyBatis
// ---------- JDBC 原生查詢(20+行)-----------
Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id=?");
stmt.setInt(1, 1001);
ResultSet rs = stmt.executeQuery();User user = null;
if (rs.next()) {user = new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));// ... 手動賦值所有字段
}
rs.close(); stmt.close(); conn.close(); // 必須手動關閉!// ---------- MyBatis 等效操作(1行)-----------
User user = userMapper.getUserById(1001); // SQL自動執行+結果封裝
💡 總結:
MyBatis = SQL 掌控力 + 開發高效率
—— 像寫原生 SQL 一樣靈活,像用 ORM 一樣省力!