以前做设计的时候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的BaseDao及其实现类的设计的更多相关文章

  1. Hibernate的BaseDao辅助类

    1.BaseDao接口类,该类封装了一些hibernate操作数据库的一些常用的方法,包括分页查询,使用该类极大的简化了hibernate的开发 BaseDao.java package com.kj ...

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

    近几个月一直在忙于项目组的ios应用项目的开发,没有太多时间去研究web应用方面的问题了.刚好,昨天有网友问到如何批量产生hibernate带注解的pojo类的快捷方法,所谓批量就是指将当前数据库中所 ...

  3. 基于JavaMail开发邮件发送器工具类

    基于JavaMail开发邮件发送器工具类 在开发当中肯定会碰到利用Java调用邮件服务器的服务发送邮件的情况,比如账号激活.找回密码等功能.本人之前也碰到多次这样需求,为此特意将功能封装成一个简单易用 ...

  4. Python 基于urllib.request封装http协议类

    基于urllib.request封装http协议类 by:授客QQ:1033553122 测试环境: Python版本:Python 3.3   代码实践 #!/usr/bin/env python ...

  5. Hibernate api 之常见的类(配置类,会话工厂类,会话类)

    1:Configuration :配置管理类对象 1.1:config.configure(): 加载主配置文件的方法(hibernate.cfg.xml) ,默认加载src/hibernate.cf ...

  6. 基于NSString处理文件的高级类

    基于NSString处理文件的高级类 我已经把处理文件的类简化到了变态的程度,如果你还有更简洁的方法,请告知我,谢谢! 使用详情: 源码: // // NSString+File.h // Maste ...

  7. 基于fork(),execvp()和wait()实现类linux下的bash——mybash

    基于fork(),execvp()和wait()实现类linux下的bash--mybash 预备知识 fork():fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可 ...

  8. 生成 hibernate 映射文件和实体类

    创建web工程,使用Hibernate的时候,在工程里一个一个创建实体类太麻烦,浪费时间,现在教大家如何用MyEclipse自动生成Hibernate映射文件及实体类 方法/步骤   创建数据库,创建 ...

  9. 04.Hibernate常用的接口和类---SessionFactory类和作用

    是一个生成Session的工厂类 特点: 1.由Configuration通过加载配置文件创建该对象. SessionFactory factory = config.buildSessionFact ...

随机推荐

  1. L0,L1,L2正则化浅析

    在机器学习的概念中,我们经常听到L0,L1,L2正则化,本文对这几种正则化做简单总结. 1.概念 L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数 ...

  2. 17.3.12---socket

    1----如果要用python做一个服务器和客户端的通信程序,那么就一定得选择标准库中的scoket套接字模块,它支持多种网络协议:TCP/IP    ,ICMP/IP,            UDP ...

  3. 60年前美国军方的这个编程原则,造就了多少伟大的框架--KISS原则

    摘自:https://kb.cnblogs.com/page/654057/ 作者: 贺卓凡  来源: ImportSource  发布时间: 2020-01-23 19:52  阅读: 2324 次 ...

  4. Java web之jsp,xml(2020.1.7)

    1.xml文档规则 xml声明 字符集 xml元素的基本规则: 合法标签名 嵌套子元素 空元素

  5. Oauth2.0详解及安全使用

    引言:刚刚参加工作的时候接到的第一个任务就是接入新浪的联合登录功能,当时新浪用的还是oauth1.0协议.接入的时候没有对oauth协议有过多的了解,只是按照开放平台的接入流程进行开发,当时还在想这么 ...

  6. c语言中getchar的用法

    /************************************************************************* > File Name: getchar2. ...

  7. Opencv笔记(十四)——边缘检测算法canny

    简介 Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法,它是由很多步构成的算法. 最优边缘检测的三个主要评价 ...

  8. 基于rtmp的移动端推流解决方案

    因工作需要,及考虑成本因素,需要探索一套免费的移动端基于rtmp推流的直播解决方案,过程虽稍显曲折,但最终还是完成了目标.在这里将记录下来,以便日后查阅. 总体思路 移动端推流(RTMP) ---&g ...

  9. 吴裕雄--天生自然python学习笔记:python 用firebase实现英汉词典进阶版

    用 post 方法创建的数据会自动产生一个 id (Key ),但有时也常常为了取得这个 id 而让程序难以处理 . 以英汉词典标准版来说,它的数据结构如下: 如果将每条数据都改为{eword:cwo ...

  10. C++ 回调函数简单示例

    回调函数其实就是以函数指针做函数参数传递给另一个函数,在另一个函数执行的时候可以根据函数指针执行回调函数的代码.简单示例,便于理解,防止遗忘. #include <iostream> ty ...