Javaee Dao层抽取详解:提高代码复用与效率

0 下载量 185 浏览量 更新于2024-09-01 收藏 75KB PDF 举报
"本文将深入解析Javaee Dao层的抽取过程,旨在提高代码复用性和可维护性。首先,我们来看在项目开发中,特别是在处理大量相似的增删改查操作时,如何通过抽离BaseDao来简化代码结构。在讲解之前,我们先回顾一下提取前的两个关键类:LinkManDao接口和其对应的LinkManDaoImpl实现。 LinkManDao接口定义了如下的CRUD操作方法: 1. `findCount(DetachedCriteria detachedCriteria)`: 用于查询LinkMan对象的数量,通过DetachedCriteria进行条件过滤。 2. `findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize)`: 分页查询LinkMan对象,根据起始位置和页面大小获取数据。 3. `save(LinkMan linkMan)`: 保存一个新的LinkMan对象到数据库。 4. `findById(Long lkm_id)`: 根据ID获取单个LinkMan对象。 5. `update(LinkMan linkMan)`: 更新已有LinkMan对象的属性。 6. `delete(LinkMan linkMan)`: 删除指定的LinkMan对象。 在LinkManDaoImpl类中,这些方法的具体实现主要依赖于HibernateTemplate,如`findByCriteria`方法用于执行SQL查询。 提取BaseDao层的目的在于减少重复的数据库操作代码,提高代码的模块化程度。我们将共性的数据库操作抽象到BaseDao接口,例如: ```java public interface BaseDao<T> { int save(T entity); T findById(Object id); void update(T entity); void delete(T entity); int countByCriteria(Criteria criteria); List<T> findByPage(Criteria criteria, int startIndex, int pageSize); } ``` 在这个BaseDao接口中,我们定义了一些通用的方法,如`save`、`findById`、`update`、`delete`以及基于Criteria的查询方法。然后,LinkManDao可以继承这个BaseDao,并根据具体业务需求重写或者扩展必要的方法。 例如,LinkManDao可以通过以下方式实现: ```java public interface LinkManDao extends BaseDao<LinkMan> { Integer findCount(DetachedCriteria detachedCriteria); } ``` 在实际的LinkManDaoImpl中,我们可以这样实现: ```java @Repository public class LinkManDaoImpl extends BaseDaoImpl<LinkMan> implements LinkManDao { @Autowired private SessionFactory sessionFactory; // 重写或扩展BaseDao中的方法,利用Hibernate的Criteria API @Override public Integer findCount(DetachedCriteria detachedCriteria) { Criteria criteria = createDetachedCriteriaFromDetachedCriteria(detachedCriteria); return criteria.setProjection(Projections.rowCount()).uniqueResult().intValue(); } private Criteria createDetachedCriteriaFromDetachedCriteria(DetachedCriteria detachedCriteria) { Criteria criteria = sessionFactory.createCriteria(LinkMan.class); criteria.createAlias("commonField", "cf", JoinType.LEFT_OUTER_JOIN); // 示例:关联其他表 criteria.add(detachedCriteria); return criteria; } } ``` 通过这种方式,我们把大部分数据库操作的逻辑抽象到了BaseDao,使得LinkManDao更专注于业务逻辑,提高了代码的可读性和维护性。同时,如果未来有其他类似的实体需要处理相同类型的数据库操作,可以直接继承BaseDao,无需重复编写大量相似的代码。"