1. 程式人生 > >Spring Boot-------JPA——EntityManager構建通用DAO

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

增刪改查 throw date print ase pre persist images lag

 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
 **/
@Repository
public 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();
    }
}

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


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

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