一种好的持久层开发方法——建立BaseDao和BaseDaoImpl
2016-06-07 01:39
316 查看
使用hibernate开发持久层时,我们会发现:虽然entity类的含义和需求不同,其对应的Dao层类对应的方法也是不同的。但是有许多方法操作确实相同的。比如实体的增加,删除,修改更新,以及许多常用的查询方法。这些都是可复用的。因此可以把这些操作写在一个BaseDao中,其他的dao都继承于这个Dao。每个子dao只写与自己的业务相关的方法,这样可以提高代码的复用,增加了开发效率,也方便今后可能的扩展。下面是我在我的项目中使用的BaseDao和BaseDaoImpl的使用方法。仅供参考:
BaseDao:
package com.bupt.auth.dao.base; import java.io.Serializable; import java.util.List; public interface BaseDao<T> { Long save(T entity); //保存实体类 void delete(Long id); //删除实体类 void update(T entity); //更新实体 T getById(Long id); //通过id获得实体 List<T> getByIds(Long[] ids);//根据id数组获得对应的实体数组 List<T> findAll();//获得全部的实体 Long totalNum();//实体类的数量 List<T> getPage(int pageNow, int pageSize);//分页查找 List<T> find(String hql , String param);//根据具体的hql语句查找实体类 }
BaseDaoImpl:
package com.bupt.auth.dao.base; import java.lang.reflect.ParameterizedType; import java.util.Collections; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.transaction.annotation.Transactional; @Transactional @SuppressWarnings("unchecked") public abstract class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory; private Class<T> clazz=null; @SuppressWarnings("unchecked") public BaseDaoImpl(){ ParameterizedType pt=(ParameterizedType)this.getClass().getGenericSuperclass(); this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; } public Session getSession() { return sessionFactory.getCurrentSession(); } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public SessionFactory getSessionFactory() { return this.sessionFactory; } public Long save(T entity) { return (Long)getSession().save(entity); } public void delete(Long id) { // TODO Auto-generated method stub Object object = getById(id); if(object != null){ getSession().delete(object); } } public void update(T entity) { // TODO Auto-generated method stub getSession().update(entity); } public T getById(Long id) { // TODO Auto-generated method stub if(id != null){ return (T)getSession().get(clazz, id); }else{ return null; } } public List<T> getByIds(Long[] ids) { // TODO Auto-generated method stub\ if(ids == null || ids.length == 0){ return Collections.emptyList(); }else{ return getSession().createQuery("from "+ clazz.getSimpleName() + " where id in(:ids)").setParameterList("ids",ids).list(); } } public List<T> find(String hql , String param) { // 创建查询 Query query = getSession() .createQuery(hql); // 为包含占位符的HQL语句设置参数 query.setParameter("1",param); return (List<T>)query.list(); } public List<T> findAll() { // TODO Auto-generated method stub return getSession().createQuery("from " + clazz.getSimpleName()).list(); } public Long totalNum() { // TODO Auto-generated method stub return (Long)getSession().createQuery("select count(*) from " + clazz.getSimpleName()).uniqueResult(); } public List<T> getPage(int pageNow, int pageSize) { // TODO Auto-generated method stub return getSession().createQuery("from " + clazz.getSimpleName()).setFirstResult((pageNow - 1) * pageSize).setMaxResults(pageSize).list(); } /*@SuppressWarnings("unchecked") public T get(Class<T> entityClazz , String id) { return (T)((SessionFactory) getSession()).getCurrentSession() .get(entityClazz , id); }*/ }
相关文章推荐
- 安卓开发:一种快速提取安卓app的UI图标资源的方法
- Web开发中一种用sql语句完成分页的高效率方法,以jsp/asp为例
- PHP与MySQL开发中页面出现乱码的一种解决方法
- 从GIMP的Retinex算法里发现了一种高斯模糊的快速实现方法【开发记录】。
- 用 Win32 API 建立桌面快捷方式的一种方法
- 一种采用指针的指针的方式的建立链表的方法
- eclipse-SDK-3.2 安装GUI开发环境 VE 的一种方法
- web 开发之js---js 实现网页中播放wav的一种方法(flash播放器)
- 对象、组件、服务,逐步建立的开发方法
- 建立桌面快捷方式的一种方法
- 一种绝对提高开发水平的方法
- 一种优化的技术开发方法
- 一种开发AJAX的方法,ajax.dll
- Android开发全程记录(二)——去掉activity的标题栏,比较好的一种方法
- IOS开发键盘弹出时遮住输入框的问题的一种解决方法。
- 开发DSP硬件驱动程序的一种方法
- iOS切圆角的方式 第一种方法:通过设置layer的属性 最简单的一种,但是很影响性能,一般在正常的开发中使用很少. UIImageView *imageView = [[UIImag
- 结构光三维重建之单目标定的一种方法——建立“相位-像点-真实三维坐标”之间的关系
- TFS2010中建立Sharepoint Portal的一种方法
- 一种便利从sip用户建立到xmpp用户的通信连接的方法和设备