Spring Boot-------JPA——EntityManager構建通用DAO,
EntityManager
EntityManager 是用來對實體Bean 進行操作的輔助類。他可以用來產生/刪除持久化的實體Bean,通過主鍵尋找實體bean,也可以通過EJB3 QL 語言尋找滿足條件的實體Bean。實體Bean 被EntityManager 管理時,EntityManager跟蹤他的狀態改變,在任何決定更新實體Bean 的時候便會把發生改變的值同步到資料庫中。當實體Bean 從EntityManager 分離後,他是不受管理的,EntityManager 無法跟蹤他的任何狀態改變。EntityManager 的擷取前面已經介紹過,可以通過@PersistenceContext 注釋由EJB 容器動態注入。
Entitymanager的核心概念圖
EntityManager構建通用DAO
一般的開發都是需要每一個實體類都要構建一個DAO去繼承JPA的一些類,我不咋喜歡這樣的感覺,我比較喜歡一個項目中簡潔不亂,所有偷懶的寫了一個四不像的通用DAO
1、首先可以去官網看一下,瞭解一下entitymanager的一些方法
- persist() :添加實體Bean
- flush() :將實體的改變立刻重新整理到資料庫中
- merge () :比較麻煩,用好了很不錯,配合flush
- Remove() :刪除對象
- createQuery() :返回Query對象,以執行JPQL語句
- createNativeQuery() :返回Query對象,以執行SQL語句
- refresh() :重新整理實體Bean,以得到對新對象
- contains(): 檢測實體當前是否被管理中
- clear() 分離所有當前正在被管理的實體
2、用@PersistenceContext動態注入Entitymanager
先來一個BaseDAO
public interface BaseAppDAO<T,ID extends Serializable> { /** * 儲存資料對象 * @param entity * @return */ boolean save(T entity); /** * 根據id查詢 * @param id * @param t * @return */ T findByid(T t,Long id); /** * 根據表名,欄位,參數查詢,拼接sql語句 * @param tablename 表名 * @param filed 欄位名 * @param o 欄位參數 * @return */ List<T> findBysql(String tablename,String filed,Object o); Object findObjiectBysql(String tablename,String filed,Object o); /** * 多個欄位的查詢 * @param tablename 表名 * @param map 將你的欄位傳入map中 * @return */ List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map); /** * 多欄位查詢分頁 * @param tablename 表名 * @param map 以map儲存key,value * @param start 第幾頁 * @param pageNumer 一個頁面的條數 * @return */ List<T> findByMoreFiledpages(String tablename, LinkedHashMap<String,Object> map, int start, int pageNumer); /** * 一個欄位的分頁 * @param tablename 表名 * @param filed 欄位名 * @param o 欄位參數 * @param start 第幾頁 * @param pageNumer 一個頁面多少條資料 * @return */ List<T> findpages(String tablename,String filed,Object o,int start,int pageNumer); /** * 根據表的id刪除資料 * @param entity */ boolean delete(T entity); /** * 更新對象 * @param e * @return */ boolean update(T e); /** * 根據傳入的map遍曆key,value拼接字串,以id為條件更新 * @param tablename 表名 * @param map 傳入參數放入map中 * @return */ Integer updateMoreFiled(String tablename,LinkedHashMap<String,Object> map); /** * 根據條件查詢總條數返回object類型 * @param tablename 表名 * @param map 傳入參數放入map中 * @return */ Object findCount(String tablename, LinkedHashMap<String,Object> map);}
再寫一個實作類別BaseDAOimpl,其中注意的是@Transactional事務的注入
/** * @author 堅持到底gl * @create 2017-09-26 10:36 * @desc **/@Repositorypublic class BaseAppDAOimpl<T,ID extends Serializable> implements BaseAppDAO<T,ID> { @PersistenceContext private EntityManager entityManager; @Transactional @Override public boolean save(T entity){ boolean flag=false; try { entityManager.persist(entity); flag=true; }catch (Exception e){ System.out.println("---------------儲存出錯---------------"); throw e; } return flag; } @Transactional @Override public Object findByid(Object o,Long id) { return entityManager.find(o.getClass(),id); } @Transactional @Override public List<T> findBysql(String tablename, String filed, Object o ) { String sql="from "+tablename+" u WHERE u."+filed+"=?"; System.out.println(sql+"--------sql語句-------------"); Query query=entityManager.createQuery(sql); query.setParameter(1,o); List<T> list= query.getResultList(); entityManager.close(); return list; } @Override public Object findObjiectBysql(String tablename, String filed, Object o) { String sql="from "+tablename+" u WHERE u."+filed+"=?"; System.out.println(sql+"--------sql語句-------------"); Query query=entityManager.createQuery(sql); query.setParameter(1,o); entityManager.close(); return query.getSingleResult(); } @Transactional @Override public List<T> findByMoreFiled(String tablename,LinkedHashMap<String,Object> map) { String sql="from "+tablename+" u WHERE "; Set<String> set=null; set=map.keySet(); List<String> list=new ArrayList<>(set); List<Object> filedlist=new ArrayList<>(); for (String filed:list){ sql+="u."+filed+"=? and "; filedlist.add(filed); } sql=sql.substring(0,sql.length()-4); System.out.println(sql+"--------sql語句-------------"); Query query=entityManager.createQuery(sql); for (int i=0;i<filedlist.size();i++){ query.setParameter(i+1,map.get(filedlist.get(i))); } List<T> listRe= query.getResultList(); entityManager.close(); return listRe; } @Transactional @Override public List<T> findByMoreFiledpages(String tablename,LinkedHashMap<String,Object> map,int start,int pageNumber) { String sql="from "+tablename+" u WHERE "; Set<String> set=null; set=map.keySet(); List<String> list=new ArrayList<>(set); List<Object> filedlist=new ArrayList<>(); for (String filed:list){ sql+="u."+filed+"=? and "; filedlist.add(filed); } sql=sql.substring(0,sql.length()-4); System.out.println(sql+"--------sql語句-------------"); Query query=entityManager.createQuery(sql); for (int i=0;i<filedlist.size();i++){ query.setParameter(i+1,map.get(filedlist.get(i))); } query.setFirstResult((start-1)*pageNumber); query.setMaxResults(pageNumber); List<T> listRe= query.getResultList(); entityManager.close(); return listRe; } @Transactional @Override public List<T> findpages(String tablename, String filed, Object o, int start, int pageNumer) { String sql="from "+tablename+" u WHERE u."+filed+"=?"; System.out.println(sql+"--------page--sql語句-------------"); List<T> list=new ArrayList<>(); try { Query query=entityManager.createQuery(sql); query.setParameter(1,o); query.setFirstResult((start-1)*pageNumer); query.setMaxResults(pageNumer); list= query.getResultList(); entityManager.close(); }catch (Exception e){ System.out.println("------------分頁錯誤---------------"); } return list; } @Transactional @Override public boolean update(T entity) { boolean flag = false; try { entityManager.merge(entity); flag = true; } catch (Exception e) { System.out.println("---------------更新出錯---------------"); } return flag; } @Transactional @Override public Integer updateMoreFiled(String tablename, LinkedHashMap<String, Object> map) { String sql="UPDATE "+tablename+" AS u SET "; Set<String> set=null; set=map.keySet(); List<String> list=new ArrayList<>(set); for (int i=0;i<list.size()-1;i++){ if (map.get(list.get(i)).getClass().getTypeName()=="java.lang.String"){ System.out.println("-*****"+map.get(list.get(i))+"------------"+list.get(i)); sql+="u."+list.get(i)+"='"+map.get(list.get(i))+"' , "; }else { sql+="u."+list.get(i)+"="+map.get(list.get(i))+" , "; } } sql=sql.substring(0,sql.length()-2); sql+="where u.id=? "; System.out.println(sql+"--------sql語句-------------"); int resurlt=0; try { Query query=entityManager.createQuery(sql); query.setParameter(1,map.get("id")); resurlt= query.executeUpdate(); }catch (Exception e){ System.out.println("更新出錯-----------------------"); e.printStackTrace(); } return resurlt; } @Transactional @Override public boolean delete(T entity) { boolean flag=false; try { entityManager.remove(entityManager.merge(entity)); flag=true; }catch (Exception e){ System.out.println("---------------刪除出錯---------------"); } return flag; } @Override public Object findCount(String tablename, LinkedHashMap<String, Object> map) { String sql="select count(u) from "+tablename+" u WHERE "; Set<String> set=null; set=map.keySet(); List<String> list=new ArrayList<>(set); List<Object> filedlist=new ArrayList<>(); for (String filed:list){ sql+="u."+filed+"=? and "; filedlist.add(filed); } sql=sql.substring(0,sql.length()-4); System.out.println(sql+"--------sql語句-------------"); Query query=entityManager.createQuery(sql); for (int i=0;i<filedlist.size();i++){ query.setParameter(i+1,map.get(filedlist.get(i))); } return query.getSingleResult(); }}
這一套就可以完成一個項目的差不多增刪改查了,需要其他特殊功能的可以自行添加
【版本聲明】本文為博主原創文章,轉載請註明出處