資料庫中的資料:https://blog.csdn.net/qq_26896085/article/details/104843889
mapper包下
EmployeeMapper.java
這裡使用了Mybatis-plus,如果隻是對單表進行查詢,接口繼承BaseMapper即可
package com.woodie.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.woodie.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
// 這裡通過想在.xml檔案中寫sql語句的方式查詢資料則必須使用@Mapper注解
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
// 這個接口繼承了BaseMapper,則其包含了mybatis-plus定義的方法
// 通過在xml中寫sql,通過這裡的方法查詢資料
Employee queryById();
}
實體類
Employee .java
package com.woodie.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@TableName("employees")
public class Employee {
// 指定表的id
// 通過type = IdType.AUTO設定id的自動增長, 由于表employees沒有設定id為自動增長,是以這裡不能設定這個參數,否則報錯
//@TableId(value = "emp_no", type = IdType.AUTO)
@TableId(value = "emp_no")
Integer empNo;
Date birthDate;
String firstName;
String lastName;
Date hireDate;
String gender;
}
Pagination.java
用于存放 分頁時的資料的總條數,目前頁面,目前頁面的資料條數,總頁
package com.woodie.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Pagination {
Long current;
Long pageSize;
Long total;
Long totalPage;
}
TableResult.java
用于存放傳回資料
package com.woodie.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TableResult<T> {
List<T> list;
Pagination pagination;
}
EmployeeServiceImpl .java
用于查詢資料庫
package com.woodie.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.woodie.dao.EmployeeDao;
import com.woodie.entity.Employee;
import com.woodie.mapper.EmployeeMapper;
import com.woodie.service.EmployeeService;
import com.woodie.vo.Pagination;
import com.woodie.vo.TableResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
@Override
public Employee queryById(int id) {
// return employeeMapper.queryById();
return employeeMapper.selectById(id);
}
@Override
public TableResult<Employee> queryListByPage(int page, int size) {
Page employeePage = new Page(page, size);
IPage<Employee> iPage = this.employeeMapper.selectPage(employeePage, null);
Pagination pagination = Pagination.builder().current(iPage.getCurrent()).pageSize(iPage.getSize()).total(iPage.getTotal()).totalPage(iPage.getPages()).build();
List<Employee> list = iPage.getRecords();
TableResult<Employee> tableResult = new TableResult<>();
tableResult.setList(list);
tableResult.setPagination(pagination);
return tableResult;
}
}
DateScalarType.java
這個類用于自定義graphql查詢的标量,自定義的标量為Date,用于處理資料中的日期資料
package com.woodie.modifyoriginal;
import graphql.schema.*;
import java.text.SimpleDateFormat;
import java.util.Date;
// 需要繼承GraphQLScalarType
public class DateScalarType extends GraphQLScalarType {
public DateScalarType() {
super("Date", "Date value", new Coercing<String, String>() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String serialize(Object input) {
return sdf.format(input);
}
public String parseValue(Object input) {
return this.serialize(sdf.format(input));
}
public String parseLiteral(Object input) {
if (!(input instanceof Date)) {
throw new CoercingParseLiteralException("Expected AST type 'Date' but was ");
} else {
return sdf.format(input);
}
}
});
}
}
GraphQLProvider.java
用于提供graphql支援
package com.woodie.graphql;
import com.woodie.modifyoriginal.DateScalarType;
import graphql.GraphQL;
import graphql.Scalars;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.RuntimeWiring;
import graphql.schema.idl.SchemaGenerator;
import graphql.schema.idl.SchemaParser;
import graphql.schema.idl.TypeDefinitionRegistry;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
/**
* 實作的功能:将Graphql對象載入到Spring容器,并完成GraphQL對象的初始化功能
*/
@Component
public class GraphQLProvider {
private GraphQL graphQL;
@Autowired
private List<MyDataFetcher> myDataFetchers;
// 實作對graphql對象的初始化
@PostConstruct
public void init() throws Exception {
try {
InputStream inputStream = GraphQLProvider.class.getClassLoader().getResourceAsStream("employee.graphqls");
String content = IOUtils.toString(inputStream, "UTF-8");
this.graphQL = GraphQL.newGraphQL(buildGraphQLSchema(content)).build();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private GraphQLSchema buildGraphQLSchema(String content){
TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(content);
return new SchemaGenerator().makeExecutableSchema(typeRegistry,buildWiring());
}
private RuntimeWiring buildWiring(){
return RuntimeWiring.newRuntimeWiring()
.type("EmployeeQuery", builder -> {
for (MyDataFetcher myDataFetcher : myDataFetchers) {
builder.dataFetcher(myDataFetcher.filedName(), environment -> myDataFetcher.dataFetcher(environment));
}
return builder;
}
)
.scalar(new DateScalarType())
.build();
}
@Bean
public GraphQL graphQL(){
return this.graphQL;
}
}
MyDataFetcher.java
用于提供資料fileName, environment,當有新的查詢時,實作這個接口即可,而不需要更改GraphQLProvider.java中的代碼
package com.woodie.graphql;
import graphql.schema.DataFetchingEnvironment;
public interface MyDataFetcher {
/**
* GraphQL中查詢的名稱, 對應下面的employee
*
* type EmployeeQuery {
* employee(empNo:Int) : Employee
* }
* @return
*/
String filedName();
/**
* 資料的查詢
* @param environment
* @return
*/
Object dataFetcher(DataFetchingEnvironment environment);
}
EmployeeListPageGraphQL.java
用于批量查詢employee中的資料, 并進行分頁
package com.woodie.graphql;
import com.woodie.service.EmployeeService;
import graphql.schema.DataFetchingEnvironment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class EmployeeListPageGraphQL implements MyDataFetcher{
@Autowired
EmployeeService employeeService;
@Override
public String filedName() {
return "employeeListPage";
}
@Override
public Object dataFetcher(DataFetchingEnvironment environment) {
Integer page = environment.getArgument("page");
Integer size = environment.getArgument("size");
if (null == page) {
page = 1;
}
if (null == size) {
size = 10;
}
return this.employeeService.queryListByPage(page, size);
}
}
EmployeeGraphQL.java
通過id進行查詢employee中的單條資料
package com.woodie.graphql;
import com.woodie.service.EmployeeService;
import graphql.schema.DataFetchingEnvironment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class EmployeeGraphQL implements MyDataFetcher{
@Autowired
EmployeeService employeeService;
@Override
public String filedName() {
return "employee";
}
@Override
public Object dataFetcher(DataFetchingEnvironment environment) {
Integer id = environment.getArgument("empNo");
return this.employeeService.queryById(id);
}
}
EmployeeController.java
這裡支援get,post兩種請求,并支援graphql動态傳參
package com.woodie.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import graphql.ExecutionInput;
import graphql.GraphQL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@RequestMapping("employee")
@Controller
public class EmployeeController {
@Autowired
private GraphQL graphQL;
/**
* graphql 查詢的實作
* @param query
* @return
*/
@GetMapping
@ResponseBody
public Map<String, Object> query(@RequestParam("query")String query,
@RequestParam(value = "variables", required = false) String variables,
@RequestParam(value = "operationName", required = false) String operationName){
Map<String, Object> variablesMap = new HashMap<>();
if (StringUtils.isNotEmpty(variables)) {
JSONObject json = JSON.parseObject(variables);
for (String key : json.keySet()) {
variablesMap.put(key, json.get(key));
}
}
return getStringObjectMap(query, variablesMap, operationName);
}
@PostMapping
@ResponseBody
public Map<String, Object> postQuery(@RequestBody Map<String, Object> param){
String query = (String) param.get("query");
String operationName = (String) param.get("operationName");
Map variablesMap = (Map) param.get("variables");
return getStringObjectMap(query, variablesMap, operationName);
}
private Map<String, Object> getStringObjectMap(String query, Map variablesMap, String operationName) {
// 檢視源碼,點選下面的graphQL.execute
// ExecutionResult result = graphQL.execute(query);
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
.query(query)
.variables(variablesMap)
.operationName(operationName)
.build();
return this.graphQL.execute(executionInput).toSpecification();
}
}
employee.graphql配置檔案
scalar Date
scalar Long
schema {
query: EmployeeQuery
}
type EmployeeQuery {
employee(empNo:Int) : Employee
employeeListPage(page: Int, size: Int): TableResult
}
type Employee {
empNo: Int
birthDate: Date
firstName: String
lastName: String
hireDate: Date
gender: String
}
type TableResult {
list: [Employee]
pagination: Pagination
}
type Pagination {
current: Long
pageSize: Long
total: Long
totalPage: Long
}
啟動類
package com.woodie;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
//@MapperScan("com.woodie.mapper")
public class SpringBootStart {
/**
* 使用mybatisplus的分頁插件,
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
public static void main(String[] args) {
SpringApplication.run(SpringBootStart.class, args);
}
}
測試
1、post請求,參數寫死,分頁查詢employee的list
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxcGRNJzaE9kMJpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwkzM0ADN0cTM1EzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2、post請求,動态傳參,分頁查詢employee的list
3、get請求,參數寫死,根據id進行查詢資訊
4、get請求,動态傳參, 根據id進行查詢資訊