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

以前做设计的时候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就可以实现最基础的增删改查的功能了。

时间: 2024-08-14 08:09:55

基于hibernate的BaseDao及其实现类的设计的相关文章

SpringMVC学习系列(12) 完结篇 之 基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现

到这里已经写到第12篇了,前11篇基本上把Spring MVC主要的内容都讲了,现在就直接上一个项目吧,希望能对有需要的朋友有一些帮助. 一.首先看一下项目结构: InfrastructureProjects:是抽取出的基础项目,主要封装了一些通用的操作. SpringMVC3Demo:就是管理系统所在的项目. WeiXinAPI:是之前做微信管理平台测试时封装一些操作,如果不需要把该项目移除即可. 注:项目的前端UI框架用的是国外的一个基于Bootstrap框架的开发的Demo,如不需要替换为

Hibernate中的五大核心类和接口

Hibernate中的五大核心类和接口 Configuration(类) : 加载配置文件hibernate.cfg.xml文件中的配置信息,从而得到: 1).hibernate的底层信息: 数据库连接,jdbc驱动,方言(dialect),用户名 ,密码 2).hibernate的映射文件(*.hbm.xml) SessionFactory(接口): 通过configuration创建的sessionFactory, 可以用来获得session openSession(); sessionFa

生成 hibernate 映射文件和实体类

创建web工程,使用Hibernate的时候,在工程里一个一个创建实体类太麻烦,浪费时间,现在教大家如何用MyEclipse自动生成Hibernate映射文件及实体类 方法/步骤 创建数据库,创建相应的表   点击图标,选择MyEclipse Datebase Explorer   右击空白区域,选择new菜单,根据提示创建数据库连接,创建好后会显示你所创建的连接名,如图mysqldb是我创建的数据库连接   选择需要添加hibernate映像文件的工程右击--->MyEclipse-->Ad

批量产生ssh2项目中hibernate带注解的pojo类的快捷方法

近几个月一直在忙于项目组的ios应用项目的开发,没有太多时间去研究web应用方面的问题了.刚好,昨天有网友问到如何批量产生hibernate带注解的pojo类的快捷方法,所谓批量就是指将当前数据库中所有数据表全部一次性生成带注解的pojo类,假设当前数据库friend有50个数据表,如果一个个的新建产生pojo类的话,那就是说要手工输入新建50个pojo类后,还有输入每个类带注解的代码,并且还要写好有关联的类之间的映射关系,虽然,从学习的角度来说,手工写是个不错的主意,但是从开发效率和开发成本来

基于Hibernate的JPA2.0快速构建

前言 尽管现在开源的框架已经非常优秀,但是缺乏统一的标准有违软件开源的初衷,因此Sun公司的JCP组织发布了Java EE的JPA标准,并统一ORM规则.JPQL查询语言.子查询.高级查询和批量处理等操作.推出JPA规范有两点原因:一是,希望简化现有的SE和EE工作,特别是EJB3.0的推出,使得企业级项目的开发推向更高的层次(EJB3.0已经非常优秀,但是由于时间的问题,并且Spring已经占领了市场):二是,希望业界有一个统一的标准,就像当年JDBC推出一样,只实现接口,其余API的实现交给

scrapy的大文件下载(基于一种形式的管道类实现)

scrapy的大文件下载(基于一种形式的管道类实现) 爬虫类中将解析到的图片地址存储到item,将item提交给指定的管道 在管道文件中导包:from scrapy.pipelines.images import ImagesPipeline 基于ImagesPipeline父类,自定义一个管道类 重写管道类中的如下三个方法: from scrapy.pipelines.images import ImagesPipeline import scrapy class ImgporPipeline

基于JSP的学术交流论坛系统的设计与实现

目 录 摘要 I 关键词 I Abstract I Key words I 1前言 1 1.1课题研究的目的及意义 1 1.2国内外研究现状 1 1.3本文的工作 2 2系统分析 3 2.1可行性分析3 2.2需求分析3 2.2.1需求分析概述3 2.2.2任务概述3 2.2.3会员用户4 2.2.4版主4 2.2.5管理员4 2.3开发工具以及相关技术简介5 2.3.1相关工具简介5 2.3.2相关技术概述5 2.4系统的数据流图7 2.5用例图8 3总体设计9 3.1系统架构设计9 3.1.

17.并发类容器设计

并发类容器设计 1.ConcurrentHashMap:代替散列普通的hashTable,添加了复合操作支持. private ConcurrentHashMap<String, Object> resultMap = new ConcurrentHashMap<String, Object>(); for (Map.Entry<String, Object> m : resultMap.entrySet()) { count += (Long) m.getValue(

项目OA之实体类的设计

1.明天中秋啦,苦逼啊,自己一个人过啊,不过幸好有OA项目陪着也不孤单,继续做我的笔记,接着昨天的. 2.昨天笔记已经搭建好了SSH环境和SSH的整合,今天需要做的就是实体类的设计和分析,首先我们将资源结构分好建立一个config文件夹用来放置所有的配置文件,前文已经说过,注意需要放置在类路径下也就是直接在项目名右击建立sourcefolder,建立对应的jsp 存放页面,style存放样式,script存放脚本语言等等 3.根据项目的需求设计实体类,我这里是使用的starUml工具画的UML图