对于BaseDao 大家可能还不是很了解 我这样解释 你做一个项目无非就是对数据的增删查改,假设一个CRM系统你有很多部门啊之类的模块 持久层的代码相似度达到百分之八十左右 不同的是你的类名和PO类(也就是domain里的类) 那我们把它抽取出来共同使用
首先我们需要创建一个接口 除了表现层的类不要接口其他劲量写一个接口 先看代码 下面解释
接口
public interface IBaseDao<T> {
public void save(T t);
public void delete(T t);
public void update(T t);
public T findById(Serializable id);
public List<T> findAll();
}实现类
private Class<?> TClass;
@Resource
public void setMySessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
public BaseDaoImpl() {
ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
TClass = (Class<?>) parameterizedType.getActualTypeArguments()[0];
}
@Override
public void save(T t) {
this.getHibernateTemplate().save(t);
}
@Override
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}
@Override
public T findById(Serializable id) {
return (T) this.getHibernateTemplate().get(TClass, id);
}
@Override
public List<T> findAll() {
String hql = "FROM " + TClass.getSimpleName();
return this.getHibernateTemplate().find(hql);
}
我相信大部分人看不懂
ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
TClass = (Class<?>) parameterizedType.getActualTypeArguments()[0];
这段代码
我们为什么这样写 因为我们使用的是泛型 导致它没有固定的参数 所以我们需要从子类中获取 就是继承它的类获取 比如UserDaoImpl继承它 那我们的T就是User
之后我们在得到实际类型参数赋值给我们的TClass 这样我们就得到了
同时使用注解开发sessionFactory它是需要自己去注入的 以前我们使用配置方式的时候只需要在spring文件里配置好 就行 但注解需要手动注入进来
使用方式
public class UserDaoImpl extends BaseDaoImpl<User> implements IUserDao {
@Override
public User findByUsernameAndPassword(String username, String password) {
String hql = "FROM User u WHERE u.password = ? AND u.username = ?";
List<User> list = this.getHibernateTemplate().find(hql,password,username);
if(!list.isEmpty() && list.size()>0){
return list.get(0);
}
return null;
}这样就ok了 如果你有和其他不一样的只需像我这样加上就行

本文介绍了一种通用的BaseDao设计思路,通过泛型技术实现了数据的增删查改等基本操作,有效减少了代码重复,并提供了具体的接口定义及实现类示例。
404

被折叠的 条评论
为什么被折叠?



