一种好的持久层开发方法——建立BaseDao和BaseDaoImpl

使用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:

  1 package com.bupt.auth.dao.base;
  2
  3 import java.lang.reflect.ParameterizedType;
  4 import java.util.Collections;
  5 import java.util.List;
  6
  7 import javax.annotation.Resource;
  8
  9 import org.hibernate.Query;
 10 import org.hibernate.Session;
 11 import org.hibernate.SessionFactory;
 12 import org.springframework.transaction.annotation.Transactional;
 13
 14
 15 @Transactional
 16 @SuppressWarnings("unchecked")
 17 public abstract class BaseDaoImpl<T> implements BaseDao<T> {
 18     @Resource
 19     private SessionFactory sessionFactory;
 20
 21     private Class<T> clazz=null;
 22
 23     @SuppressWarnings("unchecked")
 24     public BaseDaoImpl(){
 25         ParameterizedType pt=(ParameterizedType)this.getClass().getGenericSuperclass();
 26         this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
 27     }
 28     public Session getSession() {
 29         return sessionFactory.getCurrentSession();
 30     }
 31
 32     public void setSessionFactory(SessionFactory sessionFactory)
 33     {
 34         this.sessionFactory = sessionFactory;
 35     }
 36     public SessionFactory getSessionFactory()
 37     {
 38         return this.sessionFactory;
 39     }
 40     public Long save(T entity) {
 41         return    (Long)getSession().save(entity);
 42     }
 43
 44     public void delete(Long id) {
 45         // TODO Auto-generated method stub
 46         Object object = getById(id);
 47         if(object != null){
 48             getSession().delete(object);
 49         }
 50     }
 51
 52     public void update(T entity) {
 53         // TODO Auto-generated method stub
 54         getSession().update(entity);
 55     }
 56
 57     public T getById(Long id) {
 58         // TODO Auto-generated method stub
 59         if(id != null){
 60             return (T)getSession().get(clazz, id);
 61         }else{
 62             return null;
 63         }
 64     }
 65
 66     public List<T> getByIds(Long[] ids) {
 67         // TODO Auto-generated method stub\
 68         if(ids == null || ids.length == 0){
 69             return Collections.emptyList();
 70         }else{
 71             return getSession().createQuery("from "+
 72                     clazz.getSimpleName() + " where id in(:ids)").setParameterList("ids",ids).list();
 73         }
 74     }
 75
 76     public List<T> find(String hql , String param)
 77     {
 78         // 创建查询
 79         Query query = getSession()
 80             .createQuery(hql);
 81         // 为包含占位符的HQL语句设置参数
 82
 83             query.setParameter("1",param);
 84
 85         return (List<T>)query.list();
 86     }
 87
 88     public List<T> findAll() {
 89         // TODO Auto-generated method stub
 90         return getSession().createQuery("from " + clazz.getSimpleName()).list();
 91     }
 92
 93     public Long totalNum() {
 94         // TODO Auto-generated method stub
 95         return (Long)getSession().createQuery("select count(*) from " + clazz.getSimpleName()).uniqueResult();
 96     }
 97
 98     public List<T> getPage(int pageNow, int pageSize) {
 99         // TODO Auto-generated method stub
100         return getSession().createQuery("from " + clazz.getSimpleName()).setFirstResult((pageNow - 1) * pageSize).setMaxResults(pageSize).list();
101     }
102
103     /*@SuppressWarnings("unchecked")
104     public T get(Class<T> entityClazz , String id)
105     {
106         return (T)((SessionFactory) getSession()).getCurrentSession()
107             .get(entityClazz , id);
108     }*/
109 }
时间: 2024-10-13 16:05:44

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

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

前言 我们时常会遇到一些 web 项目,需要从不同的数据源中抓取数据来进行分析,而这些数据源是有可能变化的,需要用户来进行动态的维护和添加.可是,大多数的 web 程序使用了应用服务器或者容器中间件来管理数据源的生命周期,因此数据源的变化自然不能够独立于程序,而需要由专业人士去进行维护,必要时还需要重新发布程序来适应数据源的变化,而且数据源的个数.数据库的类型也都会有所限制. 那么怎样才可以突破以上这些局限,彻底实现由用户远程对数据源进行维护和管理的需求呢?本文提出了一个有效的解决方案,该方案的

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

一.JAP框架简介 JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范.主要是为了简化持久层开发以及整合ORM技术,结束Hibernate.TopLink.JDO等ORM框架各自为营的局面.JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强. 二.与SpringBoot2.0整合 1.核心依赖 <!-- JPA框架 --> <dependency> <groupId>org.sp

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

本章内容: 定义Spring对数据库访问的支持 配置数据库资源 使用Spring的JDBC模板 在几乎所有的企业级应用中,都需要构建数据持久层.现在意义上的数据持久层是指把对象或者数据保存到数据库中,以及从数据库中取出数据. Spring提供了一组数据访问框架,它集成了多种数据访问技术.不管是JDBC.iBATIS还是Hibernate. ? 一.Spring的数据访问哲学 Spring开发者一直坚持的一个目标之一就是:允许开发人员在开发应用软件时能够遵循面向对象原则的"针对接口编程"

业务层将持久层方法调用

主要业务层和持久层的联系 员工实体Bean package com.project.bean; import java.sql.Date; /** * 员工信息实体类 * @author 45470 * */ public class EmployeeBean { /**员工id*/ private int empId; /**员工登录名*/ private String empAccount; /**员工登录密码*/ private String empPwd="123456"; /

bboss持久层设置数据库查询fetchsize参数方法

jdbc驱动程序api提供了指定了查询语句fetchsize的方法,有些数据库(比如oracle)本身提供了fetchsize的默认值,这样进行大量数据查询时,不会因为返回的结果集太大导致jvm爆掉,有些数据库可能没有默认设置fetchsize,因此需要手动指定.bboss持久层设置数据库查询fetchsize参数方法很简单,只要在poolman.xml文件的datasource中指定一个queryfetchsize参数即可,如果不指定就采用数据库驱动提供的默认值. 设置queryfetchsi

表现层(jsp)、持久层(类似dao)、业务层(逻辑层、service层)、模型(javabean)、控制层(action)

转自:http://www.blogjava.net/jiabao/archive/2007/04/08/109189.html 为了实现web层(struts)和持久层(Hibernate)之间的松散耦合,我们采用业务代表(Business Delegate)和DAO(Data Access Object)两种模式.DAO模式为了减少业务逻辑和数据访问逻辑之间的耦合,当一个持久曾框架被应用时,该模式将会减少业务对象和该框架之间的耦合,这样我们可以不修改业务对象而选择不同的持久层框架的实现.实际

JPA规范及其它持久层框架

JPA规范及其它持久层框架 JPA是一种规范,而hibernate是JPA的一种实现 JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了目前Java持久化技术的优点,旨在规范.简化Java对象的持久化工作.使用JPA持久化对象,并不是依赖于某一个ORM框架. JPA是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势: 1 标准化 JPA 是 JCP 组织

java-mybaits-00203-DAO-mapper代理开发方法,多参数【推荐】

程序员只需要mapper接口(相当 于dao接口) 不需要写具体实现类,mapper已经代理完成,mybatis才有的 一.mapper代理开发方法(建议使用) 程序员在编写mapper.xml(映射文件)和mapper.java需要遵循一个开发规范: 1.mapper.xml中namespace就是mapper.java的类全路径. 2.mapper.xml中statement的id和mapper.java中方法名一致. 3.mapper.xml中statement的parameterType

model ,orm,dao,service,持久层 ,mvc 这些名词在java中的概念?

这些概念不针对某个特定的编程语言. view层:结合control层,显示前台页面. control层:业务模块流程控制,调用service层接口. service层:业务操作实现类,调用dao层接口. dao层:数据业务处理,持久化操作 model层:pojo,OR maping,持久层 借别人一张图,希望题主能理清楚层间关系:  企业应用开发中,可以将系统分为三层:表示层.业务层.持久层,就是所谓的三层架构.三层各有各的架构模式.其中表示层常用架构就是MVC,业务层常用架构模式分为事务脚本模