JPA SPRING 泛型DAO

package com.core.support.springSupportDao;

import java.io.Serializable;
import java.util.List;

/**
* 此泛型DAO来自easyjweb
* 泛型DAO接口
*/
public interface GenericDAO<T> {

/**
* 根据Id查找一个类型为T的对象。
*
* @param id
* 传入的ID的值
* @return 一个类型为T的对象
*/
T get(Serializable id);

/**
* 持久化一个对象,该对象类型为T。
*
* @param newInstance
* 需要持久化的对象,使用JPA标注。
*/
<T>T save(T newInstance);

/**
* 根据对象id删除一个对象,该对象类型为T
*
* @param id
* 需要删除的对象的id。
*/
void delete(Serializable id);

/**
* 更新一个对象,主要用于更新一个在persistenceContext之外的一个对象。
*
* @param transientObject
* 需要更新的对象,该对象不需要在persistenceContext中。
*/
void update(T transientObject);

/**
* 根据对象的一个属性名和该属性名对应的值来查找一个对象。
*
* @param propertyName
* 属性名
* @param value
* 属性名对应的值
* @return 一个对象,如果在该属性名和值的条件下找到多个对象,则抛出一个IllegalStateException异常
*/
T getBy(String propertyName, Object value);

/**
* 根据一个查询条件及其参数,还有开始查找的位置和查找的个数来查找任意类型的对象。
*
* @param queryName
* 命名查询的名字
* @param params
* 查询条件中的参数的值。使用Object数组,要求顺序和查询条件中的参数位置一致。
* @param begin
* 开始查询的位置
* @param max
* 需要查询的对象的个数
* @return 一个任意对象的List对象,如果没有查到任何数据,返回一个空的List对象。
*/
List executeNamedQuery(final String queryName, final Object[] params,
final int begin, final int max);

/**
* 根据一个查询条件及其参数,还有开始查找的位置和查找的个数来查找类型为T的对象。
*
* @param query
* 查询的条件,使用位置参数,对象名统一为obj,查询条件从where后开始。比如:obj.name =
* ?1 and obj.properties = ?2
* @param params
* 查询条件中的参数的值。使用Object数组,要求顺序和查询条件中的参数位置一致。
* @param begin
* 开始查询的位置
* @param max
* 需要查询的对象的个数
* @return 一个该类型对象的List对象,如果没有查到任何数据,返回一个空的List对象。
*/
List<T> find(String query, Object[] params, int begin, int max);

/**
* 根据一个查询条件及其参数,还有开始查找的位置和查找的个数来查找任意类型的对象。
*
* @param query
* 完整的查询语句,使用位置参数。比如:select user from User
* user where user.name = ?1 and
* user.properties = ?2
* @param params
* 查询条件中的参数的值。使用Object数组,要求顺序和查询条件中的参数位置一致。
* @param begin
* 开始查询的位置
* @param max
* 需要查询的对象的个数
* @return 一个任意对象的List对象,如果没有查到任何数据,返回一个空的List对象。
*/
List query(String query, Object[] params, int begin, int max);

/**
* 根据jpql语句执行批量数据更新等操作
*
* @param jpql
* 需要执行jpql语句
* @param params
* 语句中附带的参数
* @return
*/
int batchUpdate(String jpql, Object[] params);

/**
* 执行SQL语句查询
*
* @param nnq
* @return
*/
public List executeNativeNamedQuery(String nnq);

List executeNativeQuery(final String nnq, final Object[] params,
final int begin, final int max);

/**
* 执行SQL语句
*
* @param nnq
* @return
*/
public int executeNativeSQL(final String nnq);



/**
* flush()
*/
public void flush();

}



package com.core.support.springSupportDao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.persistence.Query;

import org.springframework.orm.jpa.JpaCallback;
import org.springframework.orm.jpa.support.JpaDaoSupport;


import com.core.openstarbbsexception.JPAMothodParameterException;
import com.core.support.springSupportDao.GenericDAO;


public class GenericDAOImpl<T> extends JpaDaoSupport implements GenericDAO<T> {

private Class<T> clazz;

public GenericDAOImpl(Class<T> clazz) {
this.clazz = clazz;
}

/*
* public void setClazz(Class<T> clazz) { this.clazz = clazz; } public
* Class<T> getClazz() { return clazz; }
*/
public T get(Serializable id) {
if (id == null)
return null;
return this.getJpaTemplate().find(clazz,id);
}

public List<T> find(final String queryStr, final Object[] params,
final int begin, final int max) {
// TODO Auto-generated method stub
List<T> ret = (List<T>) this.getJpaTemplate().execute(
new JpaCallback() {

public Object doInJpa(EntityManager em)
throws PersistenceException {
// TODO Auto-generated method stub
String clazzName = clazz.getName();
StringBuffer sb = new StringBuffer("select obj from ");
sb.append(clazzName).append(" obj").append(" where ")
.append(queryStr);
Query query = em.createQuery(sb.toString());
int parameterIndex = 1;
if (params != null && params.length > 0) {
for (Object obj : params) {
query.setParameter(parameterIndex++, obj);
}
}
if (begin >= 0 && max > 0) {
query.setFirstResult(begin);
query.setMaxResults(max);
}
if (begin >= 0 && max > 0) {
query.setFirstResult(begin);
query.setMaxResults(max);
}
return query.getResultList();
}
});
if (ret != null && ret.size() >= 0) {
return ret;
} else {
return new ArrayList<T>();
}
}

public List query(final String queryStr, final Object[] params,
final int begin, final int max) {
// TODO Auto-generated method stub
List ret = (List) this.getJpaTemplate().execute(new JpaCallback() {

public Object doInJpa(EntityManager em) throws PersistenceException {
// TODO Auto-generated method stub
Query query = em.createQuery(queryStr);
int parameterIndex = 1;
if (params != null && params.length > 0) {
for (Object obj : params) {
query.setParameter(parameterIndex++, obj);
}
}
if (begin >= 0 && max > 0) {
query.setFirstResult(begin);
query.setMaxResults(max);
}
/*
* if (begin >= 0 && max > 0) { query.setFirstResult(begin);
* query.setMaxResults(max); }
*/
return query.getResultList();
}
});
if (ret != null && ret.size() >= 0) {
return ret;
} else {
return new ArrayList();
}
}

public void delete(Serializable id){
if (id == null)
try {
throw new JPAMothodParameterException();
} catch (JPAMothodParameterException e1) {
e1.printStackTrace();
}
T object = this.get(id);
if (object != null) {
try {
this.getJpaTemplate().remove(object);
} catch (Exception e) {
e.printStackTrace();
}
}
}

public <T> T save(T instance) {
// TODO Auto-generated method stub
this.getJpaTemplate().persist(instance);
return instance;
}

public T getBy(final String propertyName, final Object value) {
if (propertyName == null || "".equals(propertyName) || value == null)
try {
throw new JPAMothodParameterException();
} catch (JPAMothodParameterException e) {
e.printStackTrace();
}

// TODO Auto-generated method stub
List<T> ret = (List<T>) this.getJpaTemplate().execute(
new JpaCallback() {

public Object doInJpa(EntityManager em)
throws PersistenceException {
// TODO Auto-generated method stub
String clazzName = clazz.getName();
StringBuffer sb = new StringBuffer("select obj from ");
sb.append(clazzName).append(" obj");
Query query = null;
if (propertyName != null && value != null) {
sb.append(" where obj.").append(propertyName)
.append(" = :value");
query = em.createQuery(sb.toString()).setParameter(
"value", value);
} else {
query = em.createQuery(sb.toString());
}
return query.getResultList();
}
});
if (ret != null && ret.size() == 1) {
return ret.get(0);
} else if (ret != null && ret.size() > 1) {
throw new java.lang.IllegalStateException(
"worning --more than one object find!!");
} else {
return null;
}
}

public List executeNamedQuery(final String queryName,
final Object[] params, final int begin, final int max) {
List ret = (List) this.getJpaTemplate().execute(new JpaCallback() {

public Object doInJpa(EntityManager em) throws PersistenceException {
Query query = em.createNamedQuery(queryName);
int parameterIndex = 1;
if (params != null && params.length > 0) {
for (Object obj : params) {
query.setParameter(parameterIndex++, obj);
}
}
if (begin >= 0 && max > 0) {
query.setFirstResult(begin);
query.setMaxResults(max);
}
return query.getResultList();
}
});
if (ret != null && ret.size() >= 0) {
return ret;
} else {
return new ArrayList();
}
}

public void update(T instance) {
// TODO Auto-generated method stub
this.getJpaTemplate().merge(instance);
}

public void setClazzType(Class clazz) {
this.clazz = clazz;
}

public Class getClassType() {
return this.clazz;
}

public List executeNativeNamedQuery(final String nnq) {
Object ret = this.getJpaTemplate().execute(new JpaCallback() {

public Object doInJpa(EntityManager em) throws PersistenceException {
Query query = em.createNativeQuery(nnq);
return query.getResultList();
}
});
return (List) ret;
}

public List executeNativeQuery(final String nnq, final Object[] params,
final int begin, final int max) {
List ret = (List) this.getJpaTemplate().execute(new JpaCallback() {

public Object doInJpa(EntityManager em) throws PersistenceException {
Query query = em.createNativeQuery(nnq);
int parameterIndex = 1;
if (params != null && params.length > 0) {
for (Object obj : params) {
query.setParameter(parameterIndex++, obj);
}
}
if (begin >= 0 && max > 0) {
query.setFirstResult(begin);
query.setMaxResults(max);
}
return query.getResultList();
}
});
if (ret != null && ret.size() >= 0) {
return ret;
} else {
return new ArrayList();
}
}

public int executeNativeSQL(final String nnq) {
Object ret = this.getJpaTemplate().execute(new JpaCallback() {

public Object doInJpa(EntityManager em) throws PersistenceException {
Query query = em.createNativeQuery(nnq);
return query.executeUpdate();
}
});
return (Integer) ret;
}

public int batchUpdate(final String jpql, final Object[] params) {
Object ret = this.getJpaTemplate().execute(new JpaCallback() {

public Object doInJpa(EntityManager em) throws PersistenceException {
Query query = em.createQuery(jpql);
int parameterIndex = 1;
if (params != null && params.length > 0) {
for (Object obj : params) {
query.setParameter(parameterIndex++, obj);
}
}
return query.executeUpdate();
}
});
return (Integer) ret;
}


public void flush() {
this.getJpaTemplate().execute(new JpaCallback() {
public Object doInJpa(EntityManager em) throws PersistenceException {
em.getTransaction().commit();
return null;
}
});
}
}



package com.core.openstarbbsexception;

/**
* OpenStarBBS自定义异常。
* @author treblesoftware
*
*/
public class JPAMothodParameterException extends Exception {

public JPAMothodParameterException(){
super("JPA ORM SUPPORT EXCEPTION:com.core.support.dao.GenericDAOImpl 方法参数为NULL。错误"?);
}
}
封装JPA的数据操作公共DAO基类 通过将公共通用操作写进父类简化代码,提高代码的复用。 面向接口 使用继承 泛型 引入JPA API查询 以及 元数据 提高代码的安全性. 立即下载

相关推荐

银河麒麟v10离线安装docker二进制包

因为工作需要在银河麒麟v10系统上离线部署k8s集群,k8s部署的前提是具有docker环境,因此离线安装docker成为必然。 1.下载docker包:Index of linux/static/stable/x86_64/ 选择自己合适的版本,我下载的是20.10.7 选择自己放置docker包的路径进行解压: cd /home/huawei/zq tar -zxvf docker-20.10.7.tgz 2. 给docker包解压出来的docker文件夹下的二进制文件赋..

q_hsolucky的博客 7684

封装JPA的数据操作DAO类

对JPA的实体操作进行了简单的封装,降低了数据操作的难度,提高了开发的效率。里面可能会有少许hibernate的元素。 DAO.java /************************* 版权声明 ********************************* * * 版权所有:百洋软件 * Copyright (c) 2009 by Pearl Ocean. * *

menghuannvxia的专栏 6062

从‘最速控制’到代码:深入拆解韩京清ADRC中TD跟踪器的fhan函数(含Matlab/Simulink实例)

本文深入解析韩京清ADRC中的fhan函数,从理论到代码实现,详细拆解其在Matlab/Simulink中的应用。通过分析最速控制问题和非线性TD的连续形式,揭示fhan函数在信号处理和噪声抑制中的独特优势,并提供工程实践中的参数整定和优化技巧。

weixin_42659194的博客 247

JPA 泛型DAO 封装(源码来自EasyJWeb)

对于在Web容器中使用EntityManager对象,这里需要做一些改进,才能更安全。Servlet是非线程安全的,所以需要改变获得EntityManager对象的方式,这里使用ThreadLocal类。 ThreadLocal就是为每一个使用某变量的线程都提供一个该变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该...

NationSoftware的专栏 314

油气井管柱力学发展

油气井管柱力学发展 1 石油管柱力学问题的发复杂性 1)油气管柱动力学的非线性 钻井中钻柱在重力、钻压、扭矩、钻井液浮力和井壁约束等作用下,产生三维变形。一方面随井眼轴线的弯曲而弯曲,这一变形被称为管柱的初位移;另一方面,管柱在运动过程中相对井眼轴线也有变形,这种变形被称为计算位移。管柱大变形主要表现在初位移部分,计算位移相对很小。大曲率井眼中管柱产生大挠度,但管柱很长且柔软性较好,变形一般仍保持...

weixin_43831995的博客 950

SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验

阿里开源语音大模型:语音识别效果和性能强于 Whisper,还能检测掌声、笑声、咳嗽等

u010522887的专栏 4万+

JPA调用存储过程

要调用存储过程,我们可以通过EntityManager对象的createNativeQuery()方法执行SQL 语句(注意:这里说的是SQL语句,不是HPQL), 调用存储过程的SQL格式如下:{call 存储过程名称(参数1, 参数2, … )}在EJB3 中你可以调用的存储过程有两种1.无返回值的存储过程。2.返回值为ResultSet(以select 形式返回的值)的存储过程(注意:EJB

hanyaya2008的专栏 797

数仓建模—数据语义层

如今,企业产生大量数据,需要以正确的方式进行分析才能做出重要决策。数据可能来自多个来源并采用不同的格式,这使得清楚地了解其含义和重要性成为一项挑战。这就是语义层的用武之地。语义层存在于数据仓库和最终用户使用的应用程序之间。它为用户提供了简化且一致的数据视图,无论其基础数据源的复杂性如何。该逻辑层有助于映射物理数据结构以创建概念数据模型。它定义了数据元素之间的所有规则和关系,并以业务术语提供了数据的通用词汇表。然后,用户可以轻松地与数据进行交互,而无需了解其数据源的技术知识。

7万+

Spring Data JPA批量插入过慢及其优化 —— 泛型提炼公用batchSave方法、引入多线程

之前只针对一个实例进行插入保存,现在我们需要的是公用的batchSave方法——当然是使用泛型啦; 在原有的基础上进行稍加改造: 1、新增批量导入接口BatchSaveRepository package com.easemob.oa.persistence.jpa; import org.springframework.data.repository.NoRepositoryBean; import java.util.List; @NoRepositoryBean public interf

Lazyafei's Blog 5645

第二章:创建交互式地图

那么您应该已经有了一个安装了这些包的 conda 环境。否则,您需要创建一个新的 conda 环境并使用以下命令安装。

韩天放 4217

2篇1章1节:数据的基本概念以及 R 中的数据结构、向量与矩阵的创建及运算

本文详细介绍了R语言中常见的数据结构的向量和矩阵。通过掌握这些数据结构的基本概念和操作技巧,可以更高效地处理和分析数据。

MD Code 1243

JPA的泛型DAO设计及使用

使用如Hibernate或者JPA作为持久化的解决方案时,设计一个泛型的DAO抽象父类可以方便各个实体的通用CRUD操作。由于此时大部分实体DAO的CRUD操作基本一样,采用泛型设计解决这个问题,带来了简洁代码的好处。 问题的关键在于我们需要在代码中获取抽象DAO父类(BaseEntityDAOImpl<T>)中的泛型信息。 由于Java的泛型是基于泛型擦除实现的,因...

banglaiqi4707的博客 821

Windows系统下载安装 Git 的详细教程

本文详细介绍了Windows系统下载安装Git的完整流程,包括从Git官方网站和阿里镜像下载安装包,逐步讲解安装向导中的各个设置选项,如安装路径、默认编辑器、行尾转换、终端模拟器等,并提供了每个步骤的截图和说明。安装完成后,博客还介绍了如何验证安装是否成功,以及如何配置Git的用户名和邮箱,确保可以正常使用Git进行版本控制。

加斯顿工程师的博客 801

spring+jpa+简单泛型dao

spring+jpa的整合 数据库文件 [code="sql"] /* Navicat MySQL Data Transfer Source Server : mysql Source Server Version : 50165 Source Host : localhost:3306 Source Database ...

ab342173024的博客 797

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

传智播客--进销存之项目架构,DAO层和Service层的泛型抽取和实现

今天开始学习进销存项目了.有了之前的基础,对这个项目很有信心.可是老师一上来对项目的介绍和行业热门技术的介绍,让我的信心一下就没了.本来感觉自己已经不错了,可是这才知道要学的还真是不少.这给项目里我们有要接触很多新鲜的热门技术.他们和之前的技术都是一样的共同点,就是相当的实用.在公司中大量的使用,而且很先进.比如我们总在招聘启示上看到的模板技术什么的.打起精神,好好学习吧.1)进销

图画hadoop 2679

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java泛型dao,泛型DAO模式在JavaWeb开发中的应用_孟晨.pdf

泛型DAO模式在JavaWeb开发中的应用_孟晨29 1 Vol. 29 No. 1第 卷第 期 计算机应用与软件20 12 1 Computer ...

weixin_35756637的博客 206

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

struts2+jpa+spring 泛型版小结

  struts 2+jpa+spring 的,如果用上范型的话,还是能省不少事的哦.把以前的小结之. 首先搞个DAO的基础接口import java.io.Serializable;import java.util.List;import javax.persistence.Query;public interface IBaseDAO { public

jackyrongvip的专栏 1041

IRIS OUT工具测试指南:从环境准备到生产部署全流程

命令行工具测试是软件开发和系统运维中的基础技能,涉及环境配置、功能验证和性能优化等多个环节。其核心原理是通过系统化的测试流程,确保工具在不同环境下的稳定性和可靠性。从技术价值角度看,规范的测试方法能够显著降低生产环境风险,提高工具的使用效率。在实际应用场景中,测试流程通常包括环境准备、单任务验证、批量测试和边界条件检查等步骤。以IRIS OUT工具为例,测试人员需要重点关注基础依赖检查、文件权限设置和资源监控等关键点,通过设计合理的测试用例来验证工具的数据处理能力和错误处理机制。这种系统化的测试方法不仅适用

weixin_34320724的博客 374

dao泛型及优化

dao泛型优化使用 1.加依赖     org.springframework.data     spring-data-jpa     1.10.2.RELEASE 2.配置bean.xml,@:entityManagerFactory的配置 xml version="1.0" encoding="UTF-8"?> xmlns="http://www.sprin

G_honey的博客 579

利用泛型、反射、JPA、Spring技术实现增删改查通用类

1、定义接口 package cn.joeho.base; import java.io.Serializable; public interface DAO {  public String getSubClass();  public Class getEntityClass();  public void save(T entity);  public void update(

joeho的专栏 3877

5月26开源沙龙活动小记

  2007年6月26日,EasyJF的第一次开源沙龙技术交流活动成功举办,以“JPA+Spring2.0+EasyJWeb技术构架在企业级系统中的应用”为主题,探讨企业级应用系统开发中,最前沿的一些技术组合及应用技巧。在本次沙龙活动中,大峡主讲了JPA+Spring2+EasyJWeb在企业级应用中的使用情况,并通过一些实际的项目示例展示了这些技术组合的精妙之处。天意、血狠、菠萝蜜等都在讨论及交

软件开发资料汇总 280
上一篇: EJB3.0 注解列表
下一篇: EJB 3 初次学习小结
NationSoftware
博客等级 码龄18年 2粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值