承接上篇「封裝 HibernateTemplate」,本篇展示通過繼承 HibernateDaoSupport 進一步簡化 DAO 開發,無需手動注入 template。
HibernateDaoSupportgetHibernateTemplate() 獲得模板package www.csdn.spring.hibernate.dao.copy;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import www.csdn.spring.hibernate.domain.Users;
public class UsersDaoImpl extends HibernateDaoSupport implements UsersDao {
@Override
public void save(Users entity) {
getHibernateTemplate().save(entity);
}
@Override
public List getObjects(Class clazz) {
return getHibernateTemplate().find("from " + clazz.getName());
}
@Override
public void deleteById(Class clazz, Integer id) {
// 批量刪除 HQL
getHibernateTemplate().bulkUpdate("delete from " + clazz.getName() + " where id=" + id);
}
@Override
public void update(Users entity) {
getHibernateTemplate().update(entity);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 抽象父 Bean,注入 hibernateTemplate -->
<bean id="hibernateDaoSupport" class="org.springframework.orm.hibernate3.support.HibernateDaoSupport" abstract="true">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<!-- 實際 DAO 繼承父 Bean,自動獲得 template -->
<bean id="usersDaoImpl" class="www.csdn.spring.hibernate.dao.copy.UsersDaoImpl" parent="hibernateDaoSupport">
</bean>
</beans>
| 方式 | 代碼量 | 耦合度 | 推薦場景 |
|---|---|---|---|
| 手動注入 HibernateTemplate | 需 setter + XML property | 依賴具體模板類 | 早期版本、需精細控制 |
| 繼承 HibernateDaoSupport | 零配置繼承,直接用 getHibernateTemplate() | 依賴基類,但更簡潔 | 標準 CRUD、快速開發 |
| 現代 @Repository + @Autowired SessionFactory | 註解驅動,無 XML | 最低,面向接口 | Spring 3.1+、Hibernate 4+ 項目 |
HibernateDaoSupport 屬於 org.springframework.orm.hibernate3 包,對應 Hibernate 3.x。Hibernate 4/5 建議直接注入 SessionFactory 使用 getCurrentSession()。bulkUpdate 執行 HQL DML,效率高於逐條加載刪除。abstract="true" 防止被實例化為獨立 Bean。掌握三種 DAO 寫法演進,理解 Spring 對模板模式的封裝演進,可根據項目版本靈活選擇最優方案。