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. bzoj 1058: [ZJOI2007]报表统计【set】

    我想写FHQtreap的!是set自己跑进代码的!因为太好写了 是有点慢--洛谷上不吸氧会T一个点 就是,用一个set p维护所有点值,ans维护MIN_SORT_GAP的答案,每次insert一个点 ...

  2. bzoj 1022: [SHOI2008]小约翰的游戏John【anti-nim】

    如果全是1,那么n是奇数先手必败 否则,xor和为0先手必败 证明见 https://www.cnblogs.com/Wolfycz/p/8430991.html #include<iostre ...

  3. Mysql的查询语句(联合查询、连接查询、子查询等)

    Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...

  4. Hibernate Could not obtain transaction-synchronized Session for current thread问题处理

    项目通过Hibernate查询时报出如下错误: Hibernate Could not obtain transaction-synchronized Session for current thre ...

  5. Android APK加壳技术方案

    Android APK加壳技术方案[1] Android APK加壳技术方案[2]

  6. hibernate Day1 案例代码

    1.创建Person类 package com.icss.pojo; public class Person { private int uid; private String uname; priv ...

  7. 数字(number)

    数字(number) Time Limit:2000ms   Memory Limit:128MB 题目描述 LYK定义了一个新的计算. 具体地,一开始它有两个数字a和b. 每一步,它可以将b增加1, ...

  8. 所有DOM元素加载之前执行的页面加载事件[jquery]

    <script type="text/javascript"> (function() { alert("DOM还没加载"); })(jQuery) ...

  9. ASP.NET相关事件及JS的执行顺序

    实验代码: ASPX: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="We ...

  10. Maven项目中War包的打包及依赖方式

    两个web项目之间的依赖引用方式.Web项目之间,通过war包的方式进行引用的.例如,有两个项目,puzzle-web和puzzle-web-demo,两个均是web项目,puzzle-web-dem ...