EMF.java
IJpaDao.java
/**
* 新实体转换为受控状态,事务提交时候同步数据库
* @param entity
*/
void persist(Object entity);
/**
* 批量持久化实体
* @param entitys
*/
void batchPersist(List<Object> entitys);
/**
* 删除受控(拥有持久化主键和上下文)实体
* @param entity
*/
void remove(Object entity);
/**
* 批量删除
* @param entitys
*/
void batchRemove(List<Object> entitys);
/**
* 游离态(拥有持久化主键没有上下文)实体同步数据库
* @param <T>
* @param entity
* @return
*/
<T> T merge(T entity);
/**
* 以主键值查找实体
* @param <T>
* @param entityClass
* @param pk 主键
* @return
*/
<T> T findById(Class<T> entityClass,Object pk);
/**
* 根据主键删除数据
* @param <T>
* @param entityClass
* @param pk 主键
*/
<T> void removeById(Class<T> entityClass,Object pk);
/**
* @param <T>
* @param query JPA查询语句(注意google app的限制)
* @return
*/
<T> List<T> find(String query);
/**
* 计算行数
* @param sql
* @return
*/
int countRows(String countSql);
/**
* 新增或删除或更新
* @param updateSql
* @return 影响行数
*/
int executeUpdate(String updateSql);
/**
* @param <T>
* @param countSql 查询函数的count查询语句
* @param sql 查询语句
* @param pageNo 页面号(从1开始)
* @param pageSize (分页大小)
* @return
*/
public <T> Page<T> pageQuery(String countSql,String sql,int pageNo,int pageSize);
public EntityManager getEM();
}
JpaDao.java
public <T> T findById(Class<T> entityClass, Object pk) {
EntityManager em = this.getEM();
try{
return em.find(entityClass, pk);
}finally{
em.close();
}
}
public <T> T merge(T entity) {
EntityManager em = this.getEM();
try{
return em.merge(entity);
}finally{
em.close();
}
}
public void persist(Object entity) {
EntityManager em = this.getEM();
try{
em.persist(entity);
}finally{
em.close();
}
}
public void remove(Object entity) {
EntityManager em = this.getEM();
try{
em.remove(entity);
}finally{
em.close();
}
}
/**
* 通过EMF获得entityManager实例
* @return
*/
public EntityManager getEM(){
return EMF.get().createEntityManager();
}
@Override
public <T> void removeById(Class<T> entityClass, Object pk) {
EntityManager em = this.getEM();
try{
T t = em.find(entityClass, pk);
em.remove(t);
}finally{
em.close();
}
}
@SuppressWarnings("unchecked")
@Override
public <T> List<T> find(String query) {
EntityManager em = this.getEM();
try{
List<T> l = em.createQuery(query).getResultList();
//强制获取所有对象在em close前
l.size();
return l;
}finally{
em.close();
}
}
@Override
public int countRows(String countSql) {
EntityManager em = this.getEM();
try{
return (Integer)em.createQuery(countSql).getSingleResult();
}finally{
em.close();
}
}
@Override
public void batchPersist(List<Object> entitys) {
EntityManager em = this.getEM();
try{
for(Object o : entitys)
this.persist(o);
}finally{
em.close();
}
}
@Override
public void batchRemove(List<Object> entitys) {
EntityManager em = this.getEM();
try{
for(Object o : entitys)
this.remove(o);
}finally{
em.close();
}
}
@Override
public int executeUpdate(String updateSql) {
EntityManager em = this.getEM();
try{
return em.createQuery(updateSql).executeUpdate();
}finally{
em.close();
}
}
@SuppressWarnings("unchecked")
@Override
public <T> Page<T> pageQuery(String countSql,String sql, int pageNo, int pageSize) {
EntityManager em = this.getEM();
try{
int totalCount = this.countRows(countSql);
//没有数据返回空page
if (totalCount < 1)
return new Page<T>();
// 当前页的开始数据索引
Long startIndex = Page.getStartOfPage(pageNo, pageSize);
Query query = em.createQuery(sql);
List<T> l = query.setFirstResult(startIndex.intValue()).setMaxResults(pageSize).getResultList();
l.size();
return new Page(startIndex,totalCount,pageSize,l);
}finally{
em.close();
}
}
}
Page.java
我用这个dao做的一个google app的小测试,感觉google app速度就是不照。