HibernateTemplate 是 Spring 封裝 Hibernate 操作的核心範本類,封裝了 Session 管理、異常轉換、事務整合等樣板代碼,提供豐富的查詢與持久化方法。雖 Spring 3.1+ 建議直接使用 SessionFactory.getCurrentSession(),但大量存量專案仍在使用,掌握其用法對維護至關重要。
// 無參查詢
List<User> users = template.find("from User");
// 單參數查詢
List<User> users = template.find("from User u where u.name = ?", "test");
// 多參數查詢(陣列)
List<User> users = template.find(
"from User u where u.name = ? and u.password = ?",
new Object[]{"test", "123"}
);
// 單命名參數
String hql = "from User u where u.name = :name";
List<User> users = template.findByNamedParam(hql, "name", "xiyue");
// 多命名參數
String hql = "from User u where u.name = :name and u.password = :pwd";
String[] paramNames = {"name", "pwd"};
Object[] values = {"xiyue", "123"};
List<User> users = template.findByNamedParam(hql, paramNames, values);
User example = new User();
example.setName("bb");
example.setPassword("123");
// 等同於 where name='bb' AND password='123'
List<User> users = template.findByExample(example);
// 支援分頁
List<User> users = template.findByExample(example, 0, 10); // 首頁 10 條
注意:findByExample 僅支援等值 AND 條件,不支援 OR、範圍等複雜查詢。
| 方法 | 說明 | 對應 Hibernate 原生 |
|---|---|---|
| save(entity) | 持久化瞬時對象 | session.save() |
| update(entity) | 更新游離對象 | session.update() |
| saveOrUpdate(entity) | 根據 ID 判斷新增/更新 | session.saveOrUpdate() |
| delete(entity) | 刪除持久化對象 | session.delete() |
| get(clazz, id) | 立即載入 | session.get() |
| load(clazz, id) | 延遲載入(代理) | session.load() |
HibernateDaoSupport 即可獲得openSession()/close())遷移提示:Spring 3.1+ 已棄用
HibernateTemplate,新專案建議直接注入SessionFactory使用getCurrentSession(),配合@Transactional實現更簡潔的事務管理。