基于hibernate的BaseDao及其实现类的设计
2014-12-20 09:38
381 查看
以前做设计的时候dao接口和它的实现了,这样子就不必写这么多的重复代码了。但由于对反射没有了解,除非依赖hibernate的其他组件,否则写不出来。不过,有了反射,我们可以通过泛型来实现我们想要做的功能了。
首先是接口:
然后是实现类:
通用接口完成,我们使用的时候,只要继承BaseDaoImp就可以实现最基本的增删改查了。
例如学生管理系统中的年级:
接口是:
实现类:
这样子,GradeDaoImpl就可以实现最基础的增删改查的功能了。
首先是接口:
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就可以实现最基础的增删改查的功能了。
相关文章推荐
- 基于hibernate的BaseDao及其实现类的设计
- 基于哈希查找的字库设计与实现及其自动生成工具的实现
- 基于视频处理的DSP系统通用设计模式及其实现
- 基于Spring MVC+Hibernate+Spring Security+Mysql 的B/S应用系统平台设计与实现
- 基于整合了struts 和hibernate 的j2ee 架构的用户权限管理系统的设计与实现
- Acegi+hibernate 动态实现基于角色的权限管理
- 设计模式学习笔记5:Singleton模式及其Delphi实现
- 用C#实现基于查寻字符串的文件行查询器(3)-设计与实现
- 基于授权和角色的访问控制的设计和实现(一)
- 基于WebGIS的地质灾害预警预报系统的设计与实现
- 数据层组件设计及其数据传递的实现简介
- 基于Struts+Hibernate的Web项目权限设计(2)
- 今天又学了一招 基于XMLHTTP 实现表示层的设计
- 基于Spring+Hibernate+DAO的hibernate的lazy的实现.
- 基于STRUTS架构信息系统的设计与实现
- 基于Spring+Hibernate+Struts框架分页的一种实现
- 基于XML的配置文件访问接口设计和实现
- 基于MapXtreme的WebGPS系统的设计与实现
- 讨论创建基于WSE的报表打印服务及其实现
- 讨论创建基于WSE的报表打印服务及其实现