公共dao的抽取
- 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的抽取的更多相关文章
- 【java学习】spring mvc 公共dao的实现,定义基本的增删改查
接口类: package com.blog.db.dao; import com.blog.util.Pagination; import java.util.List; public interfa ...
- 11、SpringBoot-CRUD-thymeleaf公共页面元素抽取
thymeleaf公共页面元素抽取 存在一种现象:两个文件的代码只有一部分代码不一样 其余的均相同,此时就可以提取公共的代码去简化开发 .抽取公共片段 <div th:fragment=&quo ...
- Thymeleaf静态资源引入方式及公共页面代码抽取
静态资源引入 Thymeleaf模板引擎url问题,要用如下的方式写,确保在任何情况下都能访问到 <!-- Bootstrap core CSS --> <link href=&qu ...
- Dao层抽取BaseDao公共方法
设计IBseDao接口,定义公共的CRUD方法. // IBaseDao 接口,定义公共的CRUD方法 public interface IBaseDao<T> { public void ...
- thymeleaf公共页面元素抽取
1.抽取公共片段 使用thymeleaf的th:fragment为样抽取的公共片段命名, 如下把div标签命名为 copy,就可以获取到div整个里的内容<div th:fragment=&qu ...
- 公共Service的抽取小例
package cn.sxx.service; import java.util.List; public interface BaseService<T,Q> { public void ...
- 利用反射实现Servlet公共类的抽取
一次请求的执行过程: 请求:发送请求地址-->到达web.xml中,找到地址对应的servlet类-->通过反射调用该类的构造函数,创建该servlet类的对象-->通过当前对象调用 ...
- 14. Spring Boot的 thymleaf公共页抽取
5).CRUD-员工列表实验要求:1).RestfulCRUD:CRUD满足Rest风格:URI: /资源名称/资源标识 HTTP请求方式区分对资源CRUD操作 普通CRUD(uri来区分操作) ...
- 【SSH网上商城项目实战02】基本增删查改、Service和Action的抽取以及使用注解替换xml
转自:https://blog.csdn.net/eson_15/article/details/51297698 上一节我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功 ...
随机推荐
- poj3069【贪心,水】
妈蛋,题意看错-看了挑战时被标记的点还是给出的点,瞎搞了半个多小时... = =都想气的扔进水题系列了 #include <iostream> #include <cstdio> ...
- 基于FBX SDK的FBX模型解析与加载 -(三)
http://blog.csdn.net/bugrunner/article/details/7229416 6. 加载Camera和Light 在FBX模型中除了几何数据外较为常用的信息可能就是Ca ...
- 纯JS阻止浏览器默认滚动事件,实现自定义滚动方法
首先该方法兼容IE7+以上浏览器,可以实现页面上下滚动,而且也可以实现页面左右滚动,每次滚动的距离为屏幕的大小,滚动为加速滚动 javaScript代码如下: //滚动实现方法,使用鼠标滚轮每次滚动浏 ...
- 学习Mahout(一)
Mahout 官方下载地址:http://apache.fayea.com/apache-mirror/mahout/ 环境ubuntu 12.04, hadoop1.2.1 ,mahout 0.9 ...
- 黑客攻防技术宝典web实战篇:Web 应用程序技术习题
猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. OPTIONS 方法有什么作用? OPTIONS 方法要求服务器报告可用于特定资源的 HT ...
- 序列/树上差分小结 By cellur925
首先我们需要注意一下的是,差分比较适用于修改比较多而查询比较少的情况. 一.序列上差分 借教室 这是一道二分答案,在check函数中用到差分技巧的一道题,譬如说我们要把一个序列中[l,r]区间都加上 ...
- jQuery笔记之工具方法extend插件扩展
jQuery工具方法 $.extend()插件扩展(工具方法) $.fn.extend()插件扩展(实例方法) 浅度克隆.深度克隆 两个方法基本是一样的,唯一不同的就是调用方式不一样 -------- ...
- Centos 6.x 搭建 Zabbix Agent 客户端
如需搭建zabbix server端,请参考:Zabbix-Server配置 环境: Zabbix-Server: Centos 6.8 IP:192.168.126.129 #Zabix- ...
- Problem D: 勤奋的涟漪2 dp + 求导
http://www.gdutcode.sinaapp.com/problem.php?cid=1049&pid=3 dp[i][state]表示处理了前i个,然后当前状态是state的时候的 ...
- bootstrap div 固定
div固定在顶部样式: .navbar-fixed-top div固定在底部样式 .navbar-fixed-bottom