zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    window linux pycharm 相互协作
    再次校验环境
    转 安装 ubuntu后 软件处理 -感谢博主skykingf csdn
    NSError是向用户传递详细错误信息的不错的选择
    Node.js学习笔记-入门
    UIKit和CSS布局方式的差异
    继承缺陷以及替代方案
    HTML、HTML DOM、Javascript、CSS以及jQuery使用小结
    关于cookies
    一个诡异bug---symbol not found: objc_setProperty_atomic
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/11600562.html
Copyright © 2011-2022 走看看