使用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. DynamoDB Local for Desktop Development

    Would you like to be able to write and test code that uses the Amazon DynamoDB API even if you have ...

  2. Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) B. Bear and Blocks 水题

    B. Bear and Blocks Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/573/pr ...

  3. C#中如何计算时间差?

    C#中怎么计算两时间相差多少.计算2个时间之间的差,可以计算到时分秒! <1> label1.Text = "2004-1-1 15:36:05"; label2.Te ...

  4. MVC风格

    MVC风格 点击了解很多其它软件体系结构风格 §模型-视图-控制器风格常被简称为MVC风格 §组件:模型.视图.控制器 §连接件:显式调用.隐式调用.其它机制(比如:Http协议) 工作机制: Mod ...

  5. TreeView1MouseMove

    procedure TForm1.TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,   Y: Integer); var   nod ...

  6. 循环语句until和while

    一.until语句的基本格式 until 条件测试 do 语句块 done 只要条件测试语句未成功结束,则执行语句块.(如果一开始条件测试语句就成功退出,那么一次也不执行语句块.这里跟C语言中的do. ...

  7. Java_Utils框架

    Spring Utils https://github.com/tangyanbo/springmore

  8. Spark Streaming metadata checkpoint

    Checkpointing 一个流应用程序必须全天候运行,所有必须能够解决应用程序逻辑无关的故障(如系统错误,JVM崩溃等).为了使这成为可能,Spark Streaming需要checkpoint足 ...

  9. ASP.NET MVC 4 让数据库自动迁移

    今天实际测试了下这个方法,可以保持数据库与实体类同步,同时不会出现数据库迁移的提示.但是只能更改实体类来改变数据库,而不能改数据库来改变实体类.所以这才是Code frist,如果通过改数据库表来改动 ...

  10. 完全自定义 TabBar

    // // CustomTabBarController.h // Dream // // Created by mac on 14-10-17. // Copyright (c) 2014年 HM. ...