簡體   English   中英

Java 更好地利用 inheritance 和抽象 class

[英]Java make better use of inheritance and abstract class

我的項目中有以下結構。 我的問題是如何避免向抽象服務添加越來越多的查詢? 隨着我不斷添加模塊,抽象服務中的代碼行將不斷增加,我不希望這樣。

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());
    }

}

第一步,公開兩個受保護的方法:

  • addConditionsToQuery
  • 讀查詢

並閱讀所有“特定於服務”的方法。 抽象的 class 對它的孩子有所了解是沒有意義的。


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,並且您在這里有 spring,它可能不是一個教育項目,所以您可能可以考慮使用 sql 管理庫,如MyBatis ,這可能是一個很好的解決方案,因為它還管理 Z97788240A01041CB030C 中的查詢文件(外部代碼)並提供模板引擎,用於動態 SQL 查詢生成。

我提到 MyBatis 只是因為它在設計概念上與您在問題中提出的內容很接近。 如果您不想處理 Hibernate/JPA/Spring Data(Jooq、jdbi 等),還有其他選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM