本文目录导读:

看两队历史交锋记录,在Java中并没有一个“内置”的API,因为足球/篮球等体育数据本身是外部数据,需要你对接数据源(如API、数据库、爬虫)。
不过在项目中,通常是通过代码逻辑来实现“查询”这个动作,下面按数据来源分三种最常见的情况,附上可运行的Java核心代码示例:
数据存储在 MySQL 等关系型数据库(最常见)
假设你有两张表:team(球队表)和 match(比赛表),match 表有 home_team_id 和 away_team_id 关联球队。
核心SQL查询逻辑: 要查询“A队”和“B队”的历史交锋,核心SQL是找出所有包含这两队的比赛。
Java代码示例(使用 MyBatis-Plus 或 JPA):
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class MatchHistoryServiceImpl {
@Resource
private MatchMapper matchMapper;
/**
* 查询两队历史交锋记录
* @param teamAId 球队A的ID
* @param teamBId 球队B的ID
* @return 交锋的比赛列表
*/
public List<Match> getHeadToHead(Long teamAId, Long teamBId) {
LambdaQueryWrapper<Match> wrapper = new LambdaQueryWrapper<>();
// 核心条件: (主队是A且客队是B) OR (主队是B且客队是A)
wrapper.and(w -> w
.and(w1 -> w1.eq(Match::getHomeTeamId, teamAId).eq(Match::getAwayTeamId, teamBId))
.or()
.and(w2 -> w2.eq(Match::getHomeTeamId, teamBId).eq(Match::getAwayTeamId, teamAId))
);
// 按比赛时间倒序排列
wrapper.orderByDesc(Match::getMatchTime);
return matchMapper.selectList(wrapper);
}
}
实体类 Match 简化示例:
public class Match {
private Long id;
private Long homeTeamId;
private Long awayTeamId;
private Integer homeScore;
private Integer awayScore;
private Date matchTime;
// ... getter/setter
}
数据在内存中(如测试、临时数据)
如果只是开发阶段或数据量小,用 Java 8+ 的 Stream API 过滤。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class LocalHeadToHead {
public static void main(String[] args) {
List<Match> allMatches = new ArrayList<>();
// 假设这里已经有一堆比赛数据 allMatches.add(new Match(...));
Long teamAId = 1L; // 比如曼联
Long teamBId = 2L; // 比如利物浦
List<Match> history = allMatches.stream()
.filter(m ->
(m.getHomeTeamId().equals(teamAId) && m.getAwayTeamId().equals(teamBId)) ||
(m.getHomeTeamId().equals(teamBId) && m.getAwayTeamId().equals(teamAId))
)
.sorted((m1, m2) -> m2.getMatchTime().compareTo(m1.getMatchTime())) // 最新在前
.collect(Collectors.toList());
// 打印历史交锋战绩统计
long teamAWins = history.stream()
.filter(m ->
(m.getHomeTeamId().equals(teamAId) && m.getHomeScore() > m.getAwayScore()) ||
(m.getAwayTeamId().equals(teamAId) && m.getAwayScore() > m.getHomeScore()))
.count();
System.out.println("两队历史交锋 " + history.size() + " 次,A队获胜 " + teamAWins + " 次");
}
}
调用外部体育数据API(如足球数据API)
如果你接的是现成的公开API(如 API-Football, SportdataAPI),它们的接口通常直接叫 fixtures/headtohead 或 h2h。
Java调用代码示例(使用 RestTemplate 或 HttpClient):
import org.springframework.web.client.RestTemplate;
public class ApiHeadToHead {
public String fetchH2H(Long teamAId, Long teamBId) {
RestTemplate restTemplate = new RestTemplate();
String apiKey = "你的API密钥";
// 以 API-Football 为例
String url = String.format(
"https://v3.football.api-sports.io/fixtures/headtohead?h2h=%s-%s",
teamAId, teamBId
);
// 设置请求头(如果有需要)
// HttpHeaders headers = new HttpHeaders();
// headers.set("x-apisports-key", apiKey);
// HttpEntity<String> entity = new HttpEntity<>(headers);
String response = restTemplate.getForObject(url, String.class);
// 这里返回JSON,需要再解析成对象
return response;
}
}
怎么“看”历史交锋?
- 如果只是临时看看数据:最直观的是直接打开数据库的
match表,用SQL查一下:SELECT * FROM match WHERE (home_team_id = 1 AND away_team_id = 2) OR (home_team_id = 2 AND away_team_id = 1) ORDER BY match_time DESC;
- 如果在Java项目里开发:用上面的情况一(MyBatis/MyBatis-Plus)最规范。
- 如果要看统计(谁赢得多),再加个
group by计算胜负平即可。