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. 把文件类型转化为byte[]

    转自:https://blog.csdn.net/xinxiqi/article/details/78899159 package com.sanqing.util; import java.io.B ...

  2. 指针 * &

    int main() { ; //定义int变量updates int * p_updates; //定义指针p_updates p_updates=&updates;//将updates的地 ...

  3. A. Hulk

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  4. 腾讯QQ团队开源分布式后台毫秒服务引擎全解析:引擎架构、RPC、灰度……

    腾讯QQ团队将于12月4日开源一个服务开发运营框架,叫做毫秒服务引擎(Mass Service Engine in Cluster,MSEC),它集RPC.名字发现服务.负载均衡.业务监控.灰度发布. ...

  5. java webRoot 路径问题

    项目部署后的目录结构 src 生成到 WEB-INF\classes文件下; WebRoot  为项目的根目录,应用中“/action”就相当于是系统目录中的”WebRoot/action" ...

  6. AtCoder Grand Contest 003 F - Fraction of Fractal

    题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...

  7. 1-6static关键字

    static的作用? static可以修饰变量,被static修饰的变量叫做静态变量,程序运行时静态变量存放在方法区里面,因此,静态变量在类加载阶段赋值,并且只赋值一次.请看例1 static可以修饰 ...

  8. android动画(3)layout动画,layoutChanged动画及算定义它,ListViewActivity的Layout动画(代码和xm配置两种实现l)

    1.layout切换动画 代码: 本示例是fragment切换.在它的oncreateView中 public class LayoutAnimationFrgmt extends Fragment ...

  9. 创建表的规范 nvarchar2,varchar2

    1,这个真没见过什么最佳实践,都是变长的,这些都是研发根据业务需求自己设定啊. 如果需要多语种支持就用NVARCHAR2(或者汉语),如果只是单语种(英语)就varchar2 . 2. Oracle中 ...

  10. 123 Best Time to Buy and Sell Stock III 买卖股票的最佳时机 III

    假设你有一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格.设计一个算法来找到最大的利润.你最多可以完成两笔交易.注意:你不可同时参与多笔交易(你必须在再次购买前出售掉之前的股票).详见: ...