MyBatis 是優秀的持久層框架,支援自定義 SQL、存儲過程與高級映射。本文涵蓋核心架構原理、完整 CRUD 入門範例、優缺點分析與 Hibernate 比較。
MappedStatement(含參數映射、SQL、結果映射),存入 Configuration。MappedStatement,結合輸入參數動態解析 SQL(OGNL 表達式),生成 BoundSql。PreparedStatement,設定參數,執行查詢/更新。ResultMap 將 ResultSet 映射為 JavaBean、Map 或基本型別。public class User {
private int id;
private String username, sex, address;
private Date birthday;
// getter/setter/toString
}
<mapper namespace="test">
<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM user WHERE id=#{value}
</select>
<select id="findUserByName" parameterType="String" resultType="User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select>
<insert id="insertUser" parameterType="User">
<selectKey keyProperty="id" order="AFTER" resultType="int">SELECT LAST_INSERT_ID()</selectKey>
INSERT INTO user(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
</insert>
<update id="updateUser" parameterType="User">
UPDATE user SET username=#{username},... WHERE id=#{id}
</update>
<delete id="deleteUser" parameterType="int">DELETE FROM user WHERE id=#{id}</delete>
</mapper>
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("SqlMapConfig.xml"));
SqlSession session = factory.openSession();
User user = session.selectOne("test.findUserById", 1);
List<User> list = session.selectList("test.findUserByName", "小明");
session.insert("test.insertUser", newUser);
session.update("test.updateUser", updatedUser);
session.delete("test.deleteUser", 39);
session.commit(); session.close();
| 優點 | 缺點 |
|---|---|
| 上手簡單、SQL 可見可控 | SQL 編寫量大,字段多時維護成本高 |
| SQL 與程式碼解耦,便於優化 | SQL 依賴特定資料庫,移植性較差 |
| 支援動態 SQL、結果映射、關聯映射 | XML 中 ID 唯一導致 DAO 不支援方法重載 |
| 輕量級,半自動映射 | 二級快取機制較弱,易產生髒讀 |
| 維度 | MyBatis | Hibernate |
|---|---|---|
| 學習曲線 | 平緩,即學即用 | 陡峭,需精通 O/R 映射 |
| SQL 控制 | 完全手寫,可精細優化 | 自動生成,難以精細控制 |
| 對象模型 | 簡單/扁平模型友好 | 豐富領域模型強項 |
| 快取 | 簡單二級快取 | 強大二級快取,支援第三方 |
| 開發效率 | SQL 多時較低 | 模型穩定後極高 |
選型建議:複雜報表、多表關聯、需 SQL 優化 → MyBatis;豐富領域模型、快速開發、團隊精通 Hibernate → Hibernate。
MyBatis 以「SQL 為中心」提供靈活映射,適合追求 SQL 掌控力的專案。掌握 resultMap、動態 SQL、快取配置是進階關鍵。實務中常搭配 Spring Boot、PageHelper、MyBatis-Plus 提升開發效率。