在ssh框架中抽取BaseDao簡單的CRUD
阿新 • • 發佈:2019-02-08
package com.tax.core.dao;
import java.io.Serializable;
import java.util.List;
/**
* BaseDao
* @author qu.pei.jun
* @date 2018年1月26日 上午10:30:44
* @version v1.0
*/
publicinterfaceBaseDao<T>{
/**
* 新增
* @param entity
*/
publicvoid save(T entity);
/**
* 更新
* @param entity
*/
publicvoid update(T entity);
/**
* 根據id刪除
* @param id
*/
publicvoid deleteById(Serializable id);
/**
* 通過id查詢
* @param id
* @return 實體
*/
public T findById(Serializable id);
/**
* 查詢所有
* @return List集合
*/
publicList<T> findAll();
}
package com.tax.core.dao.impl;
import java.io.Serializable;
import java.lang.reflect
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport
import com.tax.core.dao.BaseDao;
/**
* BaseDaoImpl
* @author ZENG.XIAO.YAN
* @date 2017年6月29日 下午12:23:16
* @version v1.0
*/
publicabstractclassBaseDaoImpl<T>extendsHibernateDaoSupportimplementsBaseDao<T>{
privateClass<T> clazz;
// 按照型別自動注入SessionFactory; 在例項化的時候,Spring按照形參的型別自動注入
@Autowired
publicvoid setMySessionFactory(SessionFactory sessionFactory){
setSessionFactory(sessionFactory);
}
publicBaseDaoImpl(){
//this表示當前被例項化的物件;如UserDaoImpl
ParameterizedType pt =(ParameterizedType)this.getClass().getGenericSuperclass();//BaseDaoImpl<User>
clazz =(Class<T>)pt.getActualTypeArguments()[0];
}
/**
* 獲取session
* @return session
*/
publicSession getCurrentSession(){
Session session =null;
try{
session = getSessionFactory().getCurrentSession();
}catch(HibernateException e){
thrownewRuntimeException("getCurrentSession error", e);
//session = getSessionFactory().openSession();
}
return session;
}
@Override
publicvoid save(T entity){
getHibernateTemplate().save(entity);
}
@Override
publicvoid update(T entity){
getHibernateTemplate().update(entity);
}
@Override
publicvoid deleteById(Serializable id){
getHibernateTemplate().delete(findById(id));
}
@Override
public T findById(Serializable id){
return getHibernateTemplate().get(clazz, id);
}
@Override
publicList<T> findAll(){
Session session = getCurrentSession();
Query query = session.createQuery("FROM "+ clazz.getSimpleName());
return query.list();
}
}
使用HibernateDaoSupport需要注入SessionFactorytory,這個注入的動作其實可以交給BaseDaoImpl的子類去完成的。
如:StudentImpl繼承了BaseDaoImpl。那麼在Spring的xml檔案按照下面配置即可
但是:我覺得這樣很麻煩,而且我Dao層我想直接用註解。我不想在每個Dao裡都去寫這個注入的動作。 所以就準備在BaseDaoImpl裡面去完成這個注入動作。 下面開始了我的探索之路: 方案一: 在BaseDaoImpl裡面定義SessionFactory的屬性,然後屬性用註解把它注入。 最後在構造器裡把這個SessionFactory通過set給HibernateDaoSupport。 具體的如下圖:
結果:雖然想法沒問題,但是後面發現在例項化的時候,這個sessionFactory還沒注進來。 在專案啟動的是時候就報錯了,因為我給別人的SessionFactory個設定為null了;所以失敗了。 後面通過百度發現,原來Spring容器管理的類中,這個@Autowired注入是在物件例項化完成之後。 所以對Spring容器對bean的例項化過程的還是需要掌握的,筆者在這塊掌握得不好。 方案二: 在BaseDaoImpl中定義一個方法,在方法上加個註解。然後方法中把註解注入的形參(sessionFactory) 通過set給HibernateDaoSupport。 具體如下圖: 結果: 注入成功,這個註解是根據形參的型別自動注入的。sessionFactory會在Spring例項化這Dao後注入。
通過這個探索,發現了自己對Spring的知識掌握得不夠,不知道用註解來注入是在物件例項化之後。