`

关于BaseDaoImpl的简单示例

 
阅读更多

          示例:实现basedao

package com.cn.base.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.fang.base.dao.IBaseDao;
import com.fang.util.HibernateSessionFactory;
import com.fang.util.Page;

public abstract class BaseDaoImpl<T> implements IBaseDao<T> {
	private Log log = LogFactory.getLog(this.getClass());
	private Class<T> entityClass;

    @SuppressWarnings("unchecked")
    public BaseDaoImpl() {
    	//1、尝试基本的获取对象实体类对象方法
    	entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    	/*2、或尝试这个关于代理的如果有T的实例t,创建代理后的实例proxiedT,你拿到proxiedT 后怎么 才能拿到 t?
    		通过代理生成的类应该是继承了被代理的类,所以getGenericSuperclass只是取到被代理类的Type。
    		正常应该是要取到被代理类所继承的父类的Type,
    		所以要先getSuperclass取到被代理类再getGenericSuperclass取到父类的Type才成*/

    	/*Type type = getClass().getGenericSuperclass();
    	if(!(type instanceof ParameterizedType)){
    	    type = getClass().getSuperclass().getGenericSuperclass();
    	}
    	entityClass = (Class<T>)((ParameterizedType)type).getActualTypeArguments()[0];*/
    }
    
	public Session getSession() {
		return HibernateSessionFactory.getSession();
	}	
	public void closeSession(){
		HibernateSessionFactory.closeSession();
	}

	@Override
	public void save(T instance) {
		log.debug("saving "+instance+" instance");
		Transaction tx = getSession().beginTransaction();
		try {
			getSession().save(instance);
			tx.commit();
			log.debug("save successful");
		} catch (RuntimeException re) {
			tx.rollback();
			log.error("save failed", re);
			throw re;
		} finally{
			closeSession();
		}
	}
	
	@Override
	public void delete(T instance) {
		log.debug("deleting "+instance+" instance");
		Transaction tx = getSession().beginTransaction();
		try {
			getSession().delete(instance);
			tx.commit();
			log.debug("delete successful");
		} catch (RuntimeException re) {
			log.error("delete failed", re);
			throw re;
		} finally{
			closeSession();
		}
	}
	
	@Override
	public void update(T instance) {
		log.debug("updating "+instance+" instance");
		Transaction tx = getSession().beginTransaction();
		try {
			getSession().update(instance);
			tx.commit();
			log.debug("update successful");
		} catch (RuntimeException re) {
			tx.rollback();
			log.error("update failed", re);
			throw re;
		} finally{
			closeSession();
		}
	}
	
	@SuppressWarnings("rawtypes")
	@Override
	public Object findById(Class clazz, Integer id) {
		log.debug("getting "+clazz+" instance with id: " + id);
		try {
			//Hibernate.initialize(District.class);
			Object o = getSession().get(clazz,id);
			return o;
		} catch (RuntimeException re) {
			log.error("get failed", re);
			throw re;
		} finally{
			closeSession();
		}
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<T> findAll() {
		log.debug("getting "+entityClass+" List All ");
		try {
			String hql = "FROM "+entityClass;
			Query queryObject = getSession().createQuery(hql);
			
			return queryObject.list();
		} catch (RuntimeException re) {
			log.error("find by HQL ", re);
			throw re;
		} finally{
			closeSession();
		}
	}
	
	/**
	 * 根据class类查询数据
	 * @param class
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public List findAll(Class clazz) {
		log.debug("getting "+clazz+" List All ");
		try {
			String c = clazz.toString();
			String hql = "FROM "+c.substring(c.lastIndexOf(".")+1,c.length());
			Query queryObject = getSession().createQuery(hql);
			
			return queryObject.list();
		} catch (RuntimeException re) {
			log.error("find by HQL ", re);
			throw re;
		} finally{
			closeSession();
		}
	}
	
	/**
	 * 根据对象名和对象属性查询数据
	 * @param className
	 * @param propertyName
	 * @param value
	 * @return 实体对象列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByProperty(String className,String propertyName, Object value) {
		log.debug("finding "+className+" instance with property: " + propertyName + ", value: " + value);
		
		try {
			String hql = "FROM "+className+" as o WHERE o."+propertyName+" = ?";
			Query queryObject = getSession().createQuery(hql);
			queryObject.setParameter(0, value);
			
			return queryObject.list();
		} catch (RuntimeException re) {
			log.error("find by property name failed", re);
			throw re;
		} finally{
			closeSession();
		}
	}
	
	/**
	 * 根据HQL查询数据
	 * @param hql
	 * @return 实体对象列表
	 */
	@SuppressWarnings("rawtypes")
	public List findByHql(String hql) {
		log.debug(hql);
		try {
			Query queryObject = getSession().createQuery(hql);
			
			return queryObject.list();
		} catch (RuntimeException re) {
			log.error("find by HQL ", re);
			throw re;
		} finally{
			closeSession();
		}
	}
	
	/**
	 * 方案一、获取分页对象,实现分页获取数据的功能
	 * @param hql 查询数据的HQL
	 * @param page 需要显示数据的页码
	 * @param pageSize 每页数据量
	 * @return Object[0]当前页的数据列表List ,Object[1]总页数,Object[2]总数量
	 */
	@SuppressWarnings("rawtypes")
	public Object[] findPageByHql(final String hql, String hqlCount, final int page, final int pageSize) {
		log.debug(hql);
		List list = new ArrayList();
		//总记录数
		Long total = new Long(0);
		//总页数
		Integer totalPage = 0;
		try {
			//1、根据hql语句查询指定数据
			Query qList = getSession().createQuery(hql);
			qList.setFirstResult(page * pageSize);
			qList.setMaxResults(pageSize);
		    list = qList.list();
		    
			//2、根据hql语句查询总记录数
		    List listCount = findByHql(hqlCount);
			if(listCount!=null && listCount.size()>0){
				total = (Long)listCount.get(0);
			}
			
			//3、根据总记录数计算出总页数,ceil进1
			totalPage = (int) Math.ceil((double) total.longValue() / pageSize);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			closeSession();
		}
		
		return new Object[] { list, totalPage, total };
	}
	
	/**
	 * 方案二、通过分页对象,实现分页获取数据的功能
	 * @param hql 查询数据的HQL
	 * @param page 分页对象
	 * @return page 分页对象
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public Page findPageByHql(final String hql, String hqlCount, Page page) {
		log.debug(hql);
		try {
			if(page != null){
				//1、根据hql语句查询指定数据
				Query qList = getSession().createQuery(hql);
				qList.setFirstResult(page.getStartRow());
				qList.setMaxResults(page.getSize());
			    page.setList(qList.list());//将数据集合保存到page对象
			    
				//2、根据hql语句查询总记录数
			    List listCount = findByHql(hqlCount);
				if(listCount!=null && listCount.size()>0){
					page.setTotalCount(Integer.parseInt(String.valueOf(listCount.get(0))));//将总记录数保存到page对象
				}
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			closeSession();
		}
	
		return page;
	}
}

 

------------------------------

public class BaseDaoImpl<T>{  
  
    // 保存当前运行类的参数化类型中的实际的类型  
    private Class clazz;  
    // 表名  
    private String tableName;  
    // 构造函数: 1. 获取当前运行类的参数化类型; 2. 获取参数化类型中实际类型的定义(class)  
    public BaseDaoImpl(){  
        //  this  表示当前运行类  (假设是AccountDao或AdminDao)  
        //  this.getClass()  当前运行类的字节码(AccountDao.class或AdminDao.class)  
        //  this.getClass().getGenericSuperclass();  当前运行类的父类,即为BaseDaoImpl<Account>  
        //                                           其实就是“参数化类型”, ParameterizedType     
        Type type = this.getClass().getGenericSuperclass();  
        // 强制转换为“参数化类型”  【BaseDaoImpl<Account>】  
        ParameterizedType pt = (ParameterizedType) type;  
        // 获取参数化类型中,实际类型的定义  【new Type[]{Account.class}】  
        Type types[] =  pt.getActualTypeArguments();  
        // 获取数据的第一个元素:Accout.class  
        clazz = (Class) types[0];  
        // 表名  (与类名一样,只要获取类名就可以)  
        tableName = clazz.getSimpleName();  
    }  

 

 

分享到:
评论

相关推荐

    baseDao及baseDaoImpl将hibernate里面的方法进行合理的封装,使用到java的反射技术

    以下是关于这个主题的详细解释。 **BaseDao接口** BaseDao是一个接口,它定义了一系列通用的数据库操作方法,如查询、保存、更新和删除。这些方法是基于Hibernate或其他ORM框架的API设计的。通过在项目中引入...

    BaseDAOImpl.java

    java数据库基础操作类,hibernate框架基础

    AHibernate1.1

    更多使用示例见博客: http://blog.csdn.net/lk_blog 早期版本AHibernate1.0下载地址:http://download.csdn.net/detail/lk_blog/4222048 本版主要修改的内容: 1.修改bug,实体类的属性定义为int时自动生成Id正常,定义...

    Hibernate框架笔记

    5. **添加BaseDao与BaseDaoImpl**:设计通用的数据访问接口(BaseDao)及其实现类(BaseDaoImpl),封装常用的数据库操作方法。 6. **添加单元测试**:编写单元测试代码来验证数据库连接是否正确,以及基本的CRUD...

    ExtJS+SSH+Junit的Demo

    "ExtJS+SSH+Junit的Demo" 这个标题指的是一个示例项目,它结合了三个关键技术:ExtJS(一个用于构建Web应用的JavaScript库)、SSH(Struts2、Spring和Hibernate的集成框架)以及Junit(Java单元测试框架)。...

    baseDaoUtil.zip

    这个工具包的核心理念是让DAO层的类可以通过继承`BaseDaoImpl`来快速实现基本的CRUD(创建、读取、更新、删除)功能,从而减少重复代码并提高开发效率。 `BaseDaoImpl`类通常会封装JDBC相关的通用方法,如连接...

    Spring JdbcTemplate

    例如,一个简单的`applicationContext.xml`配置片段可能如下: ```xml ``` 以上就是关于Spring JdbcTemplate的基本介绍及其在实际项目中的应用。由于这个库主要是针对Oracle数据库设计的,所以很多...

    ORMLite With Android Guide

    下面是一个简单的代码示例,展示了如何使用ORMLite进行基本的CRUD操作: ```java // 实体类 @DatabaseTable(tableName = "users") public class User { @DatabaseField(id = true) private int id; @Database...

    spring的jdbctemplate的crud的基类dao

    接着,`BaseDaoImpl` 类实现了 `BaseDaoInf` 接口,并注入了名为 `jdbcTemplate` 的`JdbcTemplate`实例。这是通过`@Resource`注解实现的,它告诉Spring容器将名称为`jdbcTemplate`的bean注入到这个字段中。 在`...

    S2SH框架整合开发代码.zip

    针对S2SH框架整合的一个开发框架,包括BaseDaoImpl类的实现,包括PageBean 分页类,也包括Hibernate查询类QueryHelper,和前台的分页。是一个很不错的例子。 包括整合jar包。

    ORMLite入门简单操作完整代码

    关于外键的使用,ORMLite支持外键约束,上面的`User`类中`address`字段就是外键的例子。这样,当我们操作`User`对象时,可以同时处理与之关联的`Address`对象。 这个案例涵盖了ORMLite的基本用法,包括实体类定义、...

    常用的BaseDAO及其实现

    在BaseDAOImpl类中,countAll方法通过HibernateTemplate执行HQL语句,统计指定类的所有持久化对象。其他方法的实现方式相似,都是通过HibernateTemplate执行HQL语句或sql语句来实现数据访问操作。 BaseDAO提供了...

    java web项目基础步骤.docx

    在示例中,`DBTest` 类可能是用于测试数据库连接的类。创建此类时,需要编写SQL连接语句,导入相应的JDBC驱动,例如`mysql-connector-java.jar`,并使用`Class.forName()`加载驱动,`Connection`对象建立连接,`...

    Myeclipse-ssh整合

    创建`BaseDAOImpl`类,继承自`HibernateDaoSupport`,并实现一个基础DAO接口`BaseDAO`。`BaseDAOImpl`提供了基本的CRUD操作,利用`HibernateTemplate`简化了Hibernate的操作。 ```java public class BaseDAOImpl ...

    spring hibernate整合的底层数据操作方法

    在实际开发中,我们通常会创建一个BaseDao接口和BaseDaoImpl实现类,包含基本的CRUD操作。例如: ```java public interface BaseDao&lt;T&gt; { void save(T entity); void deleteById(Object id); T findById(Object ...

    Spring定时器的实例.doc

    在这个类中,`baseDaoImpl`被用来执行数据库查询。 3. **时间处理**: 类中使用了`Calendar`类来获取当前日期和时间,并进行一些时间相关的计算。例如,`nowDay`和`nowMonth`分别获取了当前的日期和月份。 4. **...

    项目必用工具类

    1.BaseDaoImpl.java 基础数据类 2.PageRequest.java 分页映射类 3.QueryCondition.java 多条件查询映射类 4.PageResponse.java 分页返回值类,包括下一页、上一页等属性。 5.QueryList.java 查询条件返回值类,包括...

    Servlet开发搭建

    - `BaseDao` 和 `BaseDaoImpl`:这两个类是数据访问层的基础,`BaseDao` 定义了通用的数据操作接口,而 `BaseDaoImpl` 是其实现类,通常包含与数据库交互的方法,如CRUD操作。 - `BaseServlet`:这是一个基础的...

    基于jQuery实现的Ajax 验证用户名唯一性实例代码

    文章通过具体的代码示例,呈现了JSP页面的构建方式、JavaScript中Ajax调用的使用方法以及Java后端的业务逻辑处理过程。这些知识点和技巧对于希望学习Web开发的读者具有很好的参考价值。 需要注意的是,文档内容中有...

Global site tag (gtag.js) - Google Analytics