接口 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層的編寫量。