BaseDao接口方法抽取
一、问题:
通常来说一个项目中,我们会使用到多个Dao,例如一个学生管理系统,可能就包含AdminDao,StudentDao等模块,每个Dao都有相同的增删改查代码,每个Dao去写也是可以的,不过代码量就会偏多。
二、解决方案:
实际上我们可以通过泛型,来抽取出一个BaseDao,这个BaseDao包含了各个Dao常用的增删改查代码,创建新的Dao时,继承BaseDao,就可以少写很多重复代码。
三、原理图
![BaseDao原理](https://i-blog.csdnimg.cn/blog_migrate/382a50a79d08b8ef85c50b4175f20366.jpeg#pic_center)
四、代码实例
4-1、Jdbc版的
**由于jdbc依赖sql语句,所以只能集成BaseDao接口**
BaseDao
public interface BaseDao<T> {
public Boolean save(T t);
public Boolean delete(T t);
public Boolean delete(Serializable id);
public Boolean update(T t);
public T findById(Serializable id);
public List<T> findAll();
}
如何使用
代码
public interface UserDao extends BaseDao<Users> {
}
图解
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ac90a842f52b3d13130be6a2be1b71d6.png#pic_center)
**这样UserDao就有BaseDao的所有方法了**
4-2、Hibernate版的
Hibernate依赖java类获得mysql的数据,所以可以即集成BaseDao<T>,又可以集成BaseDaoImpl<T>
BaseDao
public interface BaseDao<T> {
void saveOrUpdate(T t);
void save(T t);
void delete(T t);
void delete(Serializable id);
void update(T t);
T getById(Serializable id);
Integer getTotalCount(DetachedCriteria dc);
List<T> getAllList();
List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize);
void batchAdd(List<T> list);
}
BaseDaoImpl
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
private Class clazz;
public BaseDaoImpl() {
ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass();
clazz = (Class) ptClass.getActualTypeArguments()[0];
}
@Override
public void save(T t) {
getHibernateTemplate().save(t);
}
@Override
public void delete(T t) {
getHibernateTemplate().delete(t);
}
@Override
public void delete(Serializable id) {
T t = this.getById(id);
getHibernateTemplate().delete(t);
}
@Override
public void update(T t) {
getHibernateTemplate().update(t);
}
@SuppressWarnings("unchecked")
@Override
public T getById(Serializable id) {
return (T) getHibernateTemplate().get(clazz, id);
}
@SuppressWarnings("unchecked")
@Override
public Integer getTotalCount(DetachedCriteria dc) {
dc.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
dc.setProjection(null);
if (list != null && list.size() > 0) {
Long count = list.get(0);
return count.intValue();
} else {
return null;
}
}
@SuppressWarnings("unchecked")
@Override
public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {
List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
return list;
}
@Override
public void saveOrUpdate(T t) {
getHibernateTemplate().saveOrUpdate(t);
}
@Override
public void batchAdd(List<T> list) {
}
@Override
public List<T> getAllList() {
@SuppressWarnings("unchecked")
List<T> list = (List<T>) getHibernateTemplate().loadAll(clazz);
return list;
}
}
如何使用
代码
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
@Override
public User getOneUserByUnamePwd(String uName, String pwd) {
return getHibernateTemplate().execute(new HibernateCallback<User>() {
@Override
public User doInHibernate(Session session) throws HibernateException {
String hql = "from User where userName = ? and passWord = ? ";
Query query = session.createQuery(hql);
query.setParameter(0, uName);
query.setParameter(1, pwd);
User user = (User) query.uniqueResult();
return user;
}
});
}
@Override
public User getOneUserByUname(String uName) {
return getHibernateTemplate().execute(new HibernateCallback<User>() {
@Override
public User doInHibernate(Session session) throws HibernateException {
String hql = "from User where userName = ? ";
Query query = session.createQuery(hql);
query.setParameter(0, uName);
User user = (User) query.uniqueResult();
return user;
}
});
}
}
这样一个简单的BaseDao接口方法的抽取,就解决了代码冗余的问题,大大减少了代码的编写量,给我们的编程工作节省了很多时间!
五、总结
这种方法很好,也适用于mybatis,但是mybatis是写SQL语句的,所以建议使用我上面的的JDBC版本的。写代码的时候是有点枯燥的,我们要尽量减少重复!