1. 程式人生 > >在ssh框架中抽取BaseDao簡單的CRUD

在ssh框架中抽取BaseDao簡單的CRUD

  1. package com.tax.core.dao;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. /**
  5. * BaseDao
  6. * @author qu.pei.jun
  7. * @date 2018年1月26日 上午10:30:44
  8. * @version v1.0
  9. */
  10. publicinterfaceBaseDao<T>{
  11. /**
  12. * 新增
  13. * @param entity
  14. */
  15. publicvoid save(T entity);
  16. /**
  17. * 更新
  18. * @param entity
  19. */
  20. publicvoid update(T entity);
  21. /**
  22. * 根據id刪除
  23. * @param id
  24. */
  25. publicvoid deleteById(Serializable id);
  26. /**
  27. * 通過id查詢
  28. * @param id
  29. * @return 實體
  30. */
  31. public T findById(Serializable id);
  32. /**
  33. * 查詢所有
  34. * @return List集合
  35. */
  36. publicList<T> findAll();
  37. }
    (2)BaseDaoImpl的程式碼
  1. package com.tax.core.dao.impl;
  2. import java.io.Serializable;
  3. import java.lang.reflect
    .ParameterizedType;
  4. import java.util.List;
  5. import org.hibernate.HibernateException;
  6. import org.hibernate.Query;
  7. import org.hibernate.Session;
  8. import org.hibernate.SessionFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.orm.hibernate5.support.HibernateDaoSupport
    ;
  11. import com.tax.core.dao.BaseDao;
  12. /**
  13. * BaseDaoImpl
  14. * @author ZENG.XIAO.YAN
  15. * @date 2017年6月29日 下午12:23:16
  16. * @version v1.0
  17. */
  18. publicabstractclassBaseDaoImpl<T>extendsHibernateDaoSupportimplementsBaseDao<T>{
  19. privateClass<T> clazz;
  20. // 按照型別自動注入SessionFactory; 在例項化的時候,Spring按照形參的型別自動注入
  21. @Autowired
  22. publicvoid setMySessionFactory(SessionFactory sessionFactory){
  23. setSessionFactory(sessionFactory);
  24. }
  25. publicBaseDaoImpl(){
  26. //this表示當前被例項化的物件;如UserDaoImpl
  27. ParameterizedType pt =(ParameterizedType)this.getClass().getGenericSuperclass();//BaseDaoImpl<User>
  28. clazz =(Class<T>)pt.getActualTypeArguments()[0];
  29. }
  30. /**
  31. * 獲取session
  32. * @return session
  33. */
  34. publicSession getCurrentSession(){
  35. Session session =null;
  36. try{
  37. session = getSessionFactory().getCurrentSession();
  38. }catch(HibernateException e){
  39. thrownewRuntimeException("getCurrentSession error", e);
  40. //session = getSessionFactory().openSession();
  41. }
  42. return session;
  43. }
  44. @Override
  45. publicvoid save(T entity){
  46. getHibernateTemplate().save(entity);
  47. }
  48. @Override
  49. publicvoid update(T entity){
  50. getHibernateTemplate().update(entity);
  51. }
  52. @Override
  53. publicvoid deleteById(Serializable id){
  54. getHibernateTemplate().delete(findById(id));
  55. }
  56. @Override
  57. public T findById(Serializable id){
  58. return getHibernateTemplate().get(clazz, id);
  59. }
  60. @Override
  61. publicList<T> findAll(){
  62. Session session = getCurrentSession();
  63. Query query = session.createQuery("FROM "+ clazz.getSimpleName());
  64. return query.list();
  65. }
  66. }
    (3)對BaseDaoImpl的說明
            使用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的知識掌握得不夠,不知道用註解來注入是在物件例項化之後。

 二、使用寫好的BaseDao和BaseImpl

        (1)Dao介面直接繼承BaseDao即可,下面以StudentDao介面為例                          (2)Dao的實現類,需要繼承BaseDaoImpl,下面以StudentDaoImpl為例                  

三、結束語

        通過抽取這個BaseDao,後續的CRUD就很方便了。