1. package cn.sxx.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import cn.sxx.model.Dep;
  6. import cn.sxx.query.DepQuery;
  7.  
  8. public interface BaseDao<T,Q> {
  9.  
  10. public void save(T t);
  11.  
  12. public void update(T t);
  13.  
  14. public T getObj(Integer id);
  15.  
  16. public void delete(Integer id);
  17. public void delete(T t);
  18.  
  19. public List<T> queryObjByCondition(Q q);
  20.  
  21. }

抽取公共Dao的原因是避免代码的重复。其实现类:

  1. package cn.sxx.dao.impl;
  2.  
  3. import cn.sxx.dao.BaseDao;
  4. import cn.sxx.model.Dep;
  5. import cn.sxx.query.DepQuery;
  6.  
  7. import java.lang.reflect.Field;
  8. import java.lang.reflect.ParameterizedType;
  9. import java.lang.reflect.Type;
  10. import java.sql.SQLException;
  11. import java.util.ArrayList;
  12. import java.util.Arrays;
  13. import java.util.List;
  14.  
  15. import org.hibernate.HibernateException;
  16. import org.hibernate.Query;
  17. import org.hibernate.Session;
  18. import org.springframework.orm.hibernate3.HibernateCallback;
  19. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  20.  
  21. public abstract class BaseDaoImpl<T,Q> extends HibernateDaoSupport implements BaseDao<T, Q> {
  22.  
  23. @Override
  24. public void save(T t) {
  25. this.getHibernateTemplate().save(t);
  26. }
  27.  
  28. @Override
  29. public void update(T t) {
  30. this.getHibernateTemplate().update(t);
  31. }
  32.  
  33. @Override
  34. public T getObj(Integer id) {
  35. Class<?> class1 = getGenericClass();
  36. return (T) this.getHibernateTemplate().get(class1, id);
  37. }
  38.  
  39. @Override
  40. public void delete(Integer id) {
  41. T obj = getObj(id);
  42. this.getHibernateTemplate().delete(obj);
  43. }
  44.  
  45. @Override
  46. public List<T> queryObjByCondition(final Q q) {
  47. @SuppressWarnings("unchecked")
  48. List<?> listT = this.getHibernateTemplate().executeFind(new HibernateCallback<List<T>>() {
  49. @Override
  50. public List<T> doInHibernate(Session session) throws HibernateException,SQLException {
  51. String hql = createHql(q);
  52. //创建查询对象
  53. Query query = session.createQuery(hql);
  54. setDynamicParam(query, q);
  55. List<T> list = query.list();
  56. return null;
  57. }
  58.  
  59. });
  60. /*this.getHibernateTemplate().getSessionFactory().getCurrentSession();*/
  61. return (List<T>) listT;
  62. }
  63.  
  64. public Class<?> getGenericClass() {
  65. //获得泛型的父类
  66. Type genericSuperclass = this.getClass().getGenericSuperclass();
  67. //把泛型的父类强制转换成ParameterizedType
  68. ParameterizedType pt = (ParameterizedType) genericSuperclass;
  69. //根据ParameterizedType获得当前类的所有泛型的类型
  70. Type[] actualTypeArguments = pt.getActualTypeArguments();
  71. //获得T的具体类
  72. Class<?> clazz = (Class<?>) actualTypeArguments[0];
  73. return clazz;
  74. }
  75.  
  76. @Override
  77. public void delete(T t) {
  78. this.getHibernateTemplate().delete(t);
  79. }
  80. /**
  81. * 创建Hql
  82. * @param q
  83. * @return
  84. */
  85. public abstract String createHql(Q q);
  86.  
  87. /**
  88. * 动态设置参数
  89. * @param query
  90. * @param q
  91. */
  92. public void setDynamicParam(Query query,Q q){
  93. //获得查询对象的列对象
  94. Class<? extends Object> class1 = q.getClass();
  95. //反向解析查询对象,列出查询对象的所有属性
  96. Field[] declaredFields = class1.getDeclaredFields();
  97. Field[] superFields = class1.getSuperclass().getDeclaredFields();
  98. List<Field> list1 = Arrays.asList(declaredFields);
  99. List<Field> list2 = Arrays.asList(superFields);
  100. //创建一个大的集合,存储查询对象的属性对象和它父类的属性对象
  101. List<Field> fList = new ArrayList<Field>();
  102. fList.addAll(list1);
  103. fList.addAll(list2);
  104. //遍历集合
  105. for(Field f : fList){
  106. //获得属性的名字
  107. String fieldName = f.getName();
  108. Object val = null;
  109. try {
  110. f.setAccessible(true);
  111. //获得属性的值
  112. val = f.get(q);
  113. } catch (IllegalArgumentException | IllegalAccessException e) {
  114. // TODO Auto-generated catch block
  115. e.printStackTrace();
  116. }
  117. if(val != null){
  118. if(val.getClass() == String.class){
  119. query.setParameter(fieldName, "%"+val+"%");
  120. }else{
  121. query.setParameter(fieldName, val);
  122. }
  123. }
  124. }
  125. }
  126. }

其他的Dao的接口只需要继承抽取的公共Dao接口;其他的Dao实现类继承公共Dao接口的实现类即可。

公共dao的抽取的更多相关文章

  1. 【java学习】spring mvc 公共dao的实现,定义基本的增删改查

    接口类: package com.blog.db.dao; import com.blog.util.Pagination; import java.util.List; public interfa ...

  2. 11、SpringBoot-CRUD-thymeleaf公共页面元素抽取

    thymeleaf公共页面元素抽取 存在一种现象:两个文件的代码只有一部分代码不一样 其余的均相同,此时就可以提取公共的代码去简化开发 .抽取公共片段 <div th:fragment=&quo ...

  3. Thymeleaf静态资源引入方式及公共页面代码抽取

    静态资源引入 Thymeleaf模板引擎url问题,要用如下的方式写,确保在任何情况下都能访问到 <!-- Bootstrap core CSS --> <link href=&qu ...

  4. Dao层抽取BaseDao公共方法

    设计IBseDao接口,定义公共的CRUD方法. // IBaseDao 接口,定义公共的CRUD方法 public interface IBaseDao<T> { public void ...

  5. thymeleaf公共页面元素抽取

    1.抽取公共片段 使用thymeleaf的th:fragment为样抽取的公共片段命名, 如下把div标签命名为 copy,就可以获取到div整个里的内容<div th:fragment=&qu ...

  6. 公共Service的抽取小例

    package cn.sxx.service; import java.util.List; public interface BaseService<T,Q> { public void ...

  7. 利用反射实现Servlet公共类的抽取

    一次请求的执行过程: 请求:发送请求地址-->到达web.xml中,找到地址对应的servlet类-->通过反射调用该类的构造函数,创建该servlet类的对象-->通过当前对象调用 ...

  8. 14. Spring Boot的 thymleaf公共页抽取

    5).CRUD-员工列表实验要求:1).RestfulCRUD:CRUD满足Rest风格:URI: /资源名称/资源标识 HTTP请求方式区分对资源CRUD操作   普通CRUD(uri来区分操作) ...

  9. 【SSH网上商城项目实战02】基本增删查改、Service和Action的抽取以及使用注解替换xml

    转自:https://blog.csdn.net/eson_15/article/details/51297698 上一节我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功 ...

随机推荐

  1. poj3069【贪心,水】

    妈蛋,题意看错-看了挑战时被标记的点还是给出的点,瞎搞了半个多小时... = =都想气的扔进水题系列了 #include <iostream> #include <cstdio> ...

  2. 基于FBX SDK的FBX模型解析与加载 -(三)

    http://blog.csdn.net/bugrunner/article/details/7229416 6. 加载Camera和Light 在FBX模型中除了几何数据外较为常用的信息可能就是Ca ...

  3. 纯JS阻止浏览器默认滚动事件,实现自定义滚动方法

    首先该方法兼容IE7+以上浏览器,可以实现页面上下滚动,而且也可以实现页面左右滚动,每次滚动的距离为屏幕的大小,滚动为加速滚动 javaScript代码如下: //滚动实现方法,使用鼠标滚轮每次滚动浏 ...

  4. 学习Mahout(一)

    Mahout 官方下载地址:http://apache.fayea.com/apache-mirror/mahout/ 环境ubuntu 12.04, hadoop1.2.1 ,mahout 0.9 ...

  5. 黑客攻防技术宝典web实战篇:Web 应用程序技术习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. OPTIONS 方法有什么作用? OPTIONS 方法要求服务器报告可用于特定资源的 HT ...

  6. 序列/树上差分小结 By cellur925

    首先我们需要注意一下的是,差分比较适用于修改比较多而查询比较少的情况. 一.序列上差分 借教室  这是一道二分答案,在check函数中用到差分技巧的一道题,譬如说我们要把一个序列中[l,r]区间都加上 ...

  7. jQuery笔记之工具方法extend插件扩展

    jQuery工具方法 $.extend()插件扩展(工具方法) $.fn.extend()插件扩展(实例方法) 浅度克隆.深度克隆 两个方法基本是一样的,唯一不同的就是调用方式不一样 -------- ...

  8. Centos 6.x 搭建 Zabbix Agent 客户端

    如需搭建zabbix server端,请参考:Zabbix-Server配置 环境: Zabbix-Server: Centos 6.8   IP:192.168.126.129    #Zabix- ...

  9. Problem D: 勤奋的涟漪2 dp + 求导

    http://www.gdutcode.sinaapp.com/problem.php?cid=1049&pid=3 dp[i][state]表示处理了前i个,然后当前状态是state的时候的 ...

  10. bootstrap div 固定

    div固定在顶部样式: .navbar-fixed-top div固定在底部样式 .navbar-fixed-bottom