BaseDao接口方法抽取

BaseDao接口方法抽取

一、问题:

  通常来说一个项目中,我们会使用到多个Dao,例如一个学生管理系统,可能就包含AdminDao,StudentDao等模块,每个Dao都有相同的增删改查代码,每个Dao去写也是可以的,不过代码量就会偏多。

二、解决方案:

  实际上我们可以通过泛型,来抽取出一个BaseDao,这个BaseDao包含了各个Dao常用的增删改查代码,创建新的Dao时,继承BaseDao,就可以少写很多重复代码。

三、原理图

BaseDao原理

四、代码实例

4-1、Jdbc版的

**由于jdbc依赖sql语句,所以只能集成BaseDao接口**
BaseDao
// An highlighted block
/**
 * 
 * @ClassName: BaseDao
 * @Description: dao层的公共基本接口
 * @author: JYT
 * @date: 2019年9月4日 下午9:35:57
 * @param <T>
 */
public interface BaseDao<T> {
	/**
	 * 
	 * @Title: save
	 * @Description: 添加
	 * @param t
	 * @return Boolean
	 * @author JYT
	 * @date 2019年9月5日下午7:32:17
	 */
	public Boolean save(T t);

	/**
	 * 
	 * @Title: delete
	 * @Description: 删除
	 * @param t
	 * @return Boolean
	 * @author JYT
	 * @date 2019年9月5日下午7:32:21
	 */
	public Boolean delete(T t);

	/**
	 * 
	 * @Title: delete
	 * @Description: 根据主键id删除
	 * @param id
	 * @return Boolean
	 * @author JYT
	 * @date 2019年9月5日下午7:32:24
	 */
	public Boolean delete(Serializable id);

	/**
	 * 
	 * @Title: update
	 * @Description: 更新
	 * @param t
	 * @return Boolean
	 * @author JYT
	 * @date 2019年9月5日下午7:32:27
	 */
	public Boolean update(T t);

	/**
	 * 
	 * @Title: findById
	 * @Description: 根据主键id得到一个对象
	 * @param id
	 * @return T
	 * @author JYT
	 * @date 2019年9月5日下午7:32:30
	 */
	public T findById(Serializable id);

	/**
	 * 
	 * @Title: findAll
	 * @Description: 查询获得所有数据,封装到对象集合中
	 * @return List<T>
	 * @author JYT
	 * @date 2019年9月5日下午7:32:35
	 */
	public List<T> findAll();
}
如何使用
代码

public interface UserDao extends BaseDao<Users> {

}
图解

在这里插入图片描述

 **这样UserDao就有BaseDao的所有方法了**

4-2、Hibernate版的

Hibernate依赖java类获得mysql的数据,所以可以即集成BaseDao<T>,又可以集成BaseDaoImpl<T>  
BaseDao
// An highlighted block
/**
* 
* @ClassName: BaseDao
* @Description: 使用泛型制作的基本baseDao,封装了增删改查等一系列方法
* @author: JYT
* @date: 2019年4月21日 下午7:25:51
* @param <T>
*/
public interface BaseDao<T> {
  // 增或修改
  void saveOrUpdate(T t);

  // 增
  void save(T t);

  // 删
  void delete(T t);

  // 删(根据id删除)
  void delete(Serializable id);

  // 改
  void update(T t);

  // 查 根据id查询
  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;
	}

}
如何使用
代码
/**
 * 
 * @ClassName: UserDaoImpl
 * @Description: TODO
 * @author: JYT
 * @date: 2019年4月21日 下午7:49:27
 */
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {

	@Override
	public User getOneUserByUnamePwd(String uName, String pwd) {
		// hql查询
		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);
				// 如果查询返回多个值用list()方法
				// 当确定返回的实例只有一个或者null时 用uniqueResult()方法
				User user = (User) query.uniqueResult();
				return user;
			}
		});
	}

	@Override
	public User getOneUserByUname(String uName) {
		// hql查询
		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);
				// 如果查询返回多个值用list()方法
				// 当确定返回的实例只有一个或者null时 用uniqueResult()方法
				User user = (User) query.uniqueResult();
				return user;
			}
		});
	}

}
这样一个简单的BaseDao接口方法的抽取,就解决了代码冗余的问题,大大减少了代码的编写量,给我们的编程工作节省了很多时间!

五、总结

这种方法很好,也适用于mybatis,但是mybatis是写SQL语句的,所以建议使用我上面的的JDBC版本的。写代码的时候是有点枯燥的,我们要尽量减少重复!
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值