Java更好地利用继承和抽象类

问题描述 投票:0回答:1

我的项目中具有以下结构。 我的问题是如何避免向抽象服务中添加越来越多的查询?随着我不断添加模块,抽象服务中的代码行将继续增加,而我不希望那样做。

public abstract class AbstractService < T, C > implements GenericService < T, C > {

    @Autowired
    private QueryReader queryReader;

    private String readQuery(String query) {
        return queryReader.getPropertyValue(query);
    }

    public String getOrdersQuery(List < Criteria> request) {
        return addConditionsToQuery(getOrdersQuery(), request);
    }

    public String getCustomersQuery(List < Criteria> request) {
        return addConditionsToQuery(getCustomersQuery(), request);
    }

    private String addConditionsToQuery(String sql, List < Criteria> conditions) {
        return QueryHelper.addConditionsToQuery(conditions, sql);
    }


    private String getOrdersQuery() {
        return readQuery("queries.orders.retrieve");
    }

    private String getCustomersQuery() {
        return readQuery("queries.customers.retrieve");
    }

    public String updateCustomerQuery() {
        return readQuery("queries.customer.update");
    }

}

通用服务就是这样-

public interface GenericService<T,C> {

    void update(T t);

    void create(T t);

    T search(C t);
}

这是我的订单服务-

@Service
public class OrderService extends AbstractService<OrderModel, List<Criteria>> {

    @Autowired
    private OrderRepository orderRepository;

    @Override
    public OrderModel search(List<Criteria> request) {
        String query = getOrdersQuery(request);
        List<OrderEntity> orderEntities = orderRepository.findByQuery(query);
        // entity dto conversion and so on
        // ....
        return orderModel;

    }
}

这是我的客户服务-

@Service
public class CustomerService extends AbstractService < CustomerModel, List < Criteria >> {

    @Autowired
    private CustomerRepository customerRepository;

    @Override
    public CustomerModel search(List < Criteria > request) {
        String query = getCustomersQuery(request);
        List < CustomerEntity > customerEntities = customerRepository.findByQuery(request);
        // entity dto conversion and so on
        // ....
        return customerModel;

    }

    @Transactional
    @Override
    public void update(CustomerModel request) {
        // dto to entity conversion
        // .....
        // update entity with new values 
        customerRepository.update(orderEntity, updateCustomerQuery());
    }

}
java oop inheritance interface abstract-class
1个回答
1
投票

第一步,公开两个受保护的方法:

  • addConditionsToQuery
  • readQuery

并阅读所有“特定于服务”的方法。抽象类对子类有所了解是没有意义的。


public abstract class AbstractService < T, C > implements GenericService < T, C > {

    @Autowired
    private QueryReader queryReader;

    protected String readQuery(String query) {
        return queryReader.getPropertyValue(query);
    }

    protected String addConditionsToQuery(String sql, List < Criteria> conditions) {
        return QueryHelper.addConditionsToQuery(conditions, sql);
    }
}

例如,OrdersService现在应该知道应该从哪里解析其查询

@Service
public class OrderService extends AbstractService<OrderModel, List<Criteria>> {

    @Autowired
    private OrderRepository orderRepository;

    @Override
    public OrderModel search(List<Criteria> request) {
        String sql = readQuery("queries.orders.retrieve"); 
        String query = addConditionsToQuery(sql, request);
        List<OrderEntity> orderEntities = orderRepository.findByQuery(query);
        // entity dto conversion and so on
        // ....
        return orderModel;

    }
}

仅此一个即可直接回答您的问题。

全部,因为我们正在谈论SQL,而您在这里已经有了春天,它可能不是一个教育性的项目,所以您可能可以考虑使用像MyBatis这样的SQL管理库,因为这可能也是一个很好的解决方案管理文件中的SQL查询(在代码外部),并提供用于动态SQL查询Generation的模板引擎。

我之所以提到MyBatis,只是因为它在设计概念上与您在问题中所介绍的很接近。如果您不想处理Hibernate / JPA / Spring数据,则还有其他选择(Jooq,jdbi仅举几例)。

© www.soinside.com 2019 - 2024. All rights reserved.