万能的BaseDao设计

转载出处:https://blog.csdn.net/kdc18333608478/article/details/52895867


 BaseDao设计的初衷是为了方便我们的使用,不用写很多的重复的代码,今天就说说它的设计思路。我们就是要用反射加泛型加面向接口编程来实现,从网上找了一个UML图,我们就用下图用代码大体简单设计一下。代码中我用的是基于Spring中的HibernateTemplate模板。首先要做的是按UML图设计出各个接口和实现类,具体的接口和实现类用代码体现出来。

    可结合着代码和UML图看其中的继承和实现关系的具体实现


    大体按图中的内容写吧,首先定义一个interface BaseDao<T>作为顶层接口

  1. <span style= "font-size:18px;"> package pac2;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. /**
  5. * 接口
  6. * @author admin
  7. */
  8. public interface BaseDao<T>{
  9. //添加
  10. public void add(T t);
  11. //删除
  12. public void delete(T t);
  13. //更新
  14. public void update(T t);
  15. //根据id查询
  16. public T findOne(Serializable id);
  17. //查询所有
  18. public List<T> findAll();
  19. }</span>
     接着再写一个接口实现类,来实现接口中的抽象方法,以便拿来直接调用即可。此实现类相对来说比较难理解,建议结合注释好好分析分析,就肯定能看出其中的巧妙之处的。之后在使用的时候继承该实现类就可以完成基本的增删改查功能了。

  1. p<span style= "font-size:18px;">ackage pac2;
  2. import java.io.Serializable;
  3. import java.lang.reflect.ParameterizedType;
  4. import java.lang.reflect.Type;
  5. import java.util.List;
  6. import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
  7. /**
  8. * 接口实现类
  9. * @author admin
  10. *
  11. */
  12. public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
  13. private Class clazzP;
  14. public BaseDaoImpl(){
  15. //目的:得到实际类型参数
  16. //得到当前运行对象
  17. Class clazz = this.getClass();
  18. //得到当前对象父类的参数化类型,一般使用type子接口ParameterizedType
  19. Type type = clazz.getGenericSuperclass();
  20. ParameterizedType ptype=(ParameterizedType)type;
  21. //得到实际类型参数
  22. Type[] types = ptype.getActualTypeArguments();
  23. Class clazzParameter=(Class)types[ 0];
  24. this.clazzP=clazzParameter;
  25. }
  26. //添加
  27. public void add(T t){
  28. this.getHibernateTemplate().save(t);
  29. }
  30. //删除
  31. public void delete(T t){
  32. this.getHibernateTemplate().delete(t);
  33. }
  34. //更新
  35. public void update(T t){
  36. this.getHibernateTemplate().update(t);
  37. }
  38. //根据id查询
  39. public T findOne(Serializable id){
  40. return (T) this.getHibernateTemplate().get(clazzP, id);
  41. }
  42. //查询所有
  43. public List<T> findAll(){
  44. return (List<T>) this.getHibernateTemplate().find( "from "+clazzP.getSimpleName());
  45. }
  46. }</span>

     因为我们习惯于面向接口编程,所有再有一个Customer模块的接口interface CustomerDao

  1. <span style= "font-size:18px;"> package pac2;
  2. import pac.entity.Customer;
  3. /**
  4. * 面向接口编程
  5. * CustomerDao
  6. * @author admin
  7. *
  8. */
  9. public interface CustomerDao extends BaseDao<Customer> {
  10. }</span>

     最后是Customer模块dao层的具体实现类,继承和实现关系如下代码,

  1. <span style= "font-size:18px;"> package pac2;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. import pac.entity.Customer;
  5. /**
  6. * Customer具体实现类
  7. * 这样就实现了基本的增删改查功能,接口中的功能
  8. * @author admin
  9. *
  10. */
  11. public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
  12. }
  13. </span>

     到此,一个BaseDao就算完成了,我们可以发现最后在dao层的具体实现类中根本不用写代码了(接口中有的方法就不用再写了,一些特殊的查询方法还是要写地....),直接调用就ok了!其它模块也如此,这下就简洁很多了吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值