Spring Boot-------JPA——EntityManager構建通用DAO,

來源:互聯網
上載者:User

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();    }}

這一套就可以完成一個項目的差不多增刪改查了,需要其他特殊功能的可以自行添加

 
            【版本聲明】本文為博主原創文章,轉載請註明出處

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.