公共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的开发环境,并成功 ...
随机推荐
- bzoj 1058: [ZJOI2007]报表统计【set】
我想写FHQtreap的!是set自己跑进代码的!因为太好写了 是有点慢--洛谷上不吸氧会T一个点 就是,用一个set p维护所有点值,ans维护MIN_SORT_GAP的答案,每次insert一个点 ...
- bzoj 1022: [SHOI2008]小约翰的游戏John【anti-nim】
如果全是1,那么n是奇数先手必败 否则,xor和为0先手必败 证明见 https://www.cnblogs.com/Wolfycz/p/8430991.html #include<iostre ...
- Mysql的查询语句(联合查询、连接查询、子查询等)
Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...
- Hibernate Could not obtain transaction-synchronized Session for current thread问题处理
项目通过Hibernate查询时报出如下错误: Hibernate Could not obtain transaction-synchronized Session for current thre ...
- Android APK加壳技术方案
Android APK加壳技术方案[1] Android APK加壳技术方案[2]
- hibernate Day1 案例代码
1.创建Person类 package com.icss.pojo; public class Person { private int uid; private String uname; priv ...
- 数字(number)
数字(number) Time Limit:2000ms Memory Limit:128MB 题目描述 LYK定义了一个新的计算. 具体地,一开始它有两个数字a和b. 每一步,它可以将b增加1, ...
- 所有DOM元素加载之前执行的页面加载事件[jquery]
<script type="text/javascript"> (function() { alert("DOM还没加载"); })(jQuery) ...
- ASP.NET相关事件及JS的执行顺序
实验代码: ASPX: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="We ...
- Maven项目中War包的打包及依赖方式
两个web项目之间的依赖引用方式.Web项目之间,通过war包的方式进行引用的.例如,有两个项目,puzzle-web和puzzle-web-demo,两个均是web项目,puzzle-web-dem ...