JPA的Base的抽取

我们使用我们需要使用泛型的知识

IBaseDao

()我们需要解决的问题是,怎么通过泛型找到是什么类

/*// 获取当前new的对象的泛型的父类类型
ParameterizedType pt=(ParameterizedType)this.getClass().getGenericSuperclass();
// 获取第一个类型参数的真实类型
this.clazz = (Class<T>)pt.getActualTypeArguments()[0];*/

import java.util.List;

public interface IBaseDao<T> {
    public void add(T t);
    public void update(T t);
    public T query(Long id);
    public List<T> queryAll();
    public void del(Long id);
}

BaseDaoImpl

package cn.jiedada.Dao.impl;

import cn.jiedada.Dao.IBaseDao;
import cn.jiedada.domain.Product;
import cn.jiedada.utils.JPAJunit;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.lang.reflect.ParameterizedType;
import java.util.List;

public class BaseDaoImpl<T> implements IBaseDao<T> {
    private Class<T>  clazz=null;

    // 使用反射技术得到T的真实类型
    public  BaseDaoImpl(){
        /*// 获取当前new的对象的泛型的父类类型
        ParameterizedType  pt=(ParameterizedType)this.getClass().getGenericSuperclass();
        // 获取第一个类型参数的真实类型
        this.clazz = (Class<T>)pt.getActualTypeArguments()[0];*/
        this.clazz =  (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
    @Override
    public void add(T t) {
        EntityManager manager= JPAJunit.getEntityManager();
        manager.getTransaction ().begin ();
        manager.persist (t);
        manager.getTransaction ().commit ();
        manager.close ();
    }

    @Override
    public void update(T t) {
        EntityManager manager = JPAJunit.getEntityManager();
        manager.getTransaction().begin();
        manager.merge(t);
        manager.getTransaction().commit();
        manager.close();
    }

    @Override
    public T query(Long id) {
        EntityManager manager = JPAJunit.getEntityManager();
        T t = manager.find(clazz, id);
        manager.close();
        return t;
    }

    @Override
    public List<T> queryAll() {
        EntityManager manager = JPAJunit.getEntityManager();
        manager.getTransaction().begin();
        // 建议用法
        //获得clazz.getSimpleName()的名称
        String jpql = "select product from "+clazz.getSimpleName()+" product";
        // 最标准的用法
        //jpql = "select o from cn.itsource.jpa.crud.Employee o";
        // 简写
        //jpql = "from Employee";
        Query query = manager.createQuery(jpql);
        List<T> list = query.getResultList();
        manager.getTransaction().commit();
        manager.close();
        return list;
    }

    @Override
    public void del(Long id) {
        EntityManager manager = JPAJunit.getEntityManager();
        manager.getTransaction().begin();
        //这里必须同股票这样的方式才能获得持久态的product,
        // 不能从外面传入,因为传入的为临时台的不能做修改
        T t = manager.find(clazz, id);
        manager.remove(t);
        manager.getTransaction().commit();
        manager.close();
    }
}

IProductDao继承IBaseDao

package cn.jiedada.Dao;

import cn.jiedada.domain.Product;

import java.util.List;

public interface IProductDao<T> extends IBaseDao<T>{
}

ProductDaoImpl实现IProductDao

package cn.jiedada.Dao.impl;

import cn.jiedada.Dao.IProductDao;
import cn.jiedada.domain.Product;
import cn.jiedada.utils.JPAJunit;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;

//这里我只能使用这样的方法才能实现
//public class ProductDaoImpl<Product>  extends BaseDaoImpl<Product> implements IProductDao<Product>会报错
public class ProductDaoImpl extends BaseDaoImpl<Product> implements IProductDao<Product> {
}

这里这样就可以了我们可以在不同的地方直接使用这个泛型就能使用我们需要的方法啦

原文地址:https://www.cnblogs.com/xiaoruirui/p/11600562.html

时间: 2024-08-30 17:55:22

JPA的Base的抽取的相关文章

JPA base

1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一个对象持久化规范,各JavaEE应用服务器自主选择具体实现,JPA的设计者是Hibernate框架的作者,因此Hibernate作为Jboss服务器中JPA的默认实现,Oracle的Weblogic使用EclipseLink(以前叫TopLink)作为默认的JPA实现,IBM的Websphere和S

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(四)基于Shiro验证用户权限,且给用户授权

最新项目比较忙,写文章的精力就相对减少了,但看到邮箱里的几个催更,还是厚颜把剩下的文档补上. 一.修改ShiroDbRealm类,实现它的doGetAuthorizationInfo方法 package org.shiro.demo.service.realm; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.apache.commons.lang.St

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(三)给Shiro登录验证加上验证码

序: 给Shiro加入验证码,有多种方式,当然你也可以通过继承修改FormAuthenticationFilter类,通过Shiro去验证验证码.具体实现请百度: 应用Shiro到Web Application(验证码实现) 而今天我要说的,既然使用的SpringMVC,为什么不直接在Controller中就处理验证码验证,让事情变的更简单一点呢? 一.新建ValidateCode.java验证码工具类 package org.shiro.demo.util; import java.util.

Spring Data JPA

转自: http://www.cnblogs.com/WangJinYang/p/4257383.html Spring 框架对 JPA 的支持 Spring 框架对 JPA 提供的支持主要体现在如下几个方面: 首先,它使得 JPA 配置变得更加灵活.JPA 规范要求,配置文件必须命名为 persistence.xml,并存在于类路径下的 META-INF 目录中.该文件通常包含了初始化 JPA 引擎所需的全部信息.Spring 提供的 LocalContainerEntityManagerFa

开源通用爬虫框架YayCrawler-页面的抽取规则定义

本节我将向大家介绍一下YayCrawler的核心-页面的抽取规则定义,这也是YayCrawler能够做到通用的主要原因之一.如果我要爬去不同的网站的数据,尽管他们的网站采用的开发技术不同.页面的结构不同,但是我只要针对不同的网站定义不同的抽取规则即可,不用再对每个网站专门开发一个爬虫. 首先让我来解释几个概念: 一.页面(Page) 这里说的页面不是指在浏览器上能直接看到的页面,而是指一个http请求发送后服务端返回的response中的内容.它大多数情况是一个html文档,也可能是一个Json

了解 Spring Data JPA

前言 自 JPA 伴随 Java EE 5 发布以来,受到了各大厂商及开源社区的追捧,各种商用的和开源的 JPA 框架如雨后春笋般出现,为开发者提供了丰富的选择.它一改之前 EJB 2.x 中实体 Bean 笨重且难以使用的形象,充分吸收了在开源社区已经相对成熟的 ORM 思想.另外,它并不依赖于 EJB 容器,可以作为一个独立的持久层技术而存在.目前比较成熟的 JPA 框架主要包括 Jboss 的 Hibernate EntityManager.Oracle 捐献给 Eclipse 社区的 E

JPA学习笔记

一.JPA基础1.1 JPA基础JPA: java persistence api 支持XML.JDK5.0注解俩种元数据的形式,是SUN公司引入的JPA ORM规范 元数据:对象和表之间的映射关系 实体: entity,需要使用Javax.persistence.Entity注解或xml映射,需要无参构造函数,类和相关字段不能使用final关键字 游离状态实体以值方式进行传递,需要serializable JPA是一套规范.有很多框架支持(如Hibernate3.2以上.Toplink,一般用

使用 Spring Data JPA 简化 JPA 开发

从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例:接着重构该示例,并引入 Spring 框架,这两部分不会涉及过多的篇幅,如果希望能够深入学习 Spring 和 JPA,可以根据本文最后提供的参考资料进一步学习. 自 JPA 伴随 Java EE 5 发布以来,受到了各大厂商及开源社区的追捧,各种商用的和开源的 JPA 框架如雨后春笋般出现,为

JPA &amp;&amp; Spring Data JPA

1.JPA  Java Persistence API,用于对象持久化的一组API,JPA本身是一组规范,让开发者用同一种方式访问不同的ORM框架.其实也就是java实体对象和关系型数据库建立起映射关系,通过面向对象编程的思想操作关系型数据库的规范.因此各种ORM框架都会提供满足JPA要求的实现.在Spring项目中,ORM框架最常使用的就是Hibernate,Hibernate EntityManager就是JPA的一种provider. 2.Spring Data 尽管我们可以通过JPA规范