基于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就可以实现最基础的增删改查的功能了。
转载地址:http://blog.csdn.net/kklt21cn/article/details/42040597
基于hibernate的BaseDao及其实现类的设计的更多相关文章
- Hibernate的BaseDao辅助类
1.BaseDao接口类,该类封装了一些hibernate操作数据库的一些常用的方法,包括分页查询,使用该类极大的简化了hibernate的开发 BaseDao.java package com.kj ...
- 批量产生ssh2项目中hibernate带注解的pojo类的快捷方法
近几个月一直在忙于项目组的ios应用项目的开发,没有太多时间去研究web应用方面的问题了.刚好,昨天有网友问到如何批量产生hibernate带注解的pojo类的快捷方法,所谓批量就是指将当前数据库中所 ...
- 基于JavaMail开发邮件发送器工具类
基于JavaMail开发邮件发送器工具类 在开发当中肯定会碰到利用Java调用邮件服务器的服务发送邮件的情况,比如账号激活.找回密码等功能.本人之前也碰到多次这样需求,为此特意将功能封装成一个简单易用 ...
- Python 基于urllib.request封装http协议类
基于urllib.request封装http协议类 by:授客QQ:1033553122 测试环境: Python版本:Python 3.3 代码实践 #!/usr/bin/env python ...
- Hibernate api 之常见的类(配置类,会话工厂类,会话类)
1:Configuration :配置管理类对象 1.1:config.configure(): 加载主配置文件的方法(hibernate.cfg.xml) ,默认加载src/hibernate.cf ...
- 基于NSString处理文件的高级类
基于NSString处理文件的高级类 我已经把处理文件的类简化到了变态的程度,如果你还有更简洁的方法,请告知我,谢谢! 使用详情: 源码: // // NSString+File.h // Maste ...
- 基于fork(),execvp()和wait()实现类linux下的bash——mybash
基于fork(),execvp()和wait()实现类linux下的bash--mybash 预备知识 fork():fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可 ...
- 生成 hibernate 映射文件和实体类
创建web工程,使用Hibernate的时候,在工程里一个一个创建实体类太麻烦,浪费时间,现在教大家如何用MyEclipse自动生成Hibernate映射文件及实体类 方法/步骤 创建数据库,创建 ...
- 04.Hibernate常用的接口和类---SessionFactory类和作用
是一个生成Session的工厂类 特点: 1.由Configuration通过加载配置文件创建该对象. SessionFactory factory = config.buildSessionFact ...
随机推荐
- leetcode 690.员工的重要性
题目: 给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id. 比如,员工1是员工2的领导,员工2是员工3的领导.他们相应的重要度为15, 10, 5.那么员工1的数据结 ...
- 对象创建模式之模块模式(Module Pattern)
模块模式可以提供软件架构,为不断增长的代码提供组织形式.JavaScript没有提供package的语言表示,但我们可以通过模块模式来分解并组织代码块,这些黑盒的代码块内的功能可以根据不断变化的软件需 ...
- sublime3激活方法
激活方法参考这里 $ tail -n4 /etc/hosts # https://blog.csdn.net/DeMeng33/article/details/80536926 127.0.0.1 w ...
- 13)编写一个子类SnakeCtrl来继承基类
1)首先是创建子类SnakeCtrl 2) 添加那个SnakeCtrl子类 3)出来了SnakeCtrl的基本样子 4)简单实现: ①改编那个SnakeCtrl.h中的内容: #pragma ...
- 01 语言基础+高级:1-5 常用API第二部分_day01.【Object类、常用API: Date类、System类、StringBuilder类】
day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 java.lang.O ...
- python爬取淘宝数据之遇到的问题
1.chormedriver.exe驱动下载地址 https://npm.taobao.org/mirrors/chromedriver 2.跳转网页页面不稳定问题 添加智能等待时间 driver.i ...
- 电影评论分类:二分类问题(IMDB数据集)
IMDB数据集是Keras内部集成的,初次导入需要下载一下,之后就可以直接用了. IMDB数据集包含来自互联网的50000条严重两极分化的评论,该数据被分为用于训练的25000条评论和用于测试的250 ...
- npm安装依赖报 npm ERR! code Z_BUF_ERROR npm ERR! errno -5 npm ERR! zlib: unexpected end of file 这个错误解决方案
今天碰到了一个比较奇怪的问题,下载依赖有问题报错 npm ERR! code Z_BUF_ERROR npm ERR! errno -5 npm ERR! zlib: unexpected end o ...
- tensorflow2使用中的一些问题
from tensorflow import keras import tensorflow as tf import numpy as np print(tf.__name__,tf.__versi ...
- GCC与G++区别
gcc和g++的区别总结:gcc: GNU C Compilerg++: GNU C++ Compiler 共同点:均属于the GNU Compiler Collection,gcc是鼻祖,后来才有 ...