多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > JPA EntityManager高級

JPA EntityManager高級

來源:程序員人生   發布時間:2015-05-20 11:05:29 閱讀次數:4078次

面向對象的使用,抽象封裝是家常必備,前兩篇博客說道了基本的操作分別是:

  JPA EntitManager初體驗

  JPA EntitManager進階

這次我們就對前兩次的方法進行1個基本的抽象封裝

1個方法為了應對不同類型的使用,同時為了類型安全,我們引入了泛型。泛型的加入,使方法更具有靈活性,同時也保證類型的安全,下面我們就對基本的增,該查進行基本封裝。

 

定義泛型類  

1 抽象類BaseEaoImpl<T>

Public abstract class BaseEaoImpl<T> { //實體管理器援用 protected abstract EntityManager getEntityManager(); //反射對象 private Class<T> clazz; }

先來看我們的最基本的幾個方法吧


persist(Object)

find(Class<T>,object)

createQuery(String)

merge(TEntity)


要到達的要求是這4種方法適應所有的實體類型,所以抽象出來的Eao最少是子類的抽象,到達1個公用的效果

 

其次對使用泛型的類型,對其操作還是要知道真實的類型,這里就用到了反射獲得泛型真是類型

 1.1 構造函數反射獲得泛型真是類型

        

/** * 構造函數反射泛型對象真實類型 */ public BaseEaoImpl() { ParameterizedType pType = (ParameterizedType) this.getClass().getGenericSuperclass();// 獲得當前new的對象的泛型父類 this.clazz = (Class<T>)pType.getActualTypeArguments()[0];// 獲得類型參數的真是值,就是泛型參數的個數; className= clazz.getSimpleName(); System.out.println(clazz+" "+className); }


 1.2Save方法

  保存實體

public void save(T t) { getEntityManager().persist(t); }
 

//批量保存實體

Publci booleansaveEntitys(List<T) entitys){ //為了提升性能,我們對數據進行分批次的保存,手動控制更新到數據庫 boolean flag = false; try { // 每100條往數據庫里寫入1次,相對提升性能,此值可改變 int batchSize = 100; int i = 0; for (T entity : entitys) { getEntityManager().persist(entity); i++; if (i % batchSize == 0) { getEntityManager().flush(); getEntityManager().clear(); } } flag = true; if (logger.isDebugEnabled()) { logger.debug("Eao批量保存實體成功," + getEntityManager().getClass().getName()); } } catch (Exception e) { flag = false; logger.error("Eao批量保存實體失敗", e); } return flag; }

 

 1.3 find方法

find方法,根據id或實體的某個屬性查詢等,這個時候就需要使用泛型具體類型了

 

//根據主鍵id查詢 public T findEntityById(Serializable id){ return getEntityManager().find(clazz, id); }

固然了還可以傳入集合Id

//根據id集合查詢實體集合 public List<T> getByIds(List<String> ids) { return getEntityManager().createQuery(// "FROM " + className + "WHERE id in (:ids)")// .setParameter("ids", ids)// .list(); }

1.4 更新merge

//更新實體 ---留意級聯更新的效果

public boolean updateEntity(T entity) { boolean flag = false; try { getEntityManager().merge(entity); flag = true; } catch (Exception e) { flag = false; logger.error("Eao更新實體失敗", e); } return flag; }

1.5 createQuery

createQuery的用法博大精深,以上的任何1個用戶幾近都可以用creaQuery替換


如: queryByHql

參數hqlhql語句,

Maphql中的參數與值

public List queryByHql(final String hql, final Map<Serializable, Serializable> map) { if (null == hql || "".equals(hql)) { return null; } try { Query query = getEntityManager().createQuery(hql); for (Serializable key : map.keySet()) { query.setParameter((String) key, map.get(key)); } List list = query.getResultList(); if (logger.isDebugEnabled()) { logger.debug("Eao根據hql語句查詢實體集合成功," + getEntityManager().getClass().getName()); } return list; } catch (Exception e) { logger.error("Eao根據hql語句查詢實體集合失敗", e); return null; } }

實例:

public List findSmallQuesID(String paperID,String questionTypeId){ //參數hql語句 String hql = "From PaperSecond where paperID =:paperID AND questionTypeID=:questionTypeId"; //參數hal參數與值 Map<Serializable, Serializable> map = new HashMap<Serializable, Serializable>(); map.put("paperID", paperID); map.put("questionTypeId", questionTypeId); List<PaperDetail> paperSecondList = paperSecondEao.queryByHql(hql, map); return paperSecondList; }

//根據條件更新 

//根據條件更新 //String variable(要更新的字段), String condition(更新的條件),Object... args public boolean updateByCondition(String variable, String condition, Object... args) { boolean flag = false; qltry { Query query = getEntityManager().createQuery( "update " + clazz.getSimpleName() + " as o set " + variable + " " + condition); for (int i = 0; i < args.length; i++) { query.setParameter(i + 1, args[i]); } query.executeUpdate(); flag = true; if (logger.isDebugEnabled()) { logger.debug("Eao根據條件更新實體成功," + getEntityManager().getClass().getName()); } } catch (Exception e) { flag = false; logger.error("Eao根據條件更新實體失敗", e); } return flag; }

實例:    

String variable="studentName=?,sex=?";//要修改的字段,參數用? String condition="wherestudentCode=?";//條件 flag= studentBean.updateByCondition(variable, condition, "參數1","參數2","參數3");

總結: 

通過以上幾個小的實例我們認識到,幾個小小的方法,可以引申出很多的變化,但是重點還是在于不斷的總結,不斷的抽象,特別在于對hql語句上。

 

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: ppypp日本欧美一区二区 | 91免费福利视频 | 麻豆看片 | 天天视频国产免费入口 | ccav成人| 亚洲区小说区图片区qvod | 日韩手机在线视频 | 三级欧美在线 | 精品亚洲成a人在线播放 | 欧美 自拍偷拍 | 一区二区三区在线视频观看 | 久久精品中文字幕极品 | 97午夜理伦片在线影院 | 欧美国产日韩一区二区三区 | 在线播放一区二区三区 | 色网色| 麻豆久久精品免费看国产 | 久久精品免费看 | 国产免费一区2区3区4区 | 老司机免费福利视频 | 亚洲精品一区二区三区在线播放 | 免费jizz在线播放视频高清版 | 国产一区亚洲二区三区 | 亚洲第一永久在线观看 | 国内久久久久久久久久 | 国产精品天天看天天爽 | 日本综合欧美一区二区三区 | 毛片在线播放观看日本 | 亚洲天堂在线播放 | 欧美俄罗斯一级毛片 | 青青青青爽极品在线视频 | 插插插网站| 久草视频在线网 | 精品久久成人 | 最近最新中文字幕在线手机版 | 99爱免费观看视频在线 | 国产成人一区二区 | 亚洲精品一区二区久久 | 免费看欧美毛片大片免费看 | 成人中文字幕在线观看 | 亚洲综合精品成人啪啪 |