我的Dao层

Spring 为整合 Hibernate3 提供了两个工具类,分别是 HibernateTemplate 和 HibernateDaoSupport ,但是 Spring 不推荐使用这两个实现 Dao 层,因为操作复杂 CRUD 不是很灵活,而是推荐使用通过注入 SessionFactory 的方式,用过 getCurrentSession() 获取当前线程的 Session 对象,然后进行持久化。

下面是我在自己练手项目中实现的 Dao 层:

1 .  Dao层的顶层接口类:

package dao;

import java.io.Serializable;
import java.util.List;

/**
 * Dao层的顶层接口
 *
 * @author 码上猿梦
 *  http://www.cnblogs.com/daimajun/
 * @param <T>
 */
public interface BaseDao<T> {
    /**
     * 根据类和主键值获取一个实体对象
     * @return
     */
    T get(Class<T> entityClazz, Serializable id);

    /**
     * 根据实体对象保存数据
     * @param entity
     * @return
     */
    Serializable save(T entity);

    /**
     * 根据实体对象更新数据
     * @param eneity
     */
    void update(T eneity);

    /**
     * 根据实体对象删除数据
     * @param entity
     */
    void delete(T entity);

    /**
     * 根据实体类型和主键id删除数据
     * @param entityClazz
     * @param id
     */
    void deleteById(Class<T> entityClazz,Serializable id);

    /**
     * 根据实体类型获取其所有对象,并封装为List集合
     * @param entityClazz
     * @return
     */
    List<T> findAll(Class<T> entityClazz);

    /**
     * 根据实体类获取对象总数
     * @param entityClazz
     * @return
     */
    Long findCount(Class<T> entityClazz);
}

2 . Dao层的空实现类:

package dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.SessionFactory;

import dao.BaseDao;

/**
 * BaseDao的空实现
 *
 * @author 码上猿梦
 *  http://www.cnblogs.com/daimajun/
 * @param <T>
 */
public class BaseDaoEmptyImpl<T> implements BaseDao<T> {

    /**
     * 会话工厂
     */
    private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    /**
     * 注入SessionFactory
     * @param sessionFactory
     */
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public T get(Class<T> entityClazz, Serializable id) {
        return null;
    }

    @Override
    public Serializable save(T entity) {
        return null;
    }

    @Override
    public void update(T eneity) { }

    @Override
    public void delete(T entity) { }

    @Override
    public void deleteById(Class<T> entityClazz, Serializable id) { }

    @Override
    public List<T> findAll(Class<T> entityClazz) {
        return null;
    }

    @Override
    public Long findCount(Class<T> entityClazz) {
        return null;
    }
}

3 . Dao层实现类:

package dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;

/**
 * Dao层的实现类
 *
 * @author 码上猿梦
 *  http://www.cnblogs.com/daimajun/
 * @param <T>
 */
public class BaseDaoImpl<T> extends BaseDaoEmptyImpl<T> {

    @Override
    public T get(Class<T> entityClazz, Serializable id) {
        return this.getSessionFactory().getCurrentSession().get(entityClazz, id);
    }

    @Override
    public Serializable save(T entity) {
        return getSessionFactory().getCurrentSession().save(entity);
    }

    @Override
    public void update(T eneity) {
        getSessionFactory().getCurrentSession().saveOrUpdate(eneity);
    }

    @Override
    public void delete(T entity) {
        getSessionFactory().getCurrentSession().delete(entity);
    }

    @Override
    public void deleteById(Class<T> entityClazz, Serializable id) {
        this.getSessionFactory().getCurrentSession()
        .createQuery("delete" + entityClazz.getSimpleName() + "en where en.id = ?0")
        .setParameter(0, id)
        .executeUpdate();
    }

    @Override
    public List<T> findAll(Class<T> entityClazz) {
        return find("select * en from" + entityClazz.getSimpleName() + "en");
    }

    /**
     *
     */
    @Override
    public Long findCount(Class<T> entityClazz) {
        List<T> list = find("select" + entityClazz.getFields()[0].toString() + "from" + entityClazz.getSimpleName() + "en");
        if (null!=list && list.size()==1 ) {
            return (Long)list.get(0);
        }
        return 0L;
    }

    /**
     * 根据Hql语句查询
     * @param Hql
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> find(String Hql) {
        List<T> list = getSessionFactory().getCurrentSession().createQuery(Hql).list();
        return list;
    }

    /**
     * 根据带参数的Hql语句查询数据
     * @param Hql
     * @param params
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> find(String Hql,Object...params) {
        Query query = getSessionFactory().getCurrentSession().createQuery(Hql);
        for (int i = 0; i < params.length; i++) {
            query.setParameter(i + "", params[i]);
        }
        return query.list();
    }

    /**
     * 使用Hql语句,执行分页查询
     * @param hql
     * @param pageNo 当前页码
     * @param pageSize 每页大小
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> findByPage(String hql, int pageNo, int pageSize) {
        Query query = getSessionFactory().getCurrentSession().createQuery(hql);
        query.setFirstResult((pageNo-1) * pageSize).setMaxResults(pageSize);
        return query.list();
    }

    /**
     * 使用带参的Hql语句,进行分页查询
     * @param Hql
     * @param pageNo 当前页码
     * @param pageSize 每页大小
     * @param params
     * @return
     */
    @SuppressWarnings("unchecked")
    protected List<T> findByPage(String Hql, int pageNo, int pageSize, Object...params) {
        Query query = getSessionFactory().getCurrentSession().createQuery(Hql);
        for (int i = 0; i < params.length; i++) {
            query.setParameter(i, params[i]);
        }
        query.setFirstResult(pageNo).setMaxResults(pageSize);
        return query.list();
    }
}

代码思路来源于【轻量级JavaEE 企业级应用实战第4版 Struts2 + Spring + Hibernate 整合开发】。

时间: 2024-10-03 02:14:04

我的Dao层的相关文章

使用MyBatis Generator自动生成实体、mapper和dao层

通过MyBatis Generator可以自动生成实体.mapper和dao层,记录一下怎么用的. 主要步骤: 关于mybatis从数据库反向生成实体.DAO.mapper: 参考文章:http://www.cnblogs.com/wangkeai/p/6934683.html第一种方式:main方法运行(推荐) 1.在pom.xml中加入插件依赖: 2.写mbgConfiguration.xml文件,jdbc.properties文件 3.写/SSM/src/main/java/main/Ge

基于Mybatis的Dao层的开发

基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory生产,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量. SqlSessionFactory是一个接口,接口中定义了openSession

DAO层,Service层,Controller层、View层介绍

来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此 接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及 有关数据库连接的参数都在Spring的配置文件中进行配置. Service层 Service 层主要负责业

Dao层设计

一.关于Dao层 DB 对象的设计. 1.设计DB对象时,请使用包装类.因为从数据库中查出的数据项可能是null,对于int,boolean等简单数据类型,没有办法表示null,会使程序抛出异常. 2.对于mysql要设计是否类型的字段请使用TINYINT类型,对应的java类型为Boolean. 3.对于mysql 字段类型 到Java类型的映射,请参考如下如所示. MySQL数据类型 JAVA数据类型 JDBC TYPE 普通变量类型 主键类型 BIGINT Long BIGINT 支持 支

MyBatis xml和dao层接口组合使用

在这里,不再介绍Mybatis的配置. mybatis可以用xml进行数据操作,也可以在dao层用注解的方式,也可以采取xml和dao层接口组合使用的方法.显然 ,后者更加简单. 实体类Student package com.zhao.entity; /** * * @author: zhao * @time: 2016年5月31日 * * @description:学生 */ public class Student { private int stuId; private String st

DAO层,Service层,Controller层、View层

DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置. Service层:Service层主要负责业务模块的逻辑应用设计.同样是首先设计接口,再设计其实现的类,接着再Spring的配置文件中配

Java高并发秒杀API之业务分析与DAO层

课程介绍 高并发和秒杀都是当今的热门词汇,如何使用Java框架实现高并发秒杀API是该系列课程要研究的内容.秒杀系列课程分为四门,本门课程是第一门,主要对秒杀业务进行分析设计,以及DAO层的实现.课程中使用了流行的框架组合SpringMVC+Spring+MyBatis,还等什么,赶快来加入吧! 第1章 课程介绍 本章介绍秒杀系统的技术内容,以及系统演示.并介绍不同程度的学员可以学到什么内容. 第2章 梳理所有技术和搭建工程 本章首先介绍秒杀系统所用框架和技术点,然后介绍如何基于maven搭建项

SSH 项目中 用Hibernate底层 简单的封装DAO层

废话不多少了,主要是使用hibernate的查询方法,自己封装了DAO层,供service来方便使用. 首先:必须要继承的 public class CommonDao extends HibernateDaoSupport 紧接着是要注入必须的数据源: @Resource private SessionFactory sessionFactory; @PostConstruct public void initSessionFactory() { super.setSessionFactory

DAO 层 和 ORM框架

DAO全称:data access objectORM: object relation mapping.一般不叫DAO模式,只是叫DAO层而已,用来跟数据库打交道.而ORM是对象关系映射,有很多常用的ORM框架.就算是一个应用中采用了ORM框架,也是需要DAO层的,只不过采用了后是跟ORM框架打交道,由ORM跟数据库打交道,而没有采用,就是DAO层直接访问数据库,仅此而已. DAO 层 和 ORM框架

MyBatis的Dao层注入SqlSession

有点坑爹,以前没用过Mybatis,最近才用,而且一直用Mybatis推荐的接口映射的方式,但是今天有人告诉我接口方式用得少,大多还是采用从配置文件里面读sql的方式,当然接口也是类似的,都是利用mapper.xml. 于是就想把这东西整合进来,当进行dao的时候发现一个小问题,sqlSession怎么注入进来的问题,以前Hibernate的的习惯用sessionFactory的openSession()方法,但是每个方法都要open一下,麻烦,就想能不能直接把sqlSession通过注解注入进