SpringBoot中如何将GET请求的响应体保存至SQL数据库
SpringBoot将GET请求响应存储到SQL数据库的实现方法
你提供的示例GET响应结构参考:
[ { "id": 6, "dateTime": "2020-12-02 00:00:00", "msisdn": 771234, "chargedAmount": 250.0 }, { "id": 7, "dateTime": "2020-12-31 23:59:58", "msisdn": 771234568, "chargedAmount": 1000.0 } ]
首先需要引入的基础依赖:
- Spring Web:用于发送HTTP GET请求
- 数据库操作框架:可选Spring Data JPA / MyBatis / MyBatis-Plus,用于SQL数据写入
- 对应SQL数据库的驱动(比如MySQL Driver、PostgreSQL Driver)
- Lombok(可选):简化实体类代码
步骤1:创建数据库表
对应响应字段,参考MySQL建表语句:
CREATE TABLE `charge_record` ( `id` bigint NOT NULL PRIMARY KEY COMMENT '响应返回的唯一id', `date_time` datetime NOT NULL COMMENT '交易时间', `msisdn` bigint NOT NULL COMMENT '用户号码', `charged_amount` decimal(10,2) NOT NULL COMMENT '扣费金额' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
步骤2:编写映射实体类
以JPA为例,同时适配JSON响应字段和数据库表字段:
import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.persistence.*; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @Entity @Table(name = "charge_record") public class ChargeRecord { @Id private Long id; @JsonProperty("dateTime") @Column(name = "date_time") private Date dateTime; private Long msisdn; @JsonProperty("chargedAmount") @Column(name = "charged_amount") private BigDecimal chargedAmount; }
如果使用MyBatis/MyBatis-Plus,对应调整注解即可。
步骤3:编写数据库操作接口
以Spring Data JPA为例:
import org.springframework.data.jpa.repository.JpaRepository; public interface ChargeRecordRepository extends JpaRepository<ChargeRecord, Long> { }
步骤4:实现请求调用+解析+存库逻辑
首先将RestTemplate注册到Spring容器:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
核心业务逻辑示例:
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import java.util.Arrays; import java.util.List; @Service public class ChargeRecordService { private final RestTemplate restTemplate; private final ChargeRecordRepository chargeRecordRepository; // 构造方法注入 public ChargeRecordService(RestTemplate restTemplate, ChargeRecordRepository chargeRecordRepository) { this.restTemplate = restTemplate; this.chargeRecordRepository = chargeRecordRepository; } @Transactional(rollbackFor = Exception.class) public void syncAndSaveChargeRecords(String getRequestUrl) { // 发送GET请求,直接将响应解析为实体类数组 ChargeRecord[] records = restTemplate.getForObject(getRequestUrl, ChargeRecord[].class); if (records == null || records.length == 0) { return; } List<ChargeRecord> recordList = Arrays.asList(records); // 批量插入数据库 chargeRecordRepository.saveAll(recordList); } }
额外优化点
- 可提前对响应数据做合法性校验,避免非法数据入库
- 响应中的
id为唯一主键,重复插入时数据库会自动报错,可按需增加查询去重逻辑 - 如果GET响应数据量很大,可分批拉取分批插入,避免内存溢出
- 可添加请求重试机制,应对接口调用失败的场景
内容的提问来源于stack exchange,提问作者Nathindu Himansha
相关产品推荐
相关产品推荐

