使用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);
}*/
}

一种好的持久层开发方法——建立BaseDao和BaseDaoImpl的更多相关文章

  1. (转)MyBatis框架的学习(三)——Dao层开发方法

    http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...

  2. 基于 Spring 和 iBATIS 的动态可更新多数据源持久层

    前言 我们时常会遇到一些 web 项目,需要从不同的数据源中抓取数据来进行分析,而这些数据源是有可能变化的,需要用户来进行动态的维护和添加.可是,大多数的 web 程序使用了应用服务器或者容器中间件来 ...

  3. 八:SpringBoot-集成JPA持久层框架,简化数据库操作

    SpringBoot-集成JPA持久层框架,简化数据库操作 1.JPA框架简介 1.1 JPA与Hibernate的关系: 2.SpringBoot整合JPA Spring Data JPA概述: S ...

  4. SpringBoot2.0 基础案例(09):集成JPA持久层框架,简化数据库操作

    一.JAP框架简介 JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范.主要是为了简化持久层开发以及整合ORM技术,结束H ...

  5. 第五章 征服数据库(Spring对DB的使用)——开发持久层

    本章内容: 定义Spring对数据库访问的支持 配置数据库资源 使用Spring的JDBC模板 在几乎所有的企业级应用中,都需要构建数据持久层.现在意义上的数据持久层是指把对象或者数据保存到数据库中, ...

  6. SSH三种框架及表示层、业务层和持久层的理解

    Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...

  7. SSH三种框架及表示层、业务层和持久层的理解(转)

    Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...

  8. Mybatis学习之自定义持久层框架(六) 自定义持久层框架:完善CRUD方法并进行测试

    前言 没想到会等到半年以后才来写这篇文章,我已经不记得当初自己想要在这篇文章中写什么了,还好有一些零散的笔记留着,就对照着上一篇文章及零散的笔记,把内容给补充完吧. 完善CRUD方法 完善Defaul ...

  9. spring-boot+mybatis开发实战:如何在spring-boot中使用myabtis持久层框架

    前言: 本项目基于maven构建,使用mybatis-spring-boot作为spring-boot项目的持久层框架 spring-boot中使用mybatis持久层框架与原spring项目使用方式 ...

随机推荐

  1. BZOJ 2152: 聪聪可可 点分治

    2152: 聪聪可可 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...

  2. C#获得和发送网站Session

    request = (HttpWebRequest)WebRequest.Create(url);                                         if (Const. ...

  3. delphi 插入 HTML代码 播放器

    Delphi在Webbrowser中插入 HTML/java script代码 使用方法将下面的代码赋值到1个记事本里保存,然后保存为xxx.htm就可以看到效果使用PasteHtml实现功能 的事件 ...

  4. [AngularJS] Provider

    This lesson describes what is really happening when you use the angularfactory and how you can make ...

  5. 实例源码--Android理财工具源码

      下载源码   技术要点: 1.Sqlite数据库的综合使用 2.控件的综合使用 3. 源码带详细的中文注释 ...... 详细介绍: 1. Sqlite数据库的综合使用 本套源码采用了Sqlite ...

  6. php引入公用部分html出现了一行空白(原创)

    在导入公用部分html(客服信息)时,莫名其妙出现了一行空白,样式,html均无问题 后来才发现是html多了一行空白 <div class="ad-module-item3 fn-m ...

  7. Eclipse的java代码出错:The import org.apache cannot be resolved

    Eclipse中,折腾java代码. 把之前在android中的代码拿过来使用. 结果出现The import org.apache cannot be resolved的错误: [解决过程] 1.这 ...

  8. Android(java)学习笔记70:同步中的死锁问题以及线程通信问题

    1. 同步弊端: (1)效率低 (2)如果出现了同步嵌套,就容易产生死锁问题 死锁问题及其代码 : (1)是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象 (2)同步代码块的 ...

  9. 协议Protocol

    1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口.           遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议.       ...

  10. 用终端直接在桌面生成text文件

    简单的两行命令: cd Desktop/  按回车 touch 888.text 按回车就会在桌面生成名称为888的text文件 用途:做demo的时候可以加一个说明文档进去,这样下次可以很方便的查看