接口 BaseRepository 中有一些增删改查的方法。
相当于Dao层的接口了,但是是通过泛型和反射让所有Dao实现类共用这BaseRepository一个接口,不用再像以前一样一个Dao实现类一个接口。
public class RepositorySupport<T> implements BaseRepository<T> {
private SessionFactory sessionFactory;
private Class<T> domainClass;
public Class<T> getDomainClass() {
return domainClass;
}
//注入sessionFactory
@Resource
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
public RepositorySupport() {
domainClass = (Class<T>) ((ParameterizedType) getClass() // Class字节码
.getGenericSuperclass()) // 因为对于T.class我们无法获取,但是这个方法就能获取到父类的参数类型,返回值为ParameterizedType
.getActualTypeArguments()[]; // 数组里第一个就是子类继承父类时所用类型
System.out.println(domainClass);
}
@SuppressWarnings("unchecked")
@Override
public T findOne(Long id) {
return (T) getCurrentSession().get(getDomainClass(), id);
}
//增
@SuppressWarnings("unchecked")
@Override
public T save(T entity) {
if (getCurrentSession().contains(entity)) {
return (T) getCurrentSession().merge(entity);
} else {
getCurrentSession().saveOrUpdate(entity);
getCurrentSession().flush();
}
return entity;
}
//删
@Override
public T delete(T entity) {
getCurrentSession().delete(entity);
return entity;
}
//查
@Override
public T findOne(DetachedCriteria detachedCriteria) {
List<T> list = findAll(detachedCriteria, , );
if(list == null || list.isEmpty()) {
return null;
}
return list.get();
}
//改
@Override
public int executeUpdateSql(String sql, Object...params) {
Query query = getCurrentSession().createSQLQuery(sql);
int i = ;
for(Object param : params) {
query.setParameter(i ++, param);
}
return query.executeUpdate();
}
/*
*省略其他增删改查的方法
*/
}
运用: Dao层的实现,继承BaseRepository,并传入一个 po
@Repository("StudentRepository")
public class StudentRepository extends RepositorySupport<Student>{
public void delete(Student student){
this.delete(student);
}
public SysDataSource searchStudentById(Integer studentId){
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Student.class);
detachedCriteria.add(Restrictions.eq("studentId", studentId));
return this.findOne(detachedCriteria);
}
/*
*省略其他方法
*/
}
这样做的好处是,所有的访问数据层(Dao层)同一个接口,而po的增删改查的方法基本相同,这样大大缩减了对Dao层的编写量。