用于在Java中支持学生关系表上的不同筛选器集的设计模式
我有一个带有模式的SQL表 [学生id、标准、家乡城市、家乡州、国家、科目数量] 现在,我想在此表上支持api端点,如下所示:用于在Java中支持学生关系表上的不同筛选器集的设计模式,java,mysql,design-patterns,querydsl,code-design,Java,Mysql,Design Patterns,Querydsl,Code Design,我有一个带有模式的SQL表 [学生id、标准、家乡城市、家乡州、国家、科目数量] 现在,我想在此表上支持api端点,如下所示: GET /students?home_state=?&country=?&home_city=?&standard=? 所有过滤器都是可选的 现在,我想知道一个适合这个需求的好代码设计。对于技术,我使用Java进行web应用,使用库querydsl进行运行时查询构造 我有一些想法,但我正在寻找一种具体的、可扩展的方法来处理这些情况,所以当添加
GET /students?home_state=?&country=?&home_city=?&standard=?
所有过滤器都是可选的
现在,我想知道一个适合这个需求的好代码设计。对于技术,我使用Java进行web应用,使用库querydsl进行运行时查询构造
我有一些想法,但我正在寻找一种具体的、可扩展的方法来处理这些情况,所以当添加一个新的过滤器列(比如fav_主题)时,应该需要最少的代码更改
对于想法,我正在考虑一个带有方法的过滤器接口
public interface Filter {
// If apiCallParameters contains this filter key, add filter to addToList
void addFilter(Map<String, String> apiCallParameters, List<QueryFilters> addToList);
}
公共接口筛选器{
//如果APICALLPERAMETERS包含此筛选器键,请将筛选器添加到addToList
void addFilter(映射apiCallParameters,列出addToList);
}
所有可能的过滤器都将是一个类,每个类实现这个接口。现在,查询构造类可以有列表
,每个类都有addFilter来决定是否添加此过滤器
我想更好地理解在代码设计中如何处理这种看似非常常见的情况。您描述的api映射到REST接口。如果您正在寻找这种接口,您可以按照以下思路编写:
import org.springframework.stereotype.Service;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Context;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiParam;
@Service
@Path("/students")
public class StudentResource {
@GET
@Produces({MediaType.APPLICATION_JSON})
public JSONObject getStudent(@Context UriInfo uriInfo,
@ApiParam(required = false) @PathParam("home_state")String homeState,
@ApiParam(required = false) @PathParam("home_city")String homeCity,
@ApiParam(required = false) @PathParam("country")String country,
@ApiParam(required = false) @PathParam("standard")String standard)
{
// Do what you will with these strings which may be empty.
JSONObject obj = new JSONObject;
return obj;
}
}
您正在描述的api映射到REST接口。如果您正在寻找这种接口,您可以按照以下思路编写:
import org.springframework.stereotype.Service;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Context;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiParam;
@Service
@Path("/students")
public class StudentResource {
@GET
@Produces({MediaType.APPLICATION_JSON})
public JSONObject getStudent(@Context UriInfo uriInfo,
@ApiParam(required = false) @PathParam("home_state")String homeState,
@ApiParam(required = false) @PathParam("home_city")String homeCity,
@ApiParam(required = false) @PathParam("country")String country,
@ApiParam(required = false) @PathParam("standard")String standard)
{
// Do what you will with these strings which may be empty.
JSONObject obj = new JSONObject;
return obj;
}
}
这就是您编写的api端点,我对这个端点和数据库层之间的故事感兴趣这就是您编写的api端点,我对这个端点和数据库层之间的故事感兴趣