我们使用我们需要使用泛型的知识
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> { }
这里这样就可以了我们可以在不同的地方直接使用这个泛型就能使用我们需要的方法啦