`
feigme
  • 浏览: 156435 次
  • 性别: Icon_minigender_1
  • 来自: 球面世界
社区版块
存档分类
最新评论

[转]一个泛型Hibernate DAO实现

    博客分类:
  • Java
阅读更多
java 代码
  1. package sgf4web.dao;   
  2.   
  3. import java.io.Serializable;   
  4. import java.util.*;   
  5. import java.util.regex.Matcher;   
  6. import java.util.regex.Pattern;   
  7.   
  8. import org.hibernate.*;   
  9. import org.hibernate.criterion.*;   
  10. import org.springframework.orm.hibernate3.HibernateCallback;   
  11. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
  12.   
  13. import sgf4web.dao.support.PaginationSupport;   
  14. import sgf4web.util.GenericsUtils;   
  15.   
  16. /** *//**  
  17.  * 泛型Hibernate DAO类  
  18.  *   
  19.  * @author DigitalSonic  
  20.  */  
  21. @SuppressWarnings("unchecked")   
  22. public class HibernateGenericDao<T, ID extends Serializable> extends HibernateDaoSupport ...{   
  23.     private Class<T> pojoClass;   
  24.        
  25.     /** *//**  
  26.      * 初始化DAO,获取POJO类型  
  27.      */  
  28.     public HibernateGenericDao() ...{   
  29. //        this.pojoClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];   
  30.         this.pojoClass = GenericsUtils.getSuperClassGenricType(getClass());   
  31.     }   
  32.        
  33.     /** *//**  
  34.      * 获得该DAO对应的POJO类型  
  35.      */  
  36.     public Class<T> getPojoClass() ...{   
  37.         return this.pojoClass;   
  38.     }   
  39.        
  40.     /** *//**  
  41.      * 获得该DAO对应的POJO类型名  
  42.      */  
  43.     public String getPojoClassName() ...{   
  44.         return getPojoClass().getName();   
  45.     }   
  46.   
  47.     //加载对象   
  48.        
  49.     /** *//**  
  50.      * 加载所有的对象  
  51.      */  
  52.     public List<T> loadAll() ...{   
  53.         return (List<T>)getHibernateTemplate().loadAll(getPojoClass());   
  54.     }   
  55.        
  56.     /** *//**  
  57.      * 根据hql查询  
  58.      *  
  59.      * @param values 可变参数  
  60.      */  
  61.     public List find(String hql, Object... values) ...{   
  62.         return getHibernateTemplate().find(hql, values);   
  63.     }   
  64.   
  65.     /** *//**  
  66.      * 根据条件加载对象  
  67.      *   
  68.      * @param criteria Criteria实例  
  69.      */  
  70.     public List<T> findByCriteria(final Criteria criteria) ...{   
  71.         List list = criteria.list();    
  72.         return transformResults(list);   
  73.     }   
  74.        
  75.     /** *//**  
  76.      * 根据条件加载对象  
  77.      * @param detachedCriteria DetachedCriteria实例  
  78.      */  
  79.     public List<T> findByCriteria(final DetachedCriteria detachedCriteria) ...{   
  80.         return (List<T>) getHibernateTemplate().execute(new HibernateCallback() ...{   
  81.                public Object doInHibernate(Session session) throws HibernateException ...{   
  82.                    Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
  83.                    List list = criteria.list();    
  84.                    return transformResults(list);    
  85.                }   
  86.            }, true);   
  87.     }   
  88.        
  89.     /** *//**  
  90.      * 根据给定的实例查找对象  
  91.      */  
  92.     public List<T> findByExample(T instance) ...{   
  93.         List<T> results = (List<T>)getHibernateTemplate().findByExample(instance);   
  94.         return results;   
  95.     }       
  96.        
  97.     /** *//**  
  98.      * 根据ID查找对象  
  99.      */  
  100.     public T findById(ID id) ...{   
  101.         return (T) getHibernateTemplate().get(getPojoClassName(), id);   
  102.     }   
  103.        
  104.     /** *//**  
  105.      * 根据某个具体属性进行查找  
  106.      */  
  107.     public List<T> findByProperty(String propertyName, Object value) ...{   
  108.        String queryString = "from " + getPojoClassName() + " as model where model."    
  109.                                + propertyName + "= ?";   
  110.        return (List<T>)getHibernateTemplate().find(queryString, value);   
  111.     }   
  112.        
  113.     //新建、修改、删除   
  114.        
  115.     /** *//**  
  116.      * 新建对象实例化  
  117.      */  
  118.     public ID save(T transientInstance) ...{   
  119.         return (ID)getHibernateTemplate().save(transientInstance);   
  120.     }   
  121.        
  122.     /** *//**  
  123.      * 更新已存在的对象  
  124.      */  
  125.     public void update(T transientInstance) ...{   
  126.         getHibernateTemplate().update(transientInstance);   
  127.     }   
  128.        
  129.     /** *//**  
  130.      * 删除指定ID的对象  
  131.      */  
  132.     public void delete(ID id) ...{   
  133.            T instance = findById(id);   
  134.            if (instance != null)   
  135.                getHibernateTemplate().delete(instance);   
  136.     }   
  137.        
  138.     /** *//**  
  139.      * 删除指定对象  
  140.      */  
  141.     public void delete(T persistentInstance) ...{   
  142.         getHibernateTemplate().delete(persistentInstance);   
  143.     }       
  144.        
  145.     //分页   
  146.     /** *//**  
  147.      * 根据Criteria加载分页,指定页大小和起始位置  
  148.      */  
  149.     public PaginationSupport findPageByCriteria(final Criteria criteria, final int pageSize, final int startIndex) ...{      
  150.         int totalCount = getCountByCriteria(criteria);      
  151.         criteria.setProjection(null);   
  152.         List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
  153.         items = transformResults(items);   
  154.         PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex);   
  155.         return ps;   
  156.     }   
  157.        
  158.     /** *//**  
  159.      * 根据Criteria加载分页,默认页大小,从第0条开始  
  160.      */  
  161.     public PaginationSupport findPageByCriteria(final Criteria criteria) ...{      
  162.         return findPageByCriteria(criteria, PaginationSupport.PAGESIZE, 0);      
  163.     }      
  164.     
  165.     /** *//**  
  166.      * 根据Criteria加载分页,默认页大小,从第startIndex条开始  
  167.      */  
  168.     public PaginationSupport findPageByCriteria(final Criteria criteria, final int startIndex) ...{      
  169.         return findPageByCriteria(criteria, PaginationSupport.PAGESIZE, startIndex);      
  170.     }   
  171.        
  172.     /** *//**  
  173.      * 根据Criteria统计总数  
  174.      */  
  175.     public int getCountByCriteria(final Criteria criteria) ...{      
  176.         Integer count = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();       
  177.         return count.intValue();      
  178.     }   
  179.        
  180.     /** *//**  
  181.      * 根据DetachedCriteria加载分页,指定页大小和起始位置  
  182.      */  
  183.     public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int pageSize, final int startIndex) ...{      
  184.         return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() ...{      
  185.             public Object doInHibernate(Session session) throws HibernateException ...{      
  186.                 Criteria criteria = detachedCriteria.getExecutableCriteria(session);   
  187.                 int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();      
  188.                 criteria.setProjection(null);   
  189.                 List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();   
  190.                 items = transformResults(items);   
  191.                 PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex);      
  192.                 return ps;      
  193.             }   
  194.         }, true);      
  195.     }   
  196.        
  197.     /** *//**  
  198.      * 根据DetachedCriteria加载分页,默认页大小,从第0条开始  
  199.      */  
  200.     public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria) ...{      
  201.         return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, 0);      
  202.     }      
  203.      
  204.     /** *//**  
  205.      * 根据DetachedCriteria加载分页,默认页大小,从第startIndex条开始  
  206.      */  
  207.     public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int startIndex) ...{      
  208.         return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, startIndex);      
  209.     }    
  210.        
  211.     /** *//**  
  212.      * 根据DetachedCriteria统计总数  
  213.      */  
  214.     public int getCountByCriteria(final DetachedCriteria detachedCriteria) ...{      
  215.         Integer count = (Integer) getHibernateTemplate().execute(new HibernateCallback() ...{      
  216.             public Object doInHibernate(Session session) throws HibernateException ...{      
  217.                 Criteria criteria = detachedCriteria.getExecutableCriteria(session);      
  218.                 return criteria.setProjection(Projections.rowCount()).uniqueResult();      
  219.             }      
  220.         }, true);      
  221.         return count.intValue();      
  222.     }    
  223.        
  224.     /** *//**  
  225.      * 根据hql加载分页,指定页大小和起始位置  
  226.      */  
  227.     public PaginationSupport findPageByQuery(final String hql, final int pageSize, final int startIndex, Object...values) ...{   
  228.         int totalCount = getCountByQuery(hql, values);   
  229.            
  230.         if (totalCount < 1)   
  231.             return new PaginationSupport(new ArrayList(0), 0);   
  232.   
  233.         Query query = createQuery(hql, values);   
  234.         List items = query.setFirstResult(startIndex).setMaxResults(pageSize).list();   
  235.         PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex);   
  236.         return ps;   
  237.     }   
  238.        
  239.     /** *//**  
  240.      * 根据hql加载分页,默认页大小,从第0条开始  
  241.      */  
  242.     public PaginationSupport findPageByQuery(final String hql, Object...values) ...{      
  243.         return findPageByQuery(hql, PaginationSupport.PAGESIZE, 0, values);      
  244.     }      
  245.     
  246.     /** *//**  
  247.      * 根据hql加载分页,默认页大小,从第startIndex条开始  
  248.      */  
  249.     public PaginationSupport findPageByQuery(final String hql, final int startIndex, Object...values) ...{      
  250.         return findPageByQuery(hql, PaginationSupport.PAGESIZE, startIndex, values);     
  251.     }   
  252.        
  253.     /** *//**  
  254.      * 根据hql统计总数  
  255.      */  
  256.     public int getCountByQuery(final String hql, Object...values) ...{      
  257.         String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));   
  258.         List countlist = getHibernateTemplate().find(countQueryString, values);   
  259.         return (Integer) countlist.get(0);   
  260.     }   
  261.        
  262.     //创建Criteria和Query   
  263.        
  264.     /** *//**  
  265.      * 创建Criteria对象  
  266.      *  
  267.      * @param criterions 可变的Restrictions条件列表  
  268.      */  
  269.     public Criteria createCriteria(Criterion...criterions) ...{   
  270.         Criteria criteria = getSession().createCriteria(getPojoClass());   
  271.         for (Criterion c : criterions)   
  272.             criteria.add(c);   
  273.         return criteria;   
  274.     }   
  275.   
  276.     /** *//**  
  277.      * 创建Criteria对象,带排序字段与升降序字段  
  278.      */  
  279.     public Criteria createCriteria(String orderBy, boolean isAsc, Criterion...criterions) ...{   
  280.         Criteria criteria = createCriteria(criterions);   
  281.         if (isAsc)   
  282.             criteria.addOrder(Order.asc(orderBy));   
  283.         else  
  284.             criteria.addOrder(Order.desc(orderBy));   
  285.         return criteria;   
  286.     }   
  287.        
  288.     /** *//**  
  289.      * 方法取自SpringSide.  
  290.      * 创建Query对象. 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置.  
  291.      * 留意可以连续设置,如下:  
  292.      * <pre>  
  293.      * dao.getQuery(hql).setMaxResult(100).setCacheable(true).list();  
  294.      * </pre>  
  295.      * 调用方式如下:  
  296.      * <pre>  
  297.      *        dao.createQuery(hql)  
  298.      *        dao.createQuery(hql,arg0);  
  299.      *        dao.createQuery(hql,arg0,arg1);  
  300.      *        dao.createQuery(hql,new Object[arg0,arg1,arg2])  
  301.      * </pre>  
  302.      *  
  303.      * @param values 可变参数.  
  304.      */  
  305.     public Query createQuery(String hql, Object... values) ...{   
  306.         Query query = getSession().createQuery(hql);   
  307.         for (int i = 0; i < values.length; i++) ...{   
  308.             query.setParameter(i, values[i]);   
  309.         }   
  310.         return query;   
  311.     }   
  312.        
  313.     /** *//**  
  314.      * 方法取自SpringSide.  
  315.      * 去除hql的select子句,未考虑union的情况  
  316.      */  
  317.     private static String removeSelect(String hql) ...{   
  318.         int beginPos = hql.toLowerCase().indexOf("from");   
  319.         return hql.substring(beginPos);   
  320.     }   
  321.   
  322.     /** *//**  
  323.      * 方法取自SpringSide.  
  324.      * 去除hql的orderby子句  
  325.      */  
  326.     private static String removeOrders(String hql) ...{   
  327.         Pattern p = Pattern.compile("order\s*by[\w|\W|\s|\S]*", Pattern.CASE_INSENSITIVE);   
  328.         Matcher m = p.matcher(hql);   
  329.         StringBuffer sb = new StringBuffer();   
  330.         while (m.find()) ...{   
  331.             m.appendReplacement(sb, "");   
  332.         }   
  333.         m.appendTail(sb);   
  334.         return sb.toString();   
  335.     }   
  336.        
  337.     /** *//**  
  338.      * 将联合查询的结果内容从Map或者Object[]转换为实体类型,如果没有转换必要则直接返回  
  339.      */  
  340.     private List transformResults(List items) ...{   
  341.         if (items.size() > 0) ...{   
  342.             if (items.get(0instanceof Map) ...{   
  343.                 ArrayList list = new ArrayList(items.size());   
  344.                 for (int i = 0; i < items.size(); i++) ...{   
  345.                     Map map = (Map)items.get(i);   
  346.                     list.add(map.get(CriteriaSpecification.ROOT_ALIAS));   
  347.                 }   
  348.                 return list;   
  349.             } else if (items.get(0instanceof Object[]) ...{   
  350.                 ArrayList list = new ArrayList(items.size());   
  351.                 int pos = 0;   
  352.                 for (int i = 0; i < ((Object[])items.get(0)).length; i++) ...{   
  353.                     if (((Object[])items.get(0))[i].getClass() == getPojoClass()) ...{   
  354.                         pos = i;   
  355.                         break;   
  356.                     }   
  357.                 }   
  358.                 for (int i = 0; i < items.size(); i++) ...{   
  359.                     list.add(((Object[])items.get(i))[pos]);   
  360.                 }   
  361.                 return list;   
  362.             } else  
  363.                 return items;   
  364.         } else  
  365.             return items;   
  366.     }   
  367. }  
java 代码
  1. package sgf4web.util;   
  2.   
  3. import java.lang.reflect.ParameterizedType;   
  4. import java.lang.reflect.Type;   
  5.   
  6. /** *//**  
  7.  * 泛型参数辅助类  
  8.  *   
  9.  * @author DigitalSonic  
  10.  */  
  11. @SuppressWarnings("unchecked")   
  12. public class GenericsUtils ...{   
  13.     /** *//**  
  14.      * 通过反射,获得定义Class时声明的父类的第一个范型参数的类型。  
  15.      */  
  16.     public static Class getSuperClassGenricType(Class clazz) ...{   
  17.         return getSuperClassGenricType(clazz, 0);   
  18.     }   
  19.        
  20.     /** *//**  
  21.      * 通过反射,获得定义Class时声明的父类的范型参数的类型。  
  22.      * 如没有找到符合要求的范型参数,则递归向上直到Object。  
  23.      *  
  24.      * @param clazz 要进行查询的类  
  25.      * @param index 如有多个范型声明该索引从0开始  
  26.      * @return 在index位置的范型参数的类型,如果无法判断则返回<code>Object.class</code>  
  27.      */  
  28.     public static Class getSuperClassGenricType(Class clazz, int index) ...{   
  29.         boolean flag = true;   
  30.         Type genType = clazz.getGenericSuperclass();   
  31.         Type[] params = null;   
  32.            
  33.         if (!(genType instanceof ParameterizedType))   
  34.             flag = 
分享到:
评论
1 楼 yuechengkun 2009-01-12  
很不错,值得学习

相关推荐

    kernel-devel-4.18.0-553.45.1.el8-10.x86-64.rpm

    Rocky Linux 8.10内核包

    Simulink中三阶单环多位量化Σ-Δ调制器的设计与实现-音频带ADC的应用(复现论文或解答问题,含详细可运行代码及解释)

    内容概要:本文档详细介绍了如何在Simulink中设计一个满足特定规格的音频带ADC(模数转换器)。首先选择了三阶单环多位量化Σ-Δ调制器作为设计方案,因为这种结构能在音频带宽内提供高噪声整形效果,并且多位量化可以降低量化噪声。接着,文档展示了具体的Simulink建模步骤,包括创建模型、添加各个组件如积分器、量化器、DAC反馈以及连接它们。此外,还进行了参数设计与计算,特别是过采样率和信噪比的估算,并引入了动态元件匹配技术来减少DAC的非线性误差。性能验证部分则通过理想和非理想的仿真实验评估了系统的稳定性和各项指标,最终证明所设计的ADC能够达到预期的技术标准。 适用人群:电子工程专业学生、从事数据转换器研究或开发的技术人员。 使用场景及目标:适用于希望深入了解Σ-Δ调制器的工作原理及其在音频带ADC应用中的具体实现方法的人群。目标是掌握如何利用MATLAB/Simulink工具进行复杂电路的设计与仿真。 其他说明:文中提供了详细的Matlab代码片段用于指导读者完成整个设计流程,同时附带了一些辅助函数帮助分析仿真结果。

    计算机课后习题.docx### 【计算机科学】研究生入学考试计算机组成原理专项题库设计:考研复习资源集成与优化

    内容概要:该题库专为研究生入学考试计算机组成原理科目设计,涵盖名校考研真题、经典教材课后习题、章节题库和模拟试题四大核心模块。名校考研真题精选多所知名高校的计算机组成原理科目及计算机联考真题,并提供详尽解析,帮助考生把握考研命题趋势与难度。经典教材课后习题包括白中英《计算机组成原理》(第5版)和唐朔飞《计算机组成原理》(第2版)的全部课后习题解答,这两部教材被众多名校列为考研指定参考书目。章节题库精选代表性考题,注重基础知识与重难点内容,帮助考生全面掌握考试大纲要求的知识点。模拟试题依据历年考研真题命题规律和热门考点,精心编制两套全真模拟试题,并附标准答案,帮助考生检验学习成果,评估应试能力。 适用人群:计划参加研究生入学考试并报考计算机组成原理科目的考生,尤其是需要系统复习和强化训练的学生。 使用场景及目标:①通过研读名校考研真题,考生可以准确把握考研命题趋势与难度,有效评估复习成效;②通过经典教材课后习题的练习,考生可以巩固基础知识,掌握解题技巧;③通过章节题库的系统练习,考生可以全面掌握考试大纲要求的各个知识点,为备考打下坚实基础;④通过模拟试题的测试,考生可以检验学习成果,评估应试能力,为正式考试做好充分准备。 其他说明:该题库不仅提供详细的题目解析,还涵盖了计算机组成原理的各个方面,包括计算机系统概述、数据表示与运算、存储器分层、指令系统、中央处理器、总线系统和输入输出系统等。考生在使用过程中应结合理论学习与实践操作,注重理解与应用,以提高应试能力和专业知识水平。

    __UNI__DB9970A__20250328141034.apk.1

    __UNI__DB9970A__20250328141034.apk.1

    minio-rsc-Rust资源

    rust for minio

    4-4-台区智能融合终端功能模块型式规范(试行).pdf

    国网台区终端最新规范

    《基于YOLOv8的化工管道焊缝缺陷检测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    python源码-1个机器学习相关资源

    一个简单的机器学习代码示例,使用的是经典的鸢尾花(Iris)数据集,通过 Scikit-learn 库实现了一个简单的分类模型。这个代码可以帮助你入门机器学习中的分类任务。

    pyqt离线包,pyqt-tools离线包

    pyqt离线包,pyqt-tools离线包

    《基于YOLOv8的船舶机舱灭火系统状态监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    SQL常用日期和时间函数整理及使用示例

    SQL常用日期和时间函数整理及在sqlserver测试示例 主要包括 1.查询当前日期GETDATE 2.日期时间加减函数DATEADD 3 返回两个日期中指定的日期部分之间的差值DATEDIFF 4.日期格式转换CONVERT(VARCHAR(10),GETDATE(),120) 5.返回指定日期的年份数值 6.返回指定日期的月份数值 7.返回指定日期的天数数值

    GSDML-V2.3-Turck-BL20-E-GW-EN-20160524-010300.xml

    GSDML-V2.3-Turck-BL20_E_GW_EN-20160524-010300.xml

    T_CPCIF 0225-2022 多聚甲醛.docx

    T_CPCIF 0225-2022 多聚甲醛.docx

    《基于YOLOv8的智能仓储货物堆码倾斜预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    《基于YOLOv8的智能仓储货物堆码倾斜预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计

    蚕豆脱壳机设计.zip

    蚕豆脱壳机设计.zip

    附件2-2:台区智能融合终端入网专业检测单位授权委托书.docx

    台区终端电科院送检文档

    Y6一39一No23.6D离心通风机 CAD().zip

    Y6一39一No23.6D离心通风机 CAD().zip

    django自建博客app

    django自建博客app

    附件3-4:台区智能融合终端全性能试验增值税发票开具确认单.docx

    台区终端电科院送检文档

    非开挖水平定向钻机动力头装置设计.zip

    非开挖水平定向钻机动力头装置设计.zip

Global site tag (gtag.js) - Google Analytics