Hibernate 泛型實現 dao 層的基類
最近在用 Hibernate 運算元據庫的時候,發現每個實體類都要寫增刪改查,像這樣。
- package com.change.dao;
- import com.change.entity.User;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.springframework.stereotype.Repository;
- import javax.annotation.Resource;
- import java.util.List;
- /**
- * @author 言曌
- * @date 2017/12/13 下午4:35
- */
- @Repository
- public class UserDao {
- @Resource
- private SessionFactory sessionFactory;
- private Session getSession() {
- return sessionFactory.getCurrentSession();
- }
- //根據id查詢使用者
- public User findById(Integer id) {
- return (User) this.getSession().get(User.class,id);
- }
- //獲得使用者列表
- public List<User> findAll() {
- List<User> userList = this.getSession().createCriteria(User.class).list();
- return userList;
- }
- //新增使用者
- public void insert(User user) {
- this.getSession().save(user);
- }
- //刪除單個使用者
- public void delete(Integer id) {
- this.getSession().createQuery("delete User where userId=?").setParameter(0,id).executeUpdate();
- }
- //批量刪除
- public void deleteBatch(Integer[] selectFlag) {
- //陣列中封裝的是ID的集合;
- String hql = "";
- for(int i=0;i<selectFlag.length;i++) {
- if(i==0) {
- hql = "id="+selectFlag[i];
- } else {
- hql = hql + " or id="+selectFlag[i];
- }
- }
- this.getSession().createQuery("delete from User where "+hql).executeUpdate();
- }
- //更新使用者
- public void update(User user) {
- this.getSession().update(user);
- }
- }
後來發現,每寫一個實體類都要寫一份這個,這豈不是很麻煩,驗證影響程式碼精簡。為了消除冗餘度,我們還是寫一個父類,大家繼承它好了。
開始幹!
寫一個介面,BaseDao.java
- package com.change.dao;
- import java.io.Serializable;
- import java.util.List;
- /**
- * @author 言曌
- * @date 2017/12/15 下午5:09
- */
- public interface BaseDao<T, PK extends Serializable> {
- // 依據主鍵獲取實體。假設沒有對應的實體。返回 null。
- public T get(PK id);
- // 依據主鍵獲取實體。假設沒有對應的實體。丟擲異常。
- public T load(PK id);
- // 更新實體
- public void update(T entity);
- // 儲存實體到資料庫
- public void save(T entity);
- // 新增或更新實體
- public void saveOrUpdate(T entity);
- // 刪除指定的實體
- public void delete(T entity);
- // 依據主鍵刪除指定實體
- public void delete(PK id);
- //查詢所有
- public List<T> findAll();
- public void delete(PK[] ids);
- }
然後是它的實現,BaseDaoImpl.java
- package com.change.dao;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import java.io.Serializable;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.util.List;
- /**
- * @author 言曌
- * @date 2017/12/15 下午5:17
- */
- public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK> {
- // 實體類型別(由構造方法自己主動賦值)
- private Class<T> entityClass;
- // 構造方法,依據例項類自己主動獲取實體類型別
- public BaseDaoImpl() {
- this.entityClass = null;
- Class c = getClass();
- Type t = c.getGenericSuperclass();
- if (t instanceof ParameterizedType) {
- Type[] p = ((ParameterizedType) t).getActualTypeArguments();
- this.entityClass = (Class<T>) p[0];
- }
- }
- @Autowired
- private SessionFactory sessionFactory;
- private Session getSession() {
- return sessionFactory.getCurrentSession();
- }
- // 依據主鍵獲取實體。假設沒有對應的實體,返回null
- @Override
- public T get(PK id) {
- return (T) this.getSession().get(entityClass, id);
- }
- // 依據主鍵獲取實體。假設沒有對應的實體,丟擲異常。
- @Override
- public T load(PK id) {
- return (T) this.getSession().load(entityClass, id);
- }
- // 更新實體
- @Override
- public void update(T entity) {
- this.getSession().update(entity);
- }
- // 儲存實體到資料庫
- @Override
- public void save(T entity) {
- this.getSession().save(entity);
- }
- // 新增或更新實體
- @Override
- public void saveOrUpdate(T entity) {
- this.getSession().saveOrUpdate(entity);
- }
- // 刪除指定的實體
- @Override
- public void delete(T entity) {
- this.getSession().delete(entity);
- }
- // 依據主鍵刪除指定實體
- @Override
- public void delete(PK id) {
- this.delete(this.load(id));
- }
- //查詢所有
- @Override
- public List<T> findAll() {
- return this.getSession().createCriteria(entityClass).list();
- }
- //批量刪除
- @Override
- public void delete(PK[] ids) {
- //陣列中封裝的是ID的集合;
- String hql = "";
- for(int i=0;i<ids.length;i++) {
- if(i==0) {
- hql = "id="+ids[i];
- } else {
- hql = hql + " or id="+ids[i];
- }
- }
- this.getSession().createQuery("delete from User where "+hql).executeUpdate();
- }
- }
突然發現這個 BaseDao 好像 Spring Data JPA 裡的 JpaRepository 類。
基類已經寫好了,我們的 UserDao 只需要繼承 BaseDaoImpl 類了
像這樣
BaseDaoImpl<User, Integer> User 是實體型別,Integer 是主鍵型別
- package com.change.dao;
- import com.change.entity.User;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.springframework.stereotype.Repository;
- import javax.annotation.Resource;
- import java.util.List;
- /**
- * @author 言曌
- * @date 2017/12/13 下午4:35
- */
- @Repository
- public class UserDao extends BaseDaoImpl<User, Integer> {
- @Resource
- private SessionFactory sessionFactory;
- private Session getSession() {
- return sessionFactory.getCurrentSession();
- }
- //根據使用者名稱模糊查詢
- public List<User> findByUsernameLike(String username) {
- String queryString = "from User u where u.userName like'%" + username + "%'";
- return this.getSession().createQuery(queryString).list();
- }
- }
參考:https://www.cnblogs.com/lytwajue/p/6890608.html
相關文章
- Hibernate的Dao層通用設計
- 泛型類和泛型方法泛型
- 泛型類、泛型方法及泛型應用泛型
- TypeScript 泛型介面和泛型類TypeScript泛型
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- java自動生成實體類(帶註釋)和controller層,service層 dao層 xml層JavaControllerXML
- 泛型類派生子類泛型
- 【譯】在非泛型類中建立泛型方法泛型
- 泛型,內部類泛型
- 獲取Spring容器中Bean例項的工具類(Java泛型方法實現)SpringBeanJava泛型
- java 匿名 泛型 獲取真實類名Java泛型
- c#中判斷類是否繼承於泛型基類C#繼承泛型
- TS類,介面,泛型的簡介泛型
- 異端審判器!一個泛用型文字聚類模型的實現(1)聚類模型
- 等不及 go 泛型釋出,我先實現了(類似 C++ 的 template)Go泛型C++
- java 基礎 泛型Java泛型
- TypeScript基礎--泛型TypeScript泛型
- Java基礎-泛型Java泛型
- Java基礎 —— 泛型Java泛型
- 基於 golang 實現的泛型陣列,支援動態擴容等特性Golang泛型陣列
- dao層 和controllerController
- 類轉json的基類實現JSON
- 如何用反射呼叫泛型類的方法反射泛型
- dart系列之:dart類中的泛型Dart泛型
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- TS系列之介面/類/泛型泛型
- 關於mysql,需要掌握的基礎(二):JDBC和DAO層MySqlJDBC
- Go泛型基礎使用Go泛型
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- C 語言實現泛型 swap 函式泛型函式
- JAVA API:ArrayList(泛型類)基本使用JavaAPI泛型
- Java中如何使用泛型實現介面中的列表集合?Java泛型
- Go泛型解密:從基礎到實戰的全方位解析Go泛型解密
- 在C語言中實現泛型程式設計C語言泛型程式設計
- C語言如何實現泛型程式設計?C語言泛型程式設計
- Java基礎-泛型詳解Java泛型
- 【Java反射】Java 泛型基礎Java反射泛型
- Java基礎之泛型方法Java泛型