[英]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());
}
}
第一步,公开两个受保护的方法:
并阅读所有“特定于服务”的方法。 抽象的 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.