对于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了 如果你有和其他不一样的只需像我这样加上就行