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所需要的特有方法。