热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

fleaframedb使用之JPA封装介绍

flea,frame,db,使用,之
JPA封装介绍

参考

flea-frame-db使用之封装JPA操作数据库 源代码

依赖

mysql-connector-java-5.1.25.jar

  mysql mysql-connector-java 5.1.25 

eclipselink-2.5.0.jar

  org.eclipse.persistence eclipselink 2.5.0 

内容讲解

目前支持 JPA + MySQL模式,需要各位本地自行装下MySQL数据库。

1. Flea JPA查询对象

该类用于实现JPA 标准化方式的数据库查询操作,可以自行组装查询条件。相关代码详细可至该路径查看 FleaJPAQuery,下面对一些关键点进行讲解,且听我细细道来 (这一版并发环境下 可能存在问题,后面我会专门写一篇博文讲解 Flea JPA查询对象的问题,其中引入了对象池的概念 )。

  • 获取FleaJPAQuery实例,并初始化内部成员变量

     private static volatile FleaJPAQuery query; private EntityManager entityManager; // JPA中用于增删改查的持久化接口 private Class sourceClazz; // 实体类类对象 private Class resultClazz; // 操作结果类类对象 private Root root; // 根SQL表达式对象 private CriteriaBuilder criteriaBuilder; //标准化生成器 private CriteriaQuery criteriaQuery; // 标准化查询对象 private List predicates; // Where条件集合 private List orders; // 排序集合 private List groups; // 分组集合 private FleaJPAQuery() { } /** * 

    获取Flea JPA查询对象

    * (单例模式,本身没有问题,但是由于获取之后Flea JPA查询对象还要使用, * 这在有点并发的环境下就存在问题了;后面我会单独写一篇博文讲解基于对象池 * 的多例模式,既保证并发下各个线程获取的Flea JPA查询对象之间互不影响, * 同时也能保证尽可能少的新建Flea JPA查询对象) * * @return Flea JPA查询对象 * @since 1.0.0 */ public static FleaJPAQuery getQuery() { if (ObjectUtils.isEmpty(query)) { synchronized (FleaJPAQuery.class) { if (ObjectUtils.isEmpty(query)) { query = new FleaJPAQuery(); } } } return query; } /** *

    getQuery()之后,一定要调用该方法进行初始化

    * * @param entityManager JPA中用于增删改查的持久化接口 * @param sourceClazz 实体类类对象 * @param resultClazz 操作结果类类对象 * @since 1.0.0 */ public void init(EntityManager entityManager, Class sourceClazz, Class resultClazz) { this.entityManager = entityManager; this.sourceClazz = sourceClazz; this.resultClazz = resultClazz; // 从持久化接口中获取标准化生成器 criteriaBuilder = entityManager.getCriteriaBuilder(); // 通过标准化生成器 获取 标准化查询对象 if (ObjectUtils.isEmpty(resultClazz)) { // 行记录查询结果 criteriaQuery = criteriaBuilder.createQuery(sourceClazz); } else { // 单个查询结果 criteriaQuery = criteriaBuilder.createQuery(resultClazz); } // 通过标准化查询对象,获取根SQL表达式对象 root = criteriaQuery.from(sourceClazz); predicates = new ArrayList(); }
  • 拼接查询条件,添加排序和分组

     // 等于条件 (单个属性列) public void equal(String attrName, Object value) throws DaoException; // 等于条件 (多个属性列) public void equal(Map paramMap) throws DaoException; // 不等于条件 (单个属性列) public void notEqual(String attrName, Object value) throws DaoException; // 等于条件 (多个属性列) public void notEqual(Map paramMap) throws DaoException; // is null 条件,某属性值为空 public void isNull(String attrName) throws DaoException; // is not null 条件,某属性值为非空 public void isNotNull(String attrName) throws DaoException; // in 条件, attrName属性的值在value集合中 public void in(String attrName, Collection value) throws DaoException; // not in 条件,attrName属性的值不在value集合中 public void notIn(String attrName, Collection value) throws DaoException; // like 条件, 模糊匹配 public void like(String attrName, String value) throws DaoException; // 小于等于条件 public void le(String attrName, Number value) throws DaoException; // 小于条件 public void lt(String attrName, Number value) throws DaoException; // 大于等于条件 public void ge(String attrName, Number value) throws DaoException; // 大于条件 public void gt(String attrName, Number value) throws DaoException; // between and 条件, 时间区间查询 public void between(String attrName, Date startTime, Date endTime) throws DaoException; // 大于某个日期值条件 public void greaterThan(String attrName, Date value) throws DaoException; // 大于等于某个日期值条件 public void greaterThanOrEqualTo(String attrName, Date value) throws DaoException; // 小于某个日期值条件 public void lessThan(String attrName, Date value) throws DaoException; // 小于等于某个日期值条件 public void lessThanOrEqualTo(String attrName, Date value) throws DaoException; // 统计数目,在getSingleResult调用之前使用 public void count(); // 统计数目(带distinct参数),在getSingleResult调用之前使用 public void countDistinct(); // 设置查询某属性的最大值,在getSingleResult调用之前使用 public void max(String attrName) throws DaoException; // 设置查询某属性的最小值,在getSingleResult调用之前使用 public void min(String attrName) throws DaoException; // 设置查询某属性的平均值,在getSingleResult调用之前使用 public void avg(String attrName) throws DaoException; // 设置查询某属性的值的总和,在getSingleResult调用之前使用 public void sum(String attrName) throws DaoException; // 设置查询某属性的值的总和(Long),在getSingleResult调用之前使用 public void sumAsLong(String attrName) throws DaoException; // 设置查询某属性的值的总和(Double),在getSingleResult调用之前使用 public void sumAsDouble(String attrName) throws DaoException; // 去重某一列 public void distinct(String attrName) throws DaoException; // 添加order by子句 public void addOrderby(String attrName, String orderBy) throws DaoException; // 添加group by子句 public void addGroupBy(String attrName) throws DaoException;
  • 获取查询结果(记录行 或 单个结果)
    // 获取查询的记录行结果集合 public List getResultList() throws DaoException; // 获取查询的记录行结果集合(设置查询范围) public List getResultList(int start, int max) throws DaoException; // 获取查询的单个属性列结果集合 // 需要先调用 distinct,否则默认返回行记录结果集合 public List getSingleResultList() throws DaoException; // 获取查询的单个属性列结果集合(设置查询范围,可用于分页) // 需要先调用 distinct,否则默认返回行记录结果集合 public List getSingleResultList(int start, int max) throws DaoException; // 获取查询的单个结果 // 需要提前调用 (count, countDistinct, max, min, avg, sum, sumAsLong, sumAsDouble) public Object getSingleResult() throws DaoException;

    2. 数据处理的基本接口

    基本的数据操作接口,其中包含了查询,(批量)添加,(批量)更新,删除等操作,详细可至GitHub查看 IFleaJPABaseDataHandler。

    3. 抽象Flea JPA DAO层接口

/** * 

抽象Flea JPA DAO层接口,实现基本的查询、(批量)添加、(批量)更新、删除接口

* * @author huazie * @version 1.0.0 * @since 1.0.0 */ public interface IAbstractFleaJPADAO extends IFleaJPABaseDataHandler { }

4. 抽象Flea JPA DAO层实现

本类中实现上述3中查询、(批量)添加、(批量)更新、删除的接口的具体逻辑,详细可至GitHub查看 AbstractFleaJPADAOImpl。

  • 该类实现上述抽象Flea JPA DAO层接口,同样有类型T,由子类指定其操作的实体类。
    public abstract class AbstractFleaJPADAOImpl implements IAbstractFleaJPADAO 
  • 无参构造方法,用于获取子类指定的实体类类对象。

    /** * 

    获取T类型的Class对象

    * * @since 1.0.0 */ public AbstractFleaJPADAOImpl() { // 获取泛型类的子类对象的Class对象 Class clz = getClass(); // 获取子类对象的泛型父类类型(也就是AbstractDaoImpl) ParameterizedType type = (ParameterizedType) clz.getGenericSuperclass(); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Type={}", type); } Type[] types = type.getActualTypeArguments(); clazz = (Class) types[0]; if (LOGGER.isDebugEnabled()) { LOGGER.debug("ClassName={}", clazz.getName()); } }
  • 实现接口方法,可参见上述类源码
  • 持久化接口获取,由子类实现(可参考下面的持久化单元DAO层实现)

    /** * 

    获取EntityManager对象

    * * @return EntityManager对象 * @since 1.0.0 */ protected abstract EntityManager getEntityManager();
  • Flea JPA查询对象获取

    /** * 

    获取指定的查询对象

    *

    上一个版本如下调用,基于对象池的多例模式之后,获取Flea JPA查询对象有不同,可参考源码

    * * @return 自定义Flea JPA查询对象 * @since 1.0.0 */ protected FleaJPAQuery getQuery(Class result) { // 获取Flea JPA查询对象实例 FleaJPAQuery query = FleaJPAQuery.getQuery(); // 获取实例后必须调用该方法进行初始化 query.init(getEntityManager(), clazz, result); return query; }

    5. 定义抽象Flea JPA SV层接口

/** * 

抽象Flea JPA SV层接口

* * @author huazie * @version 1.0.0 * @since 1.0.0 */ public interface IAbstractFleaJPASV extends IFleaJPABaseDataHandler { }

6. 抽象Flea JPA SV层实现

该类实现上述抽象Flea JPA SV层接口,相关代码也比较简单,具体接口实现内部调用抽象Flea JPA DAO层实现,详细可至GitHub查看 AbstractFleaJPASVImpl,如下举例:

 @Override public T query(long entityId) throws Exception { return getDAO().query(entityId); } // ... 其他接口实现已省略 /** * 

获取Flea JPA DAO层实现

* * @return 抽象Flea JPA DAO层实现 * @since 1.0.0 */ protected abstract IAbstractFleaJPADAO getDAO();

7. 持久化单元DAO层实现

该类与持久化单元一一对应,如果新增一个持久化配置,即需要新增一个持久化单元DAO层实现,同时Spring配置中,需要加入对应的持久化单元事物管理者配置。详细可至GitHub查看 FleaAuthDAOImpl

  • 持久化单元名 ----- fleaauth
  • 持久化事物管理者 ----- fleaauthTransactionManager
  • 持久化接口对象 ----- entityManager (该类由注解定义,由Spring配置中的 持久化接口工厂 fleaAuthEntityManagerFactory 初始化,详细可见下面持久化单元相关配置)
/** * 

FleaAuth数据源DAO层父类

* * @author huazie * @version 1.0.0 * @since 1.0.0 */ public class FleaAuthDAOImpl extends AbstractFleaJPADAOImpl { @PersistenceContext(unitName="fleaauth") protected EntityManager entityManager; @Override @Transactional("fleaAuthTransactionManager") public boolean remove(long entityId) throws Exception { return super.remove(entityId); } // 其余代码省略。。。 @Override protected EntityManager getEntityManager() { return entityManager; } }

8. 配置介绍

  • 持久化单元配置 fleaauth-persistence.xml

        org.eclipse.persistence.jpa.PersistenceProvider  具体实体类全名 true        
  • Spring配置

          classpath:META-INF/fleaauth-persistence.xml                                  

    至此,相关JPA使用已封装完毕,下一篇博文将介绍 JPA接入,敬请期待。


推荐阅读
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 5分钟快速筛选特定候选人的简历
    介绍一个新的系列,专注于提供能在5分钟内完成的简单实用案例。本文将以办公中常见的需求为例,展示如何快速从大量简历中筛选出特定候选人的简历。 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
author-avatar
荣媛厉4
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有