要到達的要求是這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
參數hql為hql語句,
Map為hql中的參數與值
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語句上。