程序员人生 网站导航

JPA EntityManager高级

栏目:php教程时间:2015-05-20 11:05:29

面向对象的使用,抽象封装是家常必备,前两篇博客说道了基本的操作分别是:

  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语句上。

 

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐