`

JPA EntityManager高级

 
阅读更多

原文链接:http://blog.csdn.net/han_yankun2009/article/details/45401935

 

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

  JPA EntitManager初体验

  JPA EntitManager进阶

这次咱们就对前两次的方法进行一个基本的抽象封装

一个方法为了应对不同类型的使用,同时为了类型安全,我们引入了泛型。泛型的加入,使方法更具有灵活性,同时也保证类型的安全,下面咱们就对基本的增,该查进行基本封装。

 

定义泛型类  

1 抽象类BaseEaoImpl<T>

  1. Public abstract class BaseEaoImpl<T>  
  2.    
  3. {  
  4. //实体管理器引用  
  5. protected abstract EntityManager getEntityManager();  
  6. //反射对象  
  7. private Class<T> clazz;  
  8.   
  9. }  

先来看我们的最基本的几个方法吧

 

persist(Object)

find(Class<T>,object)

createQuery(String)

merge(TEntity)

 

要达到的要求是这四种方法适应所有的实体类型,所以抽象出来的Eao至少是子类的抽象,达到一个公用的效果

 

其次对于使用泛型的类型,对其操作还是要知道真实的类型,这里就用到了反射获取泛型真是类型

 1.1 构造函数反射获取泛型真是类型

        

  1.    /** 
  2.  * 构造函数反射泛型对象真实类型 
  3.  */  
  4. public BaseEaoImpl() {  
  5.  ParameterizedType pType = (ParameterizedType) this.getClass().getGenericSuperclass();// 获取当前new的对象的泛型父类  
  6.  this.clazz = (Class<T>)pType.getActualTypeArguments()[0];// 获取类型参数的真是值,就是泛型参数的个数;  
  7.  className=  clazz.getSimpleName();  
  8.  System.out.println(clazz+"\n"+className);  
  9. }  

 

 1.2Save方法

  保存实体

  1. public void save(T t) {  
  2.   
  3. getEntityManager().persist(t);  
  4.   
  5. }  

 

//批量保存实体

 

  1. Publci booleansaveEntitys(List<T) entitys){  
  2.   
  3. //为了提升性能,我们对数据进行分批次的保存,手动控制更新到数据库  
  4.     boolean flag = false;  
  5.         try {  
  6.             // 每100条往数据库里写入一次,相对提升性能,此值可改变  
  7.             int batchSize = 100;  
  8.             int i = 0;  
  9.             for (T entity : entitys) {  
  10.                 getEntityManager().persist(entity);  
  11.                 i++;  
  12.                 if (i % batchSize == 0) {  
  13.                     getEntityManager().flush();  
  14.                     getEntityManager().clear();  
  15.                 }  
  16.             }  
  17.             flag = true;  
  18.             if (logger.isDebugEnabled()) {  
  19.                 logger.debug("Eao批量保存实体成功,"  
  20.                         + getEntityManager().getClass().getName());  
  21.             }  
  22.         } catch (Exception e) {  
  23.             flag = false;  
  24.             logger.error("Eao批量保存实体失败", e);  
  25.         }  
  26.         return flag;  
  27.   
  28. }  

 

 1.3 find方法

find方法,根据id或实体的某个属性查询等,这个时候就需要使用泛型具体类型了

 

  1. //根据主键id查询  
  2.  public T findEntityById(Serializable id){  
  3.    
  4.    return getEntityManager().find(clazz, id);  
  5. }  

当然了还可以传入集合Id

  1. //根据id集合查询实体集合  
  2. public List<T> getByIds(List<String> ids) {  
  3.         return getEntityManager().createQuery(//  
  4.                 "FROM " + className + "WHERE id in (:ids)")//  
  5.                 .setParameter("ids", ids)//  
  6.                 .list();  
  7.     }  

 

1.4 更新merge

//更新实体 ---留意级联更新的效果
  1. public boolean updateEntity(T entity) {  
  2.     boolean flag = false;  
  3.     try {  
  4.         getEntityManager().merge(entity);  
  5.         flag = true;  
  6.     } catch (Exception e) {  
  7.         flag = false;  
  8.         logger.error("Eao更新实体失败", e);  
  9.     }  
  10.     return flag;  
  11. }  

 

1.5 createQuery

createQuery的用法博大精深,以上的任何一个用户几乎都可以用creaQuery替代

 

如: queryByHql

参数hqlhql语句,

Maphql中的参数与值

 

  1. public List queryByHql(final String hql,  
  2.             final Map<Serializable, Serializable> map) {  
  3.         if (null == hql || "".equals(hql)) {  
  4.             return null;  
  5.         }  
  6.         try {  
  7.             Query query = getEntityManager().createQuery(hql);  
  8.             for (Serializable key : map.keySet()) {  
  9.                 query.setParameter((String) key, map.get(key));  
  10.             }  
  11.             List list = query.getResultList();  
  12.             if (logger.isDebugEnabled()) {  
  13.                 logger.debug("Eao根据hql语句查询实体集合成功,"  
  14.                         + getEntityManager().getClass().getName());  
  15.             }  
  16.   
  17.             return list;  
  18.   
  19.         } catch (Exception e) {  
  20.             logger.error("Eao根据hql语句查询实体集合失败", e);  
  21.             return null;  
  22.         }  
  23.     }  

实例:

  1. public List findSmallQuesID(String paperID,String questionTypeId){  
  2.     //参数hql语句  
  3.     String hql = "From PaperSecond where paperID =:paperID AND questionTypeID=:questionTypeId";  
  4.     //参数hal参数与值  
  5.     Map<Serializable, Serializable> map = new HashMap<Serializable, Serializable>();  
  6.     map.put("paperID", paperID);  
  7.     map.put("questionTypeId", questionTypeId);  
  8.     List<PaperDetail> paperSecondList = paperSecondEao.queryByHql(hql, map);  
  9.     return paperSecondList;  
  10. }  

//根据条件更新 

  1. //根据条件更新  
  2. //String variable(要更新的字段), String condition(更新的条件),Object... args  
  3. public boolean updateByCondition(String variable, String condition,  
  4.             Object... args) {  
  5.         boolean flag = false;  
  6.         qltry {  
  7.             Query query = getEntityManager().createQuery(  
  8.                     "update " + clazz.getSimpleName() + " as o set " + variable  
  9.                             + " " + condition);  
  10.             for (int i = 0; i < args.length; i++) {  
  11.                 query.setParameter(i + 1, args[i]);  
  12.             }  
  13.             query.executeUpdate();  
  14.             flag = true;  
  15.             if (logger.isDebugEnabled()) {  
  16.                 logger.debug("Eao根据条件更新实体成功,"  
  17.                         + getEntityManager().getClass().getName());  
  18.             }  
  19.         } catch (Exception e) {  
  20.             flag = false;  
  21.             logger.error("Eao根据条件更新实体失败", e);  
  22.         }  
  23.         return flag;  
  24.     }  

实例:    

 

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

 

总结: 

通过以上几个小的实例我们认识到,几个小小的方法,可以引伸出不少的变化,但是重点还是在于不断的总结,不断的抽象,尤其在于对hql语句上。

分享到:
评论

相关推荐

    JPA (一)

    **Java 持久化 API(JPA)详解(一)** Java 持久化 API(Java Persistence API),简称 JPA,是 Java 平台上的一个标准,用于管理关系数据库中的...在后续的篇章中,我们将更深入地探讨 JPA 的高级特性和最佳实践。

    Pro JPA 2版

    第六章“EntityManager”介绍了EntityManager在JPA2中的核心作用。EntityManager是JPA提供的用于管理实体生命周期和执行查询的主要接口。这一章节将详细探讨如何使用EntityManager进行实体的持久化操作。 3. 查询...

    Pro JPA2 精通JPA2

    1. **实体管理器(EntityManager)**:这是JPA的核心接口,负责所有与实体类相关的操作,如持久化、删除、查找和事务管理。 2. **查询语言(JPQL)**:Java Persistence Query Language,一种类似于SQL的语言,用于...

    基于JPA的CRUD例子

    除了这些基本操作,JPA还提供了更高级的功能,如查询语言JPQL(Java Persistence Query Language),它类似于SQL,但面向对象。例如,我们可以使用JPQL来查找所有年龄大于25岁的人员: ```java String query = ...

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    Spring Data JPA 提供了与数据库交互的高级抽象,使得开发人员可以更高效地工作,而无需编写大量的 boilerplate 代码。 在 Spring Data JPA 1.4.3 版本中,主要包含以下关键知识点: 1. **Repository Abstraction*...

    spring boot整合JPA——demo

    `JPQL`(Java Persistence Query Language)是JPA提供的SQL高级查询语言,可以在Repository接口中定义,用于更复杂的查询需求。 在这个“springboot-jpa”项目中,你可以看到这些概念是如何实际应用的。项目可能...

    Hibernate EntityManager用法

    Hibernate EntityManager在Hibernate Session之上提供了一层抽象,使得开发者可以使用JPA标准的API来操作数据,同时也保留了Hibernate的一些高级特性。 **2. 配置Hibernate EntityManager** 在使用Hibernate ...

    JPA-3 核心API

    JPA的核心API包括四个主要组件:`Persistence`、`EntityManagerFactory`、`EntityManager`和`EntityTransaction`,它们共同构成了JPA的数据访问框架。 **1. `Persistence`** `Persistence`接口是JPA的入口点,它...

    JPA图书管理(连接数据库)

    **Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理和持久化对象到关系数据库。JPA通过提供ORM(对象关系映射)能力,使得开发者可以使用面向...通过实践,可以更好地掌握JPA的高级特性,提升开发效率。

    JPA学习大全.docx

    例如,要保存一个客户到数据库,可以创建一个`Customer`实体类,使用`@Entity`注解标识,然后通过JPA的`EntityManager`接口进行操作,如`persist()`方法用于保存新对象到数据库。 总的来说,Spring Data JPA结合JPA...

    spring struct + jpa

    Spring Data JPA是Spring Framework的一个子项目,它提供了对JPA的高级支持,简化了数据访问层的编写。 1. **Repository接口**:Spring Data JPA允许开发者定义接口,其中的方法会自动转换为JPQL查询。无需编写任何...

    jpa 全面学习资料

    全面讲解可能涵盖JPA的高级特性和最佳实践,如: - **第二级缓存(Second-Level Cache)**: 提高性能,减少数据库访问。 - **多态性(Polymorphism)**: 支持不同类型的实体在同一查询结果中。 - **实体图形(Entity...

    JPA参考学习资料下载(一共包括3本pdf文件)

    第一本,《JPA_Basic.pdf》可能涵盖了JPA的基础知识,包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)、查询语言(JPQL)和 Criteria 查询等核心概念。通过这本指南,读者...

    springboot微服务项目加jpa

    JPA通过Entity、EntityManager和Persistence Context等核心概念,实现了对象的创建、查询和更新等功能。 **3. Spring Data JPA** Spring Data JPA是Spring Framework的一个模块,它简化了JPA的使用。它提供了...

    JPA环境搭建及CRUD

    同时,JPA还支持更高级的查询语言——JPQL(Java Persistence Query Language),它可以让你以面向对象的方式编写查询语句,而不是直接使用SQL。 总之,JPA为Java开发者提供了一种简洁的方式来处理数据库操作,通过...

    JPA底层

    **Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为开发者提供了一种对象关系...这本书可能会涵盖JPA的基础和高级主题,包括最佳实践和常见陷阱,是深入理解JPA的宝贵资源。

    针对MySQL数据库做的JPA的小例子

    **MySQL数据库与JPA简介** MySQL是一款开源、免费的关系型数据库管理系统,广泛应用于Web...实践中,开发者可以根据需求进一步探索JPA的高级特性,如懒加载、级联操作、查询缓存等,以提高应用程序的性能和可维护性。

    springboot整合jpa

    SpringBoot 整合 JPA(Java ...在实际项目中,还可以结合Spring Data JPA的其他高级特性,如 Specifications、JPA Repositories 自定义查询,以及使用Spring Security进行权限控制等,以满足更复杂的业务需求。

    JPA使用手册+API+JAR

    JPA的核心概念包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)以及查询语言(JPQL)。实体是与数据库表相对应的Java类,通过在类上使用`@Entity`注解标识。实体管理器是JPA...

Global site tag (gtag.js) - Google Analytics