基于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 ...
随机推荐
- Java 静态static关键字,main函数,对象的初始化过程,对象调用成员,单例模式的设计,静态代码块(6)
Java 静态static关键字,静态代码块详情参考:static的使用原理讲解http://www.cnblogs.com/itcqx/p/5519464.html main函数: java Mai ...
- www.wolframalpha.com
单个查询 http://www.wolframalpha.com/input/?source=nav&i=simplify+radical+sqrt(567) notebook https:/ ...
- linux系统终端介绍
https://zhidao.baidu.com/question/174261014.html
- js中call和apply的实现原理
js中call和apply的实现原理 实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...
- CF 1095C Powers Of Two
题目连接:http://codeforces.com/problemset/problem/1095/C 题目: C. Powers Of Two time limit per test 4 seco ...
- XMemcached 中文api
变更历史 2010-06-22 添加客户端分布和SASL验证两节,更新spring配置一节. 2010-06-23 添加maven依赖说明 2010-10-17 1.2.6 released 2011 ...
- [HNOI2019]序列(单调栈+二分)
通过打表证明发现答案就是把序列划分成若干段,每段的b都是这一段a的平均数.50分做法比较显然,就是单调栈维护,每次将新元素当成一个区间插入末尾,若b值不满足单调不降,则将这个区间与单调栈前一个区间合并 ...
- vue中过滤器filter
Vue.js 允许我们自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值表达式. v-bind表达式.过滤器应该被添加在 JavaScript 表达式的尾部,由 ...
- vbox NAT 设置端口映射(NAT+8080端口转发)
VirtualBox的提供了四种网络接入模式,它们分别是: 1.NAT 网络地址转换模式(NAT,Network Address Translation) 2.Bridged Adapter 桥接模式 ...
- iOS补位动画、沙漏效果、移动UITableViewCell、模拟贪吃蛇、拖拽进度等源码
iOS精选源码 JHAlertView - 一款黑白配色的HUD之沙漏效果 继承UIButton的自定义按钮SPButton 用递归算法实现iOS补位动画 iOS 长按移动UITableViewCel ...