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);
}
View Code

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();
    }
}
View Code

IProductDao继承IBaseDao

package cn.jiedada.Dao;

import cn.jiedada.domain.Product;

import java.util.List;

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

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> {
}
View Code

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

猜你喜欢

转载自www.cnblogs.com/xiaoruirui/p/11600562.html
JPA