hibernate4 baseDao的封装

1.BaseDao.java 基础类接口

package com.itv.launcher.util;

import java.io.Serializable;

import java.util.Collection;

import java.util.List;

/**

 * @ClassName: IBaseDao

 * @Description: Dao封装接口

 * @author yz

 * @date 2014年6月16日17:05:17

 */

public interface IBaseDao<T, ID extends Serializable> {

    

    /**

     * <保存实体>

     * <完整保存实体>

     * @param t 实体参数

     */

    public abstract void save(T t);

    /**

     * <保存或者更新实体>

     * @param t 实体

     */

    public abstract void saveOrUpdate(T t);

    /**

     * <load>

     * <加载实体的load方法>

     * @param id 实体的id

     * @return 查询出来的实体

     */

    public abstract T load(ID id);

    /**

     * <get>

     * <查找的get方法>

     * @param id 实体的id

     * @return 查询出来的实体

     */

    public abstract T get(ID id);

    /**

     * <contains>

     * @param t 实体

     * @return 是否包含

     */

    public abstract boolean contains(T t);

    /**

     * <delete>

     * <删除表中的t数据>

     * @param t 实体

     */

    public abstract void delete(T t);

    /**

     * <根据ID删除数据>

     * @param Id 实体id

     * @return 是否删除成功

     */

    public abstract boolean deleteById(ID Id);

    /**

     * <删除所有>

     * @param entities 实体的Collection集合

     */

    public abstract void deleteAll(Collection<T> entities);

    

    /**

     * <执行Hql语句>

     * @param hqlString hql

     * @param values 不定参数数组

     */

    public abstract void queryHql(String hqlString, Object... values);

    

    /**

     * <执行Sql语句>

     * @param sqlString sql

     * @param values 不定参数数组

     */

    public abstract void querySql(String sqlString, Object... values);

    /**

     * <根据HQL语句查找唯一实体>

     * @param hqlString HQL语句

     * @param values 不定参数的Object数组

     * @return 查询实体

     */

    public abstract T getByHQL(String hqlString, Object... values);

    /**

     * <根据SQL语句查找唯一实体>

     * @param sqlString SQL语句

     * @param values 不定参数的Object数组

     * @return 查询实体

     */

    public abstract T getBySQL(String sqlString, Object... values);

    /**

     * <根据HQL语句,得到对应的list>

     * @param hqlString HQL语句

     * @param values 不定参数的Object数组

     * @return 查询多个实体的List集合

     */

    public abstract List<T> getListByHQL(String hqlString, Object... values);

    /**

     * <根据SQL语句,得到对应的list>

     * @param sqlString HQL语句

     * @param values 不定参数的Object数组

     * @return 查询多个实体的List集合

     */

    public abstract List<T> getListBySQL(String sqlString, Object... values);

    

    /**

     * 由sql语句得到List

     * @param sql

     * @param map

     * @param values

     * @return List

     */

    public List findListBySql(final String sql, final RowMapper map, final Object... values);

    /**

     * <refresh>

     * @param t 实体

     */

    public abstract void refresh(T t);

    /**

     * <update>

     * @param t 实体

     */

    public abstract void update(T t);

    /**

     * <根据HQL得到记录数>

     * @param hql HQL语句

     * @param values 不定参数的Object数组

     * @return 记录总数

     */

    public abstract Long countByHql(String hql, Object... values);

    

    /**

     * <HQL分页查询>

     * @param hql HQL语句

     * @param countHql 查询记录条数的HQL语句

     * @param pageNo 下一页

     * @param pageSize 一页总条数

     * @param values 不定Object数组参数

     * @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合

     */

    public abstract PageResults<T> findPageByFetchedHql(String hql, String countHql, int pageNo, int pageSize, Object... values);

}

2.BaseDao.java 基础实现类

package com.itv.launcher.util;

import java.io.Serializable;

import java.lang.reflect.ParameterizedType;

import java.math.BigDecimal;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Timestamp;

import java.sql.Types;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Date;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.ScrollableResults;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.jdbc.Work;

import org.springframework.beans.factory.annotation.Autowired;

/**

 * @ClassName: BaseDao

 * @Description: baseDao实现

 * @author yz

 * @date 2014年6月16日17:09:52

 *

 */

@SuppressWarnings({ "rawtypes", "unchecked" })

public class BaseDao<T, ID extends Serializable> implements IBaseDao<T, ID> {

    

    @Autowired

    private SessionFactory sessionFactory;

    protected Class<T> entityClass;

    public BaseDao() {

    }

    protected Class getEntityClass() {

        if (entityClass == null) {

            entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

        }

        return entityClass;

    }

    /**

     * <保存实体>

     * <完整保存实体>

     * @param t 实体参数

     * @see com.itv.launcher.util.IBaseDao#save(java.lang.Object)

     */

    @Override

    public void save(T t) {

        this.getSession().save(t);

    }

    

    /**

     * <保存或者更新实体>

     * @param t 实体

     * @see com.itv.launcher.util.IBaseDao#saveOrUpdate(java.lang.Object)

     */

    @Override

    public void saveOrUpdate(T t) {

        this.getSession().saveOrUpdate(t);

    }

    

    /**

     * <load>

     * <加载实体的load方法>

     * @param id 实体的id

     * @return 查询出来的实体

     * @see com.itv.launcher.util.IBaseDao#load(java.io.Serializable)

     */

    @Override

    public T load(ID id) {

        T load = (T) this.getSession().load(getEntityClass(), id);

        return load;

    }

    

    /**

     * <get>

     * <查找的get方法>

     * @param id 实体的id

     * @return 查询出来的实体

     * @see com.itv.launcher.util.IBaseDao#get(java.io.Serializable)

     */

    @Override

    public T get(ID id) {

        T load = (T) this.getSession().get(getEntityClass(), id);

        return load;

    }

    

    /**

     * <contains>

     * @param t 实体

     * @return 是否包含

     * @see com.itv.launcher.util.IBaseDao#contains(java.lang.Object)

     */

    @Override

    public boolean contains(T t) {

        return this.getSession().contains(t);

    }

    /**

     * <delete>

     * <删除表中的t数据>

     * @param t 实体

     * @see com.itv.launcher.util.IBaseDao#delete(java.lang.Object)

     */

    @Override

    public void delete(T t) {

        this.getSession().delete(t);

    }

    

    /**

     * <根据ID删除数据>

     * @param Id 实体id

     * @return 是否删除成功

     * @see com.itv.launcher.util.IBaseDao#deleteById(java.io.Serializable)

     */

    @Override

    public boolean deleteById(ID Id) {

         T t = get(Id);

         if(t == null){

             return false;

         }

         delete(t);

        return true;

    }

    /**

     * <删除所有>

     * @param entities 实体的Collection集合

     * @see com.itv.launcher.util.IBaseDao#deleteAll(java.util.Collection)

     */

    @Override

    public void deleteAll(Collection<T> entities) {

        for(Object entity : entities) {

            this.getSession().delete(entity);

        }

    }

    /**

     * <执行Hql语句>

     * @param hqlString hql

     * @param values 不定参数数组

     * @see com.itv.launcher.util.IBaseDao#queryHql(java.lang.String, java.lang.Object[])

     */

    @Override

    public void queryHql(String hqlString, Object... values) {

        Query query = this.getSession().createQuery(hqlString);

        if (values != null)

        {

            for (int i = 0; i < values.length; i++)

            {

                query.setParameter(i, values[i]);

            }

        }

        query.executeUpdate();

    }

    /**

     * <执行Sql语句>

     * @param sqlString sql

     * @param values 不定参数数组

     * @see com.itv.launcher.util.IBaseDao#querySql(java.lang.String, java.lang.Object[])

     */

    @Override

    public void querySql(String sqlString, Object... values) {

        Query query = this.getSession().createSQLQuery(sqlString);

        if (values != null)

        {

            for (int i = 0; i < values.length; i++)

            {

                query.setParameter(i, values[i]);

            }

        }

        query.executeUpdate();

    }

    /**

     * <根据HQL语句查找唯一实体>

     * @param hqlString HQL语句

     * @param values 不定参数的Object数组

     * @return 查询实体

     * @see com.itv.launcher.util.IBaseDao#getByHQL(java.lang.String, java.lang.Object[])

     */

    @Override

    public T getByHQL(String hqlString, Object... values) {

        Query query = this.getSession().createQuery(hqlString);

        if (values != null)

        {

            for (int i = 0; i < values.length; i++)

            {

                query.setParameter(i, values[i]);

            }

        }

        return (T) query.uniqueResult();

    }

    /**

     * <根据SQL语句查找唯一实体>

     * @param sqlString SQL语句

     * @param values 不定参数的Object数组

     * @return 查询实体

     * @see com.itv.launcher.util.IBaseDao#getBySQL(java.lang.String, java.lang.Object[])

     */

    @Override

    public T getBySQL(String sqlString, Object... values) {

        Query query = this.getSession().createSQLQuery(sqlString);

        if (values != null)

        {

            for (int i = 0; i < values.length; i++)

            {

                query.setParameter(i, values[i]);

            }

        }

        return (T) query.uniqueResult();

    }

    /**

     * <根据HQL语句,得到对应的list>

     * @param hqlString HQL语句

     * @param values 不定参数的Object数组

     * @return 查询多个实体的List集合

     * @see com.itv.launcher.util.IBaseDao#getListByHQL(java.lang.String, java.lang.Object[])

     */

    @Override

    public List<T> getListByHQL(String hqlString, Object... values) {

        Query query = this.getSession().createQuery(hqlString);

        if (values != null)

        {

            for (int i = 0; i < values.length; i++)

            {

                query.setParameter(i, values[i]);

            }

        }

        return query.list();

    }

    /**

     * <根据SQL语句,得到对应的list>

     * @param sqlString HQL语句

     * @param values 不定参数的Object数组

     * @return 查询多个实体的List集合

     * @see com.itv.launcher.util.IBaseDao#getListBySQL(java.lang.String, java.lang.Object[])

     */

    @Override

    public List<T> getListBySQL(String sqlString, Object... values ) {

        Query query = this.getSession().createSQLQuery(sqlString);

        if (values != null)

        {

            for (int i = 0; i < values.length; i++)

            {

                query.setParameter(i, values[i]);

            }

        }

        return query.list();

    }

    

    /**

     * 由sql语句得到List

     * @param sql

     * @param map

     * @param values

     * @return List

     * @see com.itv.launcher.util.IBaseDao#findListBySql(java.lang.String, com.itv.launcher.util.RowMapper, java.lang.Object[])

     */

    @Override

    public List findListBySql(final String sql, final RowMapper map, final Object... values) {

        final List list = new ArrayList();

        // 执行JDBC的数据批量保存

        Work jdbcWork = new Work()

        {

            public void execute(Connection connection)

                throws SQLException

            {

                

                PreparedStatement ps = null;

                ResultSet rs = null;

                try

                {

                    ps = connection.prepareStatement(sql);

                    for (int i = 0; i < values.length; i++)

                    {

                        setParameter(ps, i, values[i]);

                        

                    }

                    

                    rs = ps.executeQuery();

                    int index = 0;

                    while (rs.next())

                    {

                        Object obj = map.mapRow(rs, index++);

                        list.add(obj);

                        

                    }

                }

                finally

                {

                    if (rs != null)

                    {

                        rs.close();

                        

                    }

                    if (ps != null)

                    {

                        ps.close();

                    }

                }

            }

        };

        this.getSession().doWork(jdbcWork);

        return list;

    }

    /**

     * <refresh>

     * @param t 实体

     * @see com.itv.launcher.util.IBaseDao#refresh(java.lang.Object)

     */

    @Override

    public void refresh(T t) {

        this.getSession().refresh(t);

    }

    /**

     * <update>

     * @param t 实体

     * @see com.itv.launcher.util.IBaseDao#update(java.lang.Object)

     */

    @Override

    public void update(T t) {

        this.getSession().update(t);

    }

    

    /**

     * <根据HQL得到记录数>

     * @param hql HQL语句

     * @param values 不定参数的Object数组

     * @return 记录总数

     * @see com.itv.launcher.util.IBaseDao#countByHql(java.lang.String, java.lang.Object[])

     */

    @Override

    public Long countByHql(String hql, Object... values) {

        Query query = this.getSession().createQuery(hql);

        if(values != null){

            for(int i = 0; i < values.length; i++) {

                query.setParameter(i, values[i]);

            }

        }

        return (Long) query.uniqueResult();

    }

    /**

     * <HQL分页查询>

     * @param hql HQL语句

     * @param countHql 查询记录条数的HQL语句

     * @param pageNo 下一页

     * @param pageSize 一页总条数

     * @param values 不定Object数组参数

     * @return PageResults的封装类,里面包含了页码的信息以及查询的数据List集合

     * @see com.itv.launcher.util.IBaseDao#findPageByFetchedHql(java.lang.String, java.lang.String, int, int, java.lang.Object[])

     */

    @Override

    public PageResults<T> findPageByFetchedHql(String hql, String countHql,

            int pageNo, int pageSize, Object... values) {

        PageResults<T> retValue = new PageResults<T>();

        Query query = this.getSession().createQuery(hql);

        if(values != null){

            for(int i = 0; i < values.length; i++) {

                query.setParameter(i, values[i]);

            }

        }

        int currentPage = pageNo > 1 ? pageNo : 1;

        retValue.setCurrentPage(currentPage);

        retValue.setPageSize(pageSize);

        if (countHql == null)

        {

            ScrollableResults results = query.scroll();

            results.last();

            retValue.setTotalCount(results.getRowNumber() + 1);// 设置总记录数

        }

        else

        {

            Long count = countByHql(countHql, values);

            retValue.setTotalCount(count.intValue());

        }

        retValue.resetPageNo();

        List<T> itemList = query.setFirstResult((currentPage - 1) * pageSize).setMaxResults(pageSize).list();

        if (itemList == null)

        {

            itemList = new ArrayList<T>();

        }

        retValue.setResults(itemList);

        

        return retValue;

    }

    /**

     * @return the sessionFactory

     */

    public SessionFactory getSessionFactory() {

        return sessionFactory;

    }

    /**

     * @param sessionFactory the sessionFactory to set

     */

    public void setSessionFactory(SessionFactory sessionFactory) {

        this.sessionFactory = sessionFactory;

    }

    

    /**

     *

     * @return session

     */

    public Session getSession() {

        //需要开启事物,才能得到CurrentSession

        return sessionFactory.getCurrentSession();

    }

    

    /**

     *

     * 设置每行批处理参数

     *

     * @param ps

     * @param pos ?占位符索引,从0开始

     * @param data

     * @throws SQLException

     * @see [类、类#方法、类#成员]

     */

    private void setParameter(PreparedStatement ps, int pos, Object data)

        throws SQLException

    {

        if (data == null)

        {

            ps.setNull(pos + 1, Types.VARCHAR);

            return;

        }

        Class dataCls = data.getClass();

        if (String.class.equals(dataCls))

        {

            ps.setString(pos + 1, (String)data);

        }

        else if (boolean.class.equals(dataCls))

        {

            ps.setBoolean(pos + 1, ((Boolean)data));

        }

        else if (int.class.equals(dataCls))

        {

            ps.setInt(pos + 1, (Integer)data);

        }

        else if (double.class.equals(dataCls))

        {

            ps.setDouble(pos + 1, (Double)data);

        }

        else if (Date.class.equals(dataCls))

        {

            Date val = (Date)data;

            ps.setTimestamp(pos + 1, new Timestamp(val.getTime()));

        }

        else if (BigDecimal.class.equals(dataCls))

        {

            ps.setBigDecimal(pos + 1, (BigDecimal)data);

        }

        else

        {

            // 未知类型

            ps.setObject(pos + 1, data);

        }

        

    }}

3.PageResults.java 

package com.itv.launcher.util;

import java.util.List;

/**

 * 分页封装类

 * 用于做分页查询的基础类,封装了一些分页的相关属性

 * @author 闫洲

 * @version v1.0

 * @param <T>

 */

public class PageResults<T> {

    // 下一页

    private int pageNo;

    // 当前页

    private int currentPage;

    // 每页个个数

    private int pageSize;

    // 总条数

    private int totalCount;

    // 总页数

    private int pageCount;

    // 记录

    private List<T> results;

    public int getPageCount() {

        return pageCount;

    }

    public void setPageCount(int pageCount) {

        this.pageCount = pageCount;

    }

    public int getPageNo() {

        if (pageNo <= 0) {

            return 1;

        } else{

            return pageNo > pageCount ? pageCount : pageNo;

        }

    }

    public void setPageNo(int pageNo) {

        this.pageNo = pageNo;

    }

    public List<T> getResults() {

        return results;

    }

    public void setResults(List<T> results) {

        this.results = results;

    }

    public int getCurrentPage() {

        return currentPage;

    }

    public void setCurrentPage(int currentPage) {

        this.currentPage = currentPage;

    }

    public int getPageSize() {

        return pageSize;

    }

    public void setPageSize(int pageSize) {

        this.pageSize = pageSize <= 0 ? 10 : pageSize;

    }

    public int getTotalCount() {

        return totalCount;

    }

    public void setTotalCount(int totalCount) {

        this.totalCount = totalCount;

    }

    public void resetPageNo() {

        pageNo = currentPage + 1;

        pageCount = totalCount % pageSize == 0 ? totalCount / pageSize

                : totalCount / pageSize + 1;

    }

}

4.RowMapper.java

package com.itv.launcher.util;

import java.sql.ResultSet;

import java.sql.SQLException;

/**

 * RowMapper

 * @author yanzhou

 * @version v1.0

 */

public interface RowMapper

{

    public Object mapRow(ResultSet rs, int index)

        throws SQLException;

}

时间: 2024-08-05 10:44:18

hibernate4 baseDao的封装的相关文章

Hibernate4之二级缓存配置

一级缓存.二级缓存.查询缓存 1.什么是缓存 a) 在内存中开辟一块空间,把本来应该存储在硬盘上的东西,放到内存里,将来再要读取的时候,从内存读取,这部分内容就是缓存. 2.什么是一级缓存 a) 即session级别的缓存 3.什么是二级缓存 a) SessionFactory级别的缓存,可以跨越session存在 缓存:缓存是什么,解决什么问题? 位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为缓存Cache.缓存目的:让数据更接近于应用程序,协调速度不匹

hibernate 详解

 Hibernate 1 Hibernate的配置文件 1.1 cfg 该文件的后缀为*.cfg.xml hibernate配置文件,该文件中主要存放了 数据的url地址 数据库用户信息 缓存 mapping文件的配置路径 <session-factory > <property name="connection.url">jdbc:oracle:thin:@192.168.8.62:1521:orcl</property> <proper

从零配置hibernate

hibernate的配置文件主要是两大块:hibernate.cfg.xml(主配置文件)和**.hbm.xml(映射文件),再细分的话主配置文件又分为基本配置和拓展配置,映射文件又分为一对多,多对多等. 首先就从最基本的配置文件说起: <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD

Android Realm数据库完美解析

当我们的app有数据需要保存到本地缓存时,可以使用file,sharedpreferences,还有sqlite. sharedpreferences其实使用xml的方式,以键值对形式存储基本数据类型的数据.对于有复杂筛选查询的 操作,file和sharedpreferences都不能满足了.sqlite可以满足有大量复杂查询要求的缓存数据操作.但是sqlite的使用略复杂,代码量很大,还好网上有很多优秀的orm框架可使用,比喻ORMlite,greenDao等. ORMlite,greenDa

JAVAEE——SSH项目实战02:客户列表和BaseDao封装

作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7129152.html 该项目在SSH三大框架整合基础上进行开发:http://www.cnblogs.com/xieyupeng/p/7108141.html 一.客户列表 1.分析 2.书写步骤 (1)封装PageBean public class PageBean { //当前页数 private Integer currentPage; //总记录数 private Intege

SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装

SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年7月6日 http://www.cnblogs.com/fanshuy

baseDao 使用spring3+hibernate4方式

启动异常: java.lang.ClassCastException: org.springframework.orm.hibernate4.SessionHolder cannot be cast to org.springframework.orm.hibernate3.SessionHolder 由于hibernate4已经完全可以实现事务了 与spring3.1中的hibernatedao,hibernateTemplete等有冲突,所以spring3.1里已经不提供hibernated

J2EE开发框架搭建(6) - 使用hibernate4完成基本Dao的封装

现在orm框架有很多,比如说guzz,hibernate,mybaits....,在封装一个框架的时候我们可以选择一种,也可以选择多种实现,供以后使用选择,这里我只实现了hibernate,目录结构图如下: 1. 首先查询BaseRepository这个接口,该接口泛型 :T 表示实体类型:ID表示主键类型:虽然在框架里面已经提供了查询的结构Searchable,但是Searchable也不能做到无限强大,比如一个多变关联查询,嵌套查询是没有办法完成的,所有只能自己编写sql语句,但是hiber

封装basedao

package com.huawei.common; import java.sql.ResultSet;import java.sql.SQLException; public interface CallBack { void execute(ResultSet rs) throws SQLException;} package com.huawei.utils; import java.lang.reflect.Field; import com.huawei.domain.Address