SSH中baseDao的写法

1 篇文章 0 订阅
1 篇文章 0 订阅

BaseDao接口:抽取常用的方法

package com.oa.base;

import java.util.List;

public interface BaseDao<T> {
	
	/**
	 * 保存实体
	 * @param entity
	 */
	void save(T entity);
	
	/**
	 * 删除实体
	 * @param id
	 */
	void delete(Integer id);
	
	/**
	 * 更新实体
	 * @param entity
	 */
	void update(T entity);
	
	/**
	 * 按id查询
	 * @param id
	 * @return
	 */
	T getById(Integer id);
	
	/**
	 * 按id查询
	 * @param ids
	 * @return
	 */
	List<T> getByIds(Integer...ids);
	
	/**
	 * 查询所有
	 * @return
	 */
	List<T> findAll();
}

BaseDao的实现类BaseDaoImpl:

package com.oa.base;

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

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class BaseDaoImpl<T> implements BaseDao<T> {

	// 从容器中注入sessionFactory
	@Resource
	private SessionFactory sessionFactory;

	private Class<T> clazz; // 怎样获取T的类型clazz呢? 在构造器中利用反射

	public BaseDaoImpl() {
		// 使用反射得到T的真实类型

		// 获取当前new的对象的泛型父类的类型
		ParameterizedType pt = (ParameterizedType) this.getClass()
				.getGenericSuperclass();
		// 获取第一个类型参数的真实类型
		this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
		System.out.println("clazz--->" + clazz);
		// 第一个this代表BaseDaoImpl的子类,第二个this代表BaseDaoImpl
	}

	/**
	 * 获取当前的可用session对象
	 * 
	 * @return
	 */
	protected Session getSession() {
		return sessionFactory.getCurrentSession();
	}

	@Override
	public void save(T entity) {
		getSession().save(entity);
	}

	@Override
	public void delete(Integer id) {
		Object obj = getById(id);
		if (obj != null) {
			getSession().delete(obj);
		}
	}

	@Override
	public void update(T entity) {
		getSession().update(entity);
	}

	@Override
	public T getById(Integer id) {

		return (T) getSession().get(clazz, id);
	}

	@Override
	public List<T> getByIds(Integer... ids) {
		return getSession().createQuery( //
				"FROM " + clazz.getSimpleName() + " WHERE id IN (:ids)") //
				.setParameterList("ids", ids) // 将(:id)变成集合
				.list();
	}

	@Override
	public List<T> findAll() {
		return getSession().createQuery( //
				"FROM " + clazz.getSimpleName()) //
				.list();
	}

}

UML类图:User和Role为2个实体类,在BaseDao中写所有Dao的共有方法,在BaseDaoImpl中实现BaseDao接口的方法,子类需要继承BaseDaoImpl即可。

                   在XXXDao中定义XXX所需要的特有方法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值