`

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

相关推荐

    Mybatis通用DAO设计封装(mybatis)

    NULL 博文链接:https://zhaoshijie.iteye.com/blog/2003209

    Java项目开发-第6阶段--模型层设计与实现.pptx

    这样,就可以像操作类一样,来操作数据表。 "图书管理系统"的数据模型需要开发4个实体类,分别为: Borrow类:用于保存、设置、获取借阅信息的属性。 Book类:用于保存、设置、获取图书的属性。 Reader类:用于保存...

    毕业设计-学生宿舍管理系统

    运用springMVC框架,jdbc连接数据库,BaseDao实现生成统一CURD接口

    Java车辆管理

    BaseDao:通过longHaul方法进行数据库的修改,插入 Help:帮助界面的设计 Today:获取当前系统时间并输出 JDBC:数据库驱动 Resultdriver:司机信息查询结果的输出 Resultcarmess:车辆信息查询结果的输出 Resultbusi...

    天下淘网络商城源码

    结合目前网上购物平台系统的设计方案,本项目具有以下特点:界面设计美观大方、操作简单。功能完善、结构清晰。普通用户的购物操作。能够实现后台用户和商品管理。能够实现推荐商品的操作。能够实现后台对用户、订单...

    Student managerment

    a、类的设计 采用DAO模式开发此系统,需要定义如下类 实体类(Student) id name password age description sex 数据库连接和关闭类工具类(BaseDao) DAO接口(StudentDao) DAO实现类(StudentDaoImpl)...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在博客主界面中发表博文时可以选择博文类型,这样可以更好管理自己的博文。并查看和删除网友对自己的博文的一些评论、查看和删除网友留下的一些留言,提供与其他网友交流的空间。更好交流,在信息时代人们通过个人...

    mysql-connector-java-5.0.8-bin.jar

    自己编写的BaseDao,使用反射、线程池等技术,可以直接调用数据库,方便毕业设计.

    初学JAVA-WEB开发的小项目

    在web层和dao层都提取了公共代码封装到BaseAction和BaseDao中,提高了代码的复用,同时按照OO设计原则,针对接口编程,而不是针对实现编程。 使用拦截器的方法对系统权限进行初步控制(后续可以采用Shiro框架进行...

    一套适合初学者的JAVA-WEB开发的小项目

    在web层和dao层都提取了公共代码封装到BaseAction和BaseDao中,提高了代码的复用性,同时遵循OO设计原则,接口是针对编程的,而不是针对实现编程的。 使用拦截器的方法对系统权限进行初步控制(后续可以采用Shiro...

    Java入门级项目云日记(3.29G)

    05_005_云R记_数据库设计.mp4 06_006_云R记_环境搭建.mp4 07_007_云R记_分层思想.mp4 08_008_云R记_获取数据库连接.mp4 09_009_云R记_使用单元测试.mp4 10_010_云R记_使用日志.mp4 11_011_云R记_用户模块_用户登录_...

    酒店管理系统(JAVA+MYSQL)

    集合了酒店管理系统课程设计的文档、代码等,需要用户更改源码的的dao文件夹中BaseDao.java中的MySQL数据库信息--登录名以及密码等

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    如果还看不懂,那么你可以把工程中的“BaseDAO.未完全使用反向的写法”文档替换原来的BaseDAO试看看,我想如果替换之后,你一定能看懂反射的代码了。如果还看不懂????那我也没有办法了^_^ 阅读对象:所有立志...

    SSH集成例子(积分管理,Spring2.5,Struts2,Hibernate3.3)

    Spring2.5,Struts2,Hibernate3.3集成,使用BaseService和BaseDao设计,减少了重复性的工作 如果有问题可以到http://fatkun.com问。。

    02-佟刚书城项目源码

    2. DAO 设计 3. BaseDAO 实现 4. BookDAO 实现 5. 翻页实现 6. 翻页小结 7. 查看图书详细信息 8. 加入购物车 9. 购物车操作 10. Ajax 修改购物车单品数量 11. 简单验证和复杂验证 12. 剩余的 DAO 代码 13. 实现结账...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    2、简单的数据库路由:如果分库结构不是太复杂(比如简单的读写分离、或者多个库集成),BaseDao可以自 动进行路由(比如读写分离,根据业务模式指定读、写库),如果非默认的路由规则,也可以通过手动设置的模式,...

    php设计模式 DAO(数据访问对象模式)

    function BaseDAO($config) { $this-&gt;_db = new MysqlDB(); // 这里的不能进行操作 } /** * 获取处理 * * @param array $filter // 过滤条件 * @param string $field // 获取字段 * @param int $pa

    图书馆借阅管理系统

    ·basedao: 基础数据库操作类——数据库驱动, 查询等操作。 ·BookDao: 图书数据操作类。 ·ReaderDao: 用户数据操作类。 Util包: ·Constant: 系统常量类。 ·DataUtils: 日期工具类。 ·GlobalVar:...

    SSH项目1

    否则只能查看 11) Dao 操作优化 BaseDao.java 所有dao的通用方法,dao都必须继承此类 (反射泛型)实现步骤代码:1) 设计数据库:

    基于JSP+servlet的鲜花销售商城管理系统源码+项目说明.zip

    3. 将项目中src/com/hr/dao/Basedao.java配置文件中的数据库配置改为本人的配置; 4. 运转项目,输入http://localhost:8080/login.jsp 登录 管理员账号/密码:admin/admin 用户账号/密码: user/123456 # 环境需要 ...

Global site tag (gtag.js) - Google Analytics