从0开始学习ssh之basedao
用于所有dao里边会有许多相同的方法,例如save,update等等。应此设计一个basedao,所有dao都继承它。这样可以省去许多工作量。
basedao如下
package cn.itcast.oa.base; import java.util.List; public interface BaseDao<T> { /** * 保存实体 * * @param entity */ void save(T entity); /** * 删除实体 * * @param id */ void delete(Long id); /** * 更新实体 * * @param entity */ void update(T entity); /** * 按id查询 * * @param id * @return */ T getById(Long id); /** * 按id查询 * * @param ids * @return */ List<T> getByIds(Long[] ids); /** * 查询所有 * * @return */ List<T> findAll(); }
basedaoimpl如下
package cn.itcast.oa.base; import java.lang.reflect.ParameterizedType; import java.util.List; import javax.annotation.Resource; import org.hibernate.Session; import org.hibernate.SessionFactory; @SuppressWarnings("unchecked") public abstract class BaseDaoImpl<T> implements BaseDao<T> { @Resource private SessionFactory sessionFactory; private Class<T> clazz; public BaseDaoImpl() { // 使用反射技术得到T的真实类型 ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型 this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型 System.out.println("clazz ---> " + clazz); } /** * 获取当前可用的Session * * @return */ protected Session getSession() { return sessionFactory.getCurrentSession(); } public void save(T entity) { getSession().save(entity); } public void update(T entity) { getSession().update(entity); } public void delete(Long id) { Object obj = getById(id); if (obj != null) { getSession().delete(obj); } } public T getById(Long id) { return (T) getSession().get(clazz, id); } public List<T> getByIds(Long[] ids) { return getSession().createQuery(// "FROM User WHERE id IN (:ids)")// .setParameterList("ids", ids)// .list(); } public List<T> findAll() { return getSession().createQuery(// "FROM " + clazz.getSimpleName())// .list(); } }