Hibernate 泛型實現 dao 層的基類

言曌發表於2018-04-02

最近在用 Hibernate 運算元據庫的時候,發現每個實體類都要寫增刪改查,像這樣。

  1. package com.change.dao;
  2. import com.change.entity.User;
  3. import org.hibernate.Query;
  4. import org.hibernate.Session;
  5. import org.hibernate.SessionFactory;
  6. import org.springframework.stereotype.Repository;
  7. import javax.annotation.Resource;
  8. import java.util.List;
  9. /**
  10.  * @author 言曌
  11.  * @date 2017/12/13 下午4:35
  12.  */
  13. @Repository
  14. public class UserDao {
  15.     @Resource
  16.     private SessionFactory sessionFactory;
  17.     private Session getSession() {
  18.         return sessionFactory.getCurrentSession();
  19.     }
  20.     //根據id查詢使用者
  21.     public User findById(Integer id) {
  22.         return (User) this.getSession().get(User.class,id);
  23.     }
  24.     //獲得使用者列表
  25.     public List<User> findAll() {
  26.         List<User> userList = this.getSession().createCriteria(User.class).list();
  27.         return userList;
  28.     }
  29.     //新增使用者
  30.     public void insert(User user) {
  31.         this.getSession().save(user);
  32.     }
  33.     //刪除單個使用者
  34.     public void delete(Integer id) {
  35.         this.getSession().createQuery("delete User where userId=?").setParameter(0,id).executeUpdate();
  36.     }
  37.     //批量刪除
  38.     public void deleteBatch(Integer[] selectFlag) {
  39.         //陣列中封裝的是ID的集合;
  40.         String hql = "";
  41.         for(int i=0;i<selectFlag.length;i++) {
  42.             if(i==0) {
  43.                 hql = "id="+selectFlag[i];
  44.             } else {
  45.                 hql = hql + " or id="+selectFlag[i];
  46.             }
  47.         }
  48.         this.getSession().createQuery("delete from User where "+hql).executeUpdate();
  49.     }
  50.     //更新使用者
  51.     public void update(User user) {
  52.         this.getSession().update(user);
  53.     }
  54. }

 

後來發現,每寫一個實體類都要寫一份這個,這豈不是很麻煩,驗證影響程式碼精簡。為了消除冗餘度,我們還是寫一個父類,大家繼承它好了。

 

開始幹!

 

寫一個介面,BaseDao.java

  1. package com.change.dao;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. /**
  5.  * @author 言曌
  6.  * @date 2017/12/15 下午5:09
  7.  */
  8. public interface BaseDao<T, PK extends Serializable> {
  9.     // 依據主鍵獲取實體。假設沒有對應的實體。返回 null。
  10.     public T get(PK id);
  11.     // 依據主鍵獲取實體。假設沒有對應的實體。丟擲異常。
  12.     public T load(PK id);
  13.     // 更新實體
  14.     public void update(T entity);
  15.     // 儲存實體到資料庫
  16.     public void save(T entity);
  17.     // 新增或更新實體
  18.     public void saveOrUpdate(T entity);
  19.     // 刪除指定的實體
  20.     public void delete(T entity);
  21.     // 依據主鍵刪除指定實體
  22.     public void delete(PK id);
  23.     //查詢所有
  24.     public List<T> findAll();
  25.     public void delete(PK[] ids);
  26. }

 

然後是它的實現,BaseDaoImpl.java

  1. package com.change.dao;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import java.io.Serializable;
  6. import java.lang.reflect.ParameterizedType;
  7. import java.lang.reflect.Type;
  8. import java.util.List;
  9. /**
  10.  * @author 言曌
  11.  * @date 2017/12/15 下午5:17
  12.  */
  13. public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK> {
  14.     // 實體類型別(由構造方法自己主動賦值)
  15.     private Class<T> entityClass;
  16.     // 構造方法,依據例項類自己主動獲取實體類型別
  17.     public BaseDaoImpl() {
  18.         this.entityClass = null;
  19.         Class c = getClass();
  20.         Type t = c.getGenericSuperclass();
  21.         if (t instanceof ParameterizedType) {
  22.             Type[] p = ((ParameterizedType) t).getActualTypeArguments();
  23.             this.entityClass = (Class<T>) p[0];
  24.         }
  25.     }
  26.     @Autowired
  27.     private SessionFactory sessionFactory;
  28.     private Session getSession() {
  29.         return sessionFactory.getCurrentSession();
  30.     }
  31.     // 依據主鍵獲取實體。假設沒有對應的實體,返回null
  32.     @Override
  33.     public T get(PK id) {
  34.         return (T) this.getSession().get(entityClass, id);
  35.     }
  36.     // 依據主鍵獲取實體。假設沒有對應的實體,丟擲異常。
  37.     @Override
  38.     public T load(PK id) {
  39.         return (T) this.getSession().load(entityClass, id);
  40.     }
  41.     // 更新實體
  42.     @Override
  43.     public void update(T entity) {
  44.         this.getSession().update(entity);
  45.     }
  46.     // 儲存實體到資料庫
  47.     @Override
  48.     public void save(T entity) {
  49.         this.getSession().save(entity);
  50.     }
  51.     // 新增或更新實體
  52.     @Override
  53.     public void saveOrUpdate(T entity) {
  54.         this.getSession().saveOrUpdate(entity);
  55.     }
  56.     // 刪除指定的實體
  57.     @Override
  58.     public void delete(T entity) {
  59.         this.getSession().delete(entity);
  60.     }
  61.     // 依據主鍵刪除指定實體
  62.     @Override
  63.     public void delete(PK id) {
  64.         this.delete(this.load(id));
  65.     }
  66.     //查詢所有
  67.     @Override
  68.     public List<T> findAll() {
  69.         return this.getSession().createCriteria(entityClass).list();
  70.     }
  71.     //批量刪除
  72.     @Override
  73.     public void delete(PK[] ids) {
  74.         //陣列中封裝的是ID的集合;
  75.         String hql = "";
  76.         for(int i=0;i<ids.length;i++) {
  77.             if(i==0) {
  78.                 hql = "id="+ids[i];
  79.             } else {
  80.                 hql = hql + " or id="+ids[i];
  81.             }
  82.         }
  83.         this.getSession().createQuery("delete from User where "+hql).executeUpdate();
  84.     }
  85. }

突然發現這個 BaseDao 好像 Spring Data JPA 裡的 JpaRepository 類。

 

 

基類已經寫好了,我們的  UserDao  只需要繼承 BaseDaoImpl 類了

像這樣

BaseDaoImpl<User, Integer>   User 是實體型別,Integer 是主鍵型別

  1. package com.change.dao;
  2. import com.change.entity.User;
  3. import org.hibernate.Query;
  4. import org.hibernate.Session;
  5. import org.hibernate.SessionFactory;
  6. import org.springframework.stereotype.Repository;
  7. import javax.annotation.Resource;
  8. import java.util.List;
  9. /**
  10.  * @author 言曌
  11.  * @date 2017/12/13 下午4:35
  12.  */
  13. @Repository
  14. public class UserDao extends BaseDaoImpl<User, Integer> {
  15.     @Resource
  16.     private SessionFactory sessionFactory;
  17.     private Session getSession() {
  18.         return sessionFactory.getCurrentSession();
  19.     }
  20.     //根據使用者名稱模糊查詢
  21.     public List<User> findByUsernameLike(String username) {
  22.         String queryString = "from User u where u.userName like'%" + username + "%'";
  23.         return this.getSession().createQuery(queryString).list();
  24.     }
  25. }

 

參考:https://www.cnblogs.com/lytwajue/p/6890608.html

 

本文地址:https://liuyanzhao.com/6989.html

相關文章