`

BaseDao可以这样设计

    博客分类:
  • java
 
阅读更多
package org.ks4j.orm.hibernate;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.persistence.MappedSuperclass;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;
import org.ks4j.orm.Compositor;
import org.ks4j.orm.Filtration;
import org.ks4j.orm.PageData;
import org.ks4j.utils.HibernateUtils;
import org.ks4j.utils.ReflectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.util.Assert;

/**
 * dao基类.
 * 		1:该类封装了最常见数据库操作的方法,你可以继承该类,添加自己喜欢的方法
 * 		2:当你有多个sessionFactory时,你也可以在你的子类中重写setSessionFactory()方法
 * 
 *
 * @param <T> 实体类类型
 */
@SuppressWarnings("unchecked")
@MappedSuperclass
public class BaseDao<T>
{
	protected Logger logger = LoggerFactory.getLogger(getClass());

	protected SessionFactory sessionFactory;
	
	protected Class<T> entityClass;

	//操作SQL语句的模板
	private  JdbcTemplate  jdbcTemplate;            
	
	//注入Spring JdbcTemplate 对象
	@Resource(name="jdbcTemplate")
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	/**
	 * 构造方法
	 */
	public BaseDao()
	{
		this.entityClass = ReflectionUtils.getSuperClassGenricType(getClass());
	}

	/**
	 * 采用@Resource(name="xxx")按名称注入SessionFactory, 当有多个SesionFactory的时候Override本函数.
	 */
	@Resource
	public void setSessionFactory(SessionFactory sessionFactory)
	{
		this.sessionFactory = sessionFactory;
	}

	/**
	 * 取得Session.
	 */
	public Session getSession()
	{
		return sessionFactory.getCurrentSession();
	}

	//--------------------------------------------------------------------------------------------------

	/**
	 * 新增对象.
	 */
	public void save(T entity)
	{
		Assert.notNull(entity, "entity不能为空");
		getSession().save(entity);
		logger.debug("save entity: {}", entity);
	}

	/**
	 * 修改对象.
	 */
	public void update(T entity)
	{
		Assert.notNull(entity, "entity不能为空");
		getSession().update(entity);
		logger.debug("update entity: {}", entity);
	}

	/**
	 * 删除对象.
	 */
	public void delete(T entity)
	{
		Assert.notNull(entity, "entity不能为空");
		getSession().delete(entity);
		logger.debug("delete entity: {}", entity);
	}

	/**
	 * 删除对象.
	 */
	public void delete(String id)
	{
		delete(findById(id));
		logger.debug("delete entity {},id is {}", entityClass.getSimpleName(), id);
	}

	/**
	 * 按id获取对象.
	 */
	public T findById(String id)
	{
		Assert.notNull(id, "id不能为空");
		return (T) getSession().get(entityClass, id);
	}

	/**
	 * 按属性查找唯一对象,匹配方式为相等.
	 */
	public T find(String fieldName, Object fieldValue)
	{
		Assert.hasText(fieldName, "fieldName不能为空");
		Criterion criterion = Restrictions.eq(fieldName, fieldValue);
		return (T) HibernateUtils.createCriteria(getSession(), entityClass, criterion).uniqueResult();
	}

	/**
	 * 按属性查找对象列表,匹配方式为相等.
	 */
	public List<T> findList(String fieldName, Object fieldValue)
	{
		Assert.hasText(fieldName, "fieldName不能为空");
		Criterion criterion = Restrictions.eq(fieldName, fieldValue);
		return HibernateUtils.createCriteria(getSession(), entityClass, criterion).list();
	}

	/**
	 * 按照过滤条件对象查找对象列表.
	 */
	public List<T> findList(Filtration... filtrations)
	{
		Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);
		//设置过滤条件
		criteria = HibernateUtils.setFiltrationParameter(criteria, filtrations);
		return criteria.list();
	}

	/**
	 * 按照过滤条件对象查找对象列表.
	 */
	public List<T> findList(List<Filtration> filtrationList)
	{
		Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);
		//设置过滤条件
		criteria = HibernateUtils.setFiltrationParameter(criteria, filtrationList);
		return criteria.list();
	}

	/**
	 * 按照过滤条件对象查找对象列表,支持排序.
	 */
	public List<T> findList(Compositor compositor, Filtration... filtrations)
	{
		Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);
		//设置过滤条件
		criteria = HibernateUtils.setFiltrationParameter(criteria, filtrations);
		//设置排序
		criteria = HibernateUtils.setCompositorParameter(criteria, compositor);
		return criteria.list();
	}

	/**
	 * 按照过滤条件对象查找对象列表,支持排序.
	 */
	public List<T> findList(Compositor compositor, List<Filtration> filtrationList)
	{
		Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);
		//设置过滤条件
		criteria = HibernateUtils.setFiltrationParameter(criteria, filtrationList);
		//设置排序
		criteria = HibernateUtils.setCompositorParameter(criteria, compositor);
		return criteria.list();
	}

	/**
	 * 获取全部对象.
	 */
	public List<T> findAll()
	{
		List<Map<String,Object>> list = jdbcTemplate.queryForList("select * from sys_role");
		for(Map item:list){
			System.out.println(item.toString());
		}
		
		return findList();
	}

	/**
	 * 获取全部对象,支持排序.
	 */
	public List<T> findAll(Compositor compositor)
	{
		return findList(compositor);
	}

	/**
	 * 分页查询.
	 */
	public PageData<T> find(PageData<T> pageData)
	{
		Assert.notNull(pageData, "pageData不能为空");
		Criteria criteria = HibernateUtils.createCriteria(getSession(), entityClass);
		HibernateUtils.setParameter(criteria, pageData);
		pageData.setResult(criteria.list());
	//	jdbcTemplate.qu
		return pageData;
	}

	/**
	 * 根据分页查询.
	 */               // c.name=:name  and c.password=:password  .setEntity("name")
	public PageData<T> find(String hql, Map<String, ?> values, PageData<T> pageData)  
	{
		Assert.notNull(pageData, "pageData不能为空");
		Query query = HibernateUtils.createQuery(getSession(), hql, values)
									.setFirstResult(pageData.getPagination().getCurrentlyPageFirstResoultIndex())
									.setMaxResults(pageData.getPagination().getPageSize());
		

		pageData.setResult(query.list());
		return pageData;
	}
	
	
	/**
	 * 按id列表获取对象.
	 */
	public List<T> findListByIds(List<String> idList)
	{
		if (idList != null && idList.size() >= 1)
		{
			Criterion criterion = Restrictions.in("id", idList);
			return HibernateUtils.createCriteria(getSession(), entityClass, criterion).list();
		} else
		{
			return null;
		}
	}

	//--------------------------------------------------------------------------------------------------

	/**
	 * 按HQL查询唯一对象.
	 * @param hql "from Users where name=? and password=?"
	 * @param values 数量可变的参数,按顺序绑定.
	 * @return
	 */
	public <X> X find(String hql, Object... values)
	{
		return (X) HibernateUtils.createQuery(getSession(), hql, values).uniqueResult();
	}

	/**
	 * 按HQL查询唯一对象.
	 * @param hql "from Users where name=:name and password=:password"
	 * @param values 命名参数,按名称绑定.
	 * @return
	 */
	public <X> X find(String hql, Map<String, ?> values)
	{
		return (X) HibernateUtils.createQuery(getSession(), hql, values).uniqueResult();
	}

	/**
	 * 按HQL查询对象列表.
	 * @param hql "from Users where name=? and password=?"
	 * @param values 数量可变的参数,按顺序绑定.
	 * @return
	 */
	public <X> List<X> findList(String hql, Object... values)
	{
		return HibernateUtils.createQuery(getSession(), hql, values).list();
	}

	/**
	 * 按HQL查询对象列表.
	 * @param hql "from Users where name=:name and password=:password"
	 * @param values 命名参数,按名称绑定.
	 * @return 
	 */
	public <X> List<X> findList(String hql, Map<String, ?> values)
	{
		return HibernateUtils.createQuery(getSession(), hql, values).list();
	}

	/**
	 * 执行HQL进行批量修改/删除操作.
	 * @return 更新记录数.
	 */
	public int batchExecute(String hql, Object... values)
	{
		return HibernateUtils.createQuery(getSession(), hql, values).executeUpdate();
	}

	/**
	 * 执行HQL进行批量修改/删除操作.
	 * @return 更新记录数.
	 */
	public int batchExecute(String hql, Map<String, ?> values)
	{
		return HibernateUtils.createQuery(getSession(), hql, values).executeUpdate();
	}

	//--------------------------------------------------------------------------------------------------

	/**
	 * 本地SQL查询.
	 * @return 查询List.
	 */
	public List find(String sql)
	{
		Assert.hasText(sql, "sql不能为空");
		return getSession().createSQLQuery(sql).list();
	}
	

	
	
}

分享到:
评论
2 楼 u013810758 2014-11-07  
楼主求帮助类 ReflectionUtils,HibernateUtils   547717007@qq.com
1 楼 rankx 2013-07-04  
你好,楼主可否发一份 ReflectionUtils,HibernateUtils

相关推荐

    basedao_basedao数据库_

    BaseDao是一种设计模式,它通常被用来作为数据库访问对象(DAO)的基础,用于封装数据库的基本CRUD(创建、读取、更新、删除)操作。这种模式可以提高代码复用性,降低业务逻辑与数据访问层的耦合度。 首先,我们来...

    基于hibernate的baseDao

    2. **BaseDAO设计原理** BaseDAO通常包含一组通用的数据库操作方法,如增删改查(CRUD:Create、Read、Update、Delete)。这些方法由继承BaseDAO的子类调用,实现对特定领域对象的操作。这样,每个具体的DAO只需...

    hibernate>>BaseDAO

    `BaseDAO`是许多项目中常见的一种设计模式,它代表了数据访问对象(Data Access Object)的基础类,用于封装对数据库的通用操作。现在我们来深入探讨`hibernate`中的`BaseDAO`及其相关知识点。 首先,DAO设计模式是...

    java泛型BaseDao与BaseService

    这样,每个具体的DAO实现类(如`UserDao extends BaseDao&lt;User&gt;`)就可以操作特定的实体类型,而无需重复编写相同的方法。 BaseService则是业务逻辑层的基类,它处理业务规则和事务管理。同样,我们可以利用泛型将...

    SpringBoot_BaseDao.zip

    在BaseDao中,泛型可以用来定义通用的类型参数,比如,使得BaseDao能够处理任何类型的实体对象,而无需为每种实体创建一个新的DAO类。 反射是Java的一个重要特性,它允许运行时动态地获取类的信息并调用其方法。在...

    dbutils封装ORM 实现BaseDAO

    1. **泛型**: BaseDAO通常会使用泛型来定义与特定实体类的关联,这样在具体使用时可以避免类型转换的麻烦。 2. **基本操作**: 包含CRUD(Create, Read, Update, Delete)等基本数据库操作,如insert、update、...

    Spring声明式事务及BaseDao完整版

    在IT行业中,Spring框架是Java开发中...结合Spring的事务管理和BaseDao设计,可以构建出高效、稳定的Java后端系统。在实际项目中,开发者应根据需求选择合适的事务管理策略和BaseDao实现,以达到最佳的代码结构和性能。

    ssh+baseDao实现分页

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而BaseDao是常用于数据访问层的一个基类设计。本话题主要围绕如何利用SSH框架结合BaseDao实现分页功能来展开。 首先,让我们了解...

    BaseDao的封装

    这些方法的实现可以使用模板方法设计模式,将一部分通用逻辑放在`BaseDao`中,而具体的SQL语句或者HQL(Hibernate Query Language)则由子类提供。 在实际项目中,`BaseDao`的实现往往需要结合事务管理。例如,当一...

    java BaseDao

    在Java编程语言中,BaseDao(基础数据访问对象)是一个常见的设计模式,它为数据库操作提供了一种统一的接口。BaseDao通常包含了CRUD(创建、读取、更新、删除)的基本方法,使得开发者可以方便地对数据库进行操作,...

    企业通用BaseDao方法集

    BaseDao的设计理念是将数据库操作的核心逻辑进行抽象,减少重复代码,使得开发人员可以更专注于业务逻辑的实现。 首先,BaseDao的核心功能之一是提供CRUD(创建、读取、更新、删除)操作。这些基本方法包括: 1. `...

    hibernate BASEDAO

    在Java的持久化框架Hibernate中,BaseDAO(Base Data Access Object)是一种常见的设计模式,用于封装数据库操作,提供一套标准的...理解并熟练运用BaseDAO设计模式,能帮助开发者更好地利用Hibernate进行数据库操作。

    jdbcBaseDao

    学习`jdbcBaseDao`,你需要理解JDBC的工作原理,熟悉SQL语句的编写,同时掌握面向对象设计中的继承概念。实践时,可以创建一个简单的项目,模拟数据库操作,观察`BaseDao`如何简化代码。通过这种方式,你可以更好地...

    SSH集成查询分页处理BaseDao

    在IT行业中,SSH(Struts2、...通过这样的设计,开发者可以在不重复编写相同分页代码的情况下,快速实现分页功能,并且由于SSH框架的集成,使得数据访问和业务逻辑的分离更加清晰,提高了代码的可维护性和扩展性。

    Hibernate底层数据库操作函数BaseDao+具体实例

    这样,我们就可以在子类中重写`BaseDao`的某些方法以实现特定的查询逻辑,或者添加新的方法来满足业务需求。 例如,假设我们有一个`User`实体,我们可以创建如下的`UserDao`: ```java public class UserDao ...

    基于SpringJDBC的BaseDAO

    #### BaseDAO类的设计与实现 在Spring JDBC中,可以通过继承`JdbcDaoSupport`类来简化代码编写过程。下面将详细分析BaseDAO类的实现原理及其核心方法。 #### 核心方法解析 1. **查询方法(query)** - **方法定义**...

    JDBC连接数据库BaseDao通用类(可以调用存储过程)

    这个类是IT领域中处理数据库操作时经常使用的一种设计模式,它通过封装数据库连接、执行SQL语句、处理结果集以及释放资源等逻辑,来提供一个统一的接口,简化了上层业务代码对数据库的操作。 ### JDBC与BaseDao通用...

    BaseDAO.js

    BaseDAO.js是这样一个基础框架,它为开发者提供了一个便捷的起点,用于构建自己的DAO类。本文将深入探讨BaseDAO.js的核心概念、结构以及如何利用它进行实际的数据库操作。 首先,我们需要理解DAO的设计思想。DAO...

    BaseDao代码

    `BaseDao`类就是这样一个通用的DAO实现,它提供了连接数据库、执行SQL语句、关闭资源等基本功能。 #### 1. 获取数据库连接 getConnection() 此方法用于建立与数据库的连接。首先,通过`ConfigManager`实例获取...

    java mysql baseDao

    Java MySQL BaseDAO是一个常见的设计模式,用于简化Java应用程序与MySQL数据库之间的交互。在这个模式中,BaseDAO类作为数据访问对象(DAO)的基类,提供了一些通用的方法,使得子类可以方便地执行CRUD(创建、读取...

Global site tag (gtag.js) - Google Analytics