基于hibernate的BaseDao及其实现类的设计

转载 2016年05月31日 09:06:05
以前做设计的时候dao接口和它的实现了,这样子就不必写这么多的重复代码了。但由于对反射没有了解,除非依赖hibernate的其他组件,否则写不出来。不过,有了反射,我们可以通过泛型来实现我们想要做的功能了。

         首先是接口:

package com.sms.dao.base;

import java.util.List;

public interface BaseDao<T> {
	
	public void add(T entity) throws Exception;

	public void delete(T entity) throws Exception;

	public void update(T entity) throws Exception;

	public T findById(Integer id) throws Exception;
	/*
	 * 得到从startIndex开始大小为pageSize的列表
	 */
	public List<T> getPageList(int startIndex , int pageSize) throws Exception;	
	/*
	 * 得到总数
	 */
	public long getAmount();
}

然后是实现类:

package com.sms.dao.base.impl;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.sms.dao.base.BaseDao;


public class BaseDaoImpl<T> implements BaseDao<T> {

	private Class<T> entityClass;
	private String hql;
	@Resource
	private SessionFactory sessionFactory;
	
	
	public Session getSession(){
		return sessionFactory.getCurrentSession();
	}
	
	
	@SuppressWarnings("unchecked")
	public BaseDaoImpl() {
		//通过反射获取泛型传过来的类的类对象
		this.entityClass = (Class<T>) ((ParameterizedType) this.getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
		this.hql = "from " + this.entityClass.getName();
	}
	
	@Override
	public void add(Object entity) {
		this.getSession().save(entity);
	}

	@Override
	public void delete(Object entity) {
		this.getSession().delete(entity);
	}

	@Override
	public void update(Object entity) {
		this.getSession().update(entity);
	}
	
	@Override
	public T findById(Integer id) {
		@SuppressWarnings("unchecked")
		T result = (T) this.getSession().get(entityClass,id);
		return result;
	}


	@Override
	public List<T> getPageList(int startIndex, int pageSize) {
		// TODO Auto-generated method stub
		@SuppressWarnings("unchecked")
		List<T> list = this.getSession().createQuery(hql).setFirstResult(startIndex).setMaxResults(pageSize).list();
		System.out.println(hql);
		return list;
	}


	@Override
	public long getAmount() {
		String sql = "select count(*) from "+ this.entityClass.getName();
		long count =  (Long) this.getSession().createQuery(sql).uniqueResult() ;
		return count;
	}
	
}

通用接口完成,我们使用的时候,只要继承BaseDaoImp就可以实现最基本的增删改查了。


例如学生管理系统中的年级:

接口是:

package com.sms.dao;

import com.sms.dao.base.BaseDao;
import com.sms.entity.GradeEntity;

public interface GradeDao extends BaseDao<GradeEntity>{
	
}

实现类:

package com.sms.dao.impl;

import org.springframework.stereotype.Component;

import com.sms.dao.GradeDao;
import com.sms.dao.base.impl.BaseDaoImpl;
import com.sms.entity.GradeEntity;
@Component
public class GradeDaoImpl extends BaseDaoImpl<GradeEntity> implements GradeDao{
    
}

这样子,GradeDaoImpl就可以实现最基础的增删改查的功能了。


转载地址:http://blog.csdn.net/kklt21cn/article/details/42040597


相关文章推荐

hibernate 延迟加载的秘密

Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hiber...

你真的愿意主动加班吗

与其问IT 行业加班,到底有没有价值,为何不反一下,真的愿意主动加班吗。 it行业加班是普遍现象,千万不要和程序猿抱怨工作累曾经的一个在国企朋友向我抱怨,内容是这样的:“8点30过一分钟打卡就算迟到...

常用的Hql语句

// HQL: Hibernate Query Language. // 特点: // >> 1,与SQL相似,SQL中的语法基本上都可以直接使用。 // >> 2,SQL查询的是表和表中的列;HQL...

spring data jpa 了解以及环境搭建

什么是JPAJPA是sun提出的一个对象持久化规范,各JavaEE应用服务器自主选择具体实现,JPA的设计者是Hibernate框架的作者,因此Hibernate作为Jboss服务器中JPA的默认实现...

spring data jpa 自定义接口实现

没错,spring data jpa很优秀,但有一些东西,我们就想自己来,我除了想用你的,还想用我自己的首先,我要spring data jpa的接口,为什么,因为很方便啊public interfa...

hibernate延迟加载!

Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hiberna...

HQL和SQL的区别

hql是面向对象查询,格式:from + 类名 + 类对象 + where + 对象的属性 sql是面向数据库表查询,格式:from + 表名 + where + 表中字段 1、查询 一般在Hi...

关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

查了好多资料old:@ManyToMany 注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名。例如,在St...

hiho一下 第五十八周

题意分析给定字符串S,判定S是否存在子串S’满足”aa…abb…bcc…c”的形式。其中abc为连续的三个字母,且a,b,c的数量相同。原题目中数量相等的连续n(n>3)个字母也是可行的,而实际上当n...

请别把加班说的那么“高大上”

别把加班说的那么“高大上”        【本期观点】IT行业加班,到底有没有价值?    【导语】众所周知,说到 IT 行业,大家的第一印象都是「加班严重」     不得不说,加班确实是 IT 行业...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)