这里我们新建一个BaseDao,让普通Dao(如:UserDao)继承它,这样普通Dao什么都不写就可以自动实现基本的增删改查操作,也可以在UserDao中扩建方法...
BaseDao.java:
package com.kaishengit.dao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.kaishengit.util.ReflectUtil;
public class BaseDao<T,PK extends Serializable> {
private SessionFactory sessionFactory;
//Class<?>:防止报黄线,意思是传入任意类型都行,无所谓,也可以使用Object
private Class<?> entityClass;
public BaseDao(){
//new出一个子类对象,父类中的this是子类中的this
entityClass = ReflectUtil.getGenericParameterType(this.getClass());
}
public void saveOrUpdate(T t){
getSession().saveOrUpdate(t);
}
public void del(PK pk){
getSession().delete(findById(pk));
}
public void del(T t){
getSession().delete(t);
}
@SuppressWarnings("unchecked")
public T findById(PK pk){
return (T) getSession().get(entityClass, pk);
}
@SuppressWarnings("unchecked")
public List<T> findAll(){
Criteria criteria = getSession().createCriteria(entityClass);
return criteria.list();
}
@SuppressWarnings("unchecked")
public List<T> findByPage(int start,int count){
Criteria criteria = getSession().createCriteria(entityClass);
criteria.setFirstResult(start);
criteria.setMaxResults(count);
return criteria.list();
}
//get
public Session getSession(){
return sessionFactory.getCurrentSession();
}
//set
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
}
这里面我用到自己写的一个工具类,通过反射实现返回的实际参数化类型T
package com.kaishengit.util;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class ReflectUtil {
public static Class<?> getGenericParameterType(Class<?> clazz){
//返回表示此Class所表示的实体(类、接口、基本类型或 void)的直接超类的Type。如果超类是参数化类型,则返回的Type对象必须准确反映源代码中所使用的实际类型参数。
Type type = clazz.getGenericSuperclass();
//强制转化为参数化类型:Collection<String>
ParameterizedType pt = (ParameterizedType) type;
//返回表示此类型的实际类型参数的 Type 对象的数组。
Type[] types = pt.getActualTypeArguments();
return (Class<?>) types[0];
}
}
这样就ok啦,我们新建一个UserDao继承它,这样UserDao就自动拥有了增删改查功能,是不是很令人兴奋呀,里面又扩建了一个方法
package com.kaishengit.dao;
import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import com.kaishengit.pojo.User;
@Repository
public class UserDao extends BaseDao<User,Integer>{
public User findByNameAndPassword(User user){
String hql = "from User where username = ? and password = ?";
Query query = getSession().createQuery(hql);
query.setParameter(0, user.getUsername());
query.setParameter(1, user.getPassword());
return (User) query.uniqueResult();
}
}