package cn.sxx.dao;

import java.util.List;

import cn.sxx.model.Dep;
import cn.sxx.query.DepQuery; public interface BaseDao<T,Q> { public void save(T t); public void update(T t); public T getObj(Integer id); public void delete(Integer id);
public void delete(T t); public List<T> queryObjByCondition(Q q); }

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

package cn.sxx.dao.impl;

import cn.sxx.dao.BaseDao;
import cn.sxx.model.Dep;
import cn.sxx.query.DepQuery; import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public abstract class BaseDaoImpl<T,Q> extends HibernateDaoSupport implements BaseDao<T, Q> { @Override
public void save(T t) {
this.getHibernateTemplate().save(t);
} @Override
public void update(T t) {
this.getHibernateTemplate().update(t);
} @Override
public T getObj(Integer id) {
Class<?> class1 = getGenericClass();
return (T) this.getHibernateTemplate().get(class1, id);
} @Override
public void delete(Integer id) {
T obj = getObj(id);
this.getHibernateTemplate().delete(obj);
} @Override
public List<T> queryObjByCondition(final Q q) {
@SuppressWarnings("unchecked")
List<?> listT = this.getHibernateTemplate().executeFind(new HibernateCallback<List<T>>() {
@Override
public List<T> doInHibernate(Session session) throws HibernateException,SQLException {
String hql = createHql(q);
//创建查询对象
Query query = session.createQuery(hql);
setDynamicParam(query, q);
List<T> list = query.list();
return null;
} });
/*this.getHibernateTemplate().getSessionFactory().getCurrentSession();*/
return (List<T>) listT;
} public Class<?> getGenericClass() {
//获得泛型的父类
Type genericSuperclass = this.getClass().getGenericSuperclass();
//把泛型的父类强制转换成ParameterizedType
ParameterizedType pt = (ParameterizedType) genericSuperclass;
//根据ParameterizedType获得当前类的所有泛型的类型
Type[] actualTypeArguments = pt.getActualTypeArguments();
//获得T的具体类
Class<?> clazz = (Class<?>) actualTypeArguments[0];
return
clazz;
}
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
/**
* 创建Hql
* @param q
* @return
*/
public abstract String createHql(Q q); /**
* 动态设置参数
* @param query
* @param q
*/
public void setDynamicParam(Query query,Q q){ //获得查询对象的列对象
Class<? extends Object> class1 = q.getClass();
//反向解析查询对象,列出查询对象的所有属性
Field[] declaredFields = class1.getDeclaredFields();
Field[] superFields = class1.getSuperclass().getDeclaredFields(); List<Field> list1 = Arrays.asList(declaredFields);
List<Field> list2 = Arrays.asList(superFields);
//创建一个大的集合,存储查询对象的属性对象和它父类的属性对象
List<Field> fList = new ArrayList<Field>();
fList.addAll(list1);
fList.addAll(list2); //遍历集合
for(Field f : fList){
//获得属性的名字
String fieldName = f.getName();
Object val = null;
try {
f.setAccessible(true);
//获得属性的值
val = f.get(q); } catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(val != null){
if(val.getClass() == String.class){
query.setParameter(fieldName, "%"+val+"%");
}else
{
query.setParameter(fieldName, val);
}
} }
}

}

其他的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. 安装并配置JAVA环境

    详见百度经验 http://jingyan.baidu.com/article/0202781175839b1bcc9ce529.html

  2. CodeForces - 504A && CodeForces - 624C && CodeForces - 2B

    Points 1. 关键要看到以度数为1的点作为突破口. 2. 关键是发现两者不同只能是a-c,而剩余的点必须为b 3. 注意0的情况.

  3. NOI前总结:点分治

    点分治: 点分治的题目基本一样,都是路径计数. 其复杂度的保证是依靠 $O(n)$ 找重心的,每一次至少将问题规模减小为原先的$1/2$. 找重心我喜欢$BFS$防止爆栈. int Root(int ...

  4. Codechef QGRID

    QGRID code 给定一个 n × m(1 <= m <= 3) 的点网格,网格的边上以及点上都有权值.初始时所有点的权值都为 0 .维护两种操作:1. x1 y1 x2 y2 c 把 ...

  5. J2ee的SSM和SSH的小结

    1.介绍SSM框架: SSM是指由Spring.SpringMVC.Mybatis三个开源框架整合的开发框架. a).Spring是一个轻量级的容器框架,核心是控制反转(IoC)和面向切面(AOP). ...

  6. Docker容器日志管理最佳实践

    目录 一 .Docker 引擎日志 二.容器日志 2.1.常用查看日志命令--docker logs 2.2 .Docker 日志 驱动 三. 生产环境中该如何储存容器中的日志 一.当是完全是标准输出 ...

  7. TP5之安全机制

    防止sql注入 1.查询条件尽量使用数组方式,具体如下: $wheres = array(); $wheres['account'] = $account; $wheres['password'] = ...

  8. 第十一篇 .NET高级技术之内置泛型委托

    Func.Action 一.如果不是声明为泛型委托 委托的类型名称不能重载,也就是不能名字相同类型参数不同 二..Net中内置两个泛型委托Func.Action(在“对象浏览器”的mscorlib的S ...

  9. mycat启动报错UnknownHostException(Temporary failure in name resolution)解决方法

    重启命令 ./mycat restart 查看日志 cd logs tail -f wrapper.log 报错信息 INFO | jvm 2 | 2018/05/09 11:28:28 | Erro ...

  10. Jquery 中使用String.Format

    第一种方法: String.format = function() { if (arguments.length == 0) return null; var str = arguments[0]; ...