一、导入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 使用lettuce做redis的连接池需要额外引入这个jar,因为在lettuce初始化connectionFactory会加载GenericObjectPoolConfig-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>cn.bestwu</groupId>
<artifactId>fastjson</artifactId>
<version>1.2-unwrap</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、完善配置信息
# 应用名称
spring.application.name=oly-demo
# 数据库驱动:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源名称
spring.datasource.name=defaultDataSource
# 数据库连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/ody?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
# 数据库用户名&密码:
spring.datasource.username=root
spring.datasource.password=root
# 应用服务 WEB 访问端口
server.port=8080
# 配置日志 (默认控制台输出)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
三、主要代码
1、配置redis
package com.example.olydemo.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfigure {
@Autowired
private LettuceConnectionFactory lettuceConnectionFactory;
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//设置连接工厂
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer() {
});
//设置key value序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setStringSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
2、controller层暴露接口
package com.example.olydemo.controller;
import com.example.olydemo.dto.HttpDto;
import com.example.olydemo.service.CountryService;
import com.example.olydemo.service.MPservice;
import com.example.olydemo.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.IOException;
import java.util.List;
@ResponseBody
@Controller
public class OlyControllser {
@Autowired
MPservice mPservice;
@Autowired
RedisService redisService;
@Autowired
CountryService countryService;
@GetMapping("/insertAndCache")
public String insert() throws IOException {
//写入缓存
redisService.insertCache();
// 写入数据库
countryService.insertCountry();
mPservice.insertResponse();
//返回缓存数据
return redisService.takeByCache();
}
}
3、service层完成业务
CountryService:
package com.example.olydemo.service;
import com.alibaba.fastjson.JSON;
import com.example.olydemo.dto.HttpDto;
import com.example.olydemo.dto.OlyMessage;
import com.example.olydemo.mapper.CountryMapper;
import com.example.olydemo.util.HttpRequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.List;
@Service
public class CountryService {
@Autowired
CountryMapper countryMapper;
public void insertCountry() throws IOException {
String url="http://apia.yikeapi.com/olympic/?appid=72468719&appsecret=QF34cLr9";
String response= HttpRequestUtil.doGet(url);
HttpDto jsonObject = JSON.toJavaObject(JSON.parseObject(response),HttpDto.class);
List<OlyMessage> list = jsonObject.getList();
for (OlyMessage olyMessage : list) {
countryMapper.insert(olyMessage);
}
}
}
MPService:
package com.example.olydemo.service;
import com.alibaba.fastjson.JSON;
import com.example.olydemo.Response.OlyResponse;
import com.example.olydemo.dto.HttpDto;
import com.example.olydemo.mapper.ResponseMapper;
import com.example.olydemo.util.HttpRequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
@Service
public class MPservice {
@Autowired
ResponseMapper responseMapper;
public HttpDto insertResponse() throws IOException {
String url = "http://apia.yikeapi.com/olympic/?appid=72468719&appsecret=QF34cLr9";
String response = HttpRequestUtil.doGet(url);
HttpDto jsonObject = JSON.toJavaObject(JSON.parseObject(response), HttpDto.class);
OlyResponse olyResponse = new OlyResponse();
olyResponse.setRequest_url(url);
olyResponse.setRequest_body(url);
olyResponse.setErrcode(jsonObject.getErrcode());
olyResponse.setErrmsg(jsonObject.getErrmsg());
responseMapper.insert(olyResponse);
return jsonObject;
}
public HttpDto insertCountry() throws IOException {
String url = "http://apia.yikeapi.com/olympic/?appid=72468719&appsecret=QF34cLr9";
String response = HttpRequestUtil.doGet(url);
HttpDto jsonObject = JSON.toJavaObject(JSON.parseObject(response), HttpDto.class);
OlyResponse olyResponse = new OlyResponse();
olyResponse.setRequest_url(url);
olyResponse.setRequest_body(url);
olyResponse.setErrcode(jsonObject.getErrcode());
olyResponse.setErrmsg(jsonObject.getErrmsg());
responseMapper.insert(olyResponse);
return jsonObject;
}
}
RedisService:
package com.example.olydemo.service;
import com.alibaba.fastjson.JSON;
import com.example.olydemo.dto.HttpDto;
import com.example.olydemo.dto.OlyMessage;
import com.example.olydemo.util.HttpRequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.List;
@Service
public class RedisService {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
public void insertCache() throws IOException {
String url="http://apia.yikeapi.com/olympic/?appid=72468719&appsecret=QF34cLr9";
String response= HttpRequestUtil.doGet(url);
HttpDto jsonObject = JSON.toJavaObject(JSON.parseObject(response),HttpDto.class);
List<OlyMessage> list = jsonObject.getList();
ListOperations<String, Object> listOperations = redisTemplate.opsForList();
for (OlyMessage olyMessage : list) {
listOperations.rightPush("country",olyMessage);
}
}
public String takeByCache() throws IOException {
ListOperations<String, Object> listOperations = redisTemplate.opsForList();
List<Object> list=listOperations.range("country", 0,-1);
StringBuffer sb=new StringBuffer();
for (Object o : list) {
OlyMessage olyMessage= (OlyMessage)o;
sb.append(olyMessage.toString()+"\n");
}
return sb.toString();
}
}
4、mapper层编写相关接口
CountryMapper:
package com.example.olydemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.olydemo.dto.OlyMessage;
import org.springframework.stereotype.Repository;
@Repository
public abstract interface CountryMapper extends BaseMapper<OlyMessage> {
}
RequestMapper:
package com.example.olydemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.olydemo.request.OlyRequest;
import org.springframework.stereotype.Repository;
@Repository
public abstract interface RequestMapper extends BaseMapper<OlyRequest> {
}
ResponseMapper:
package com.example.olydemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.olydemo.Response.OlyResponse;
import org.springframework.stereotype.Repository;
@Repository
public abstract interface ResponseMapper extends BaseMapper<OlyResponse> {
}
5、dto
HttpDto:
package com.example.olydemo.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;
import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class HttpDto {
private String errcode;
private String errmsg;
private String update_time;
private List<OlyMessage> list;
}
OlyMessage:
package com.example.olydemo.dto;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("country")
public class OlyMessage {
private int id;
private String country;
private String flag;
private Integer jin;
private Integer yin;
private Integer tong;
private Integer total;
@Override
public String toString() {
return "OlyMessage{" +
"country='" + country + '\'' +
", flag='" + flag + '\'' +
", jin=" + jin +
", yin=" + yin +
", tong=" + tong +
", total=" + total +
'}';
}
}
6、request
package com.example.olydemo.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OlyRequest {
private String rquest_url;
private String appid;
private String appsecret;
}
7、response
package com.example.olydemo.Response;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tbl_oly")
public class OlyResponse {
@TableId(type = IdType.AUTO)
private int id;
private String request_body;
private String response_code;
private String request_url;
@TableField(fill = FieldFill.INSERT)
private Date update_time;
private String errcode;
private String errmsg;
@TableLogic(delval ="1", value="0")
private int is_deleted;
}
8、util
package com.example.olydemo.util;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;
@Component
public class HttpRequestUtil {
public static String doGet(String url) throws IOException {
//1、创建 CloseableHttpClient 同步请求对象
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// 2、HttpGet(final String uri):创建 http get 请求对象
HttpGet httpGet = new HttpGet(url);
// 3、设置超时时间、请求时间、socket 时间都为 15 秒,允许重定向
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(15000)
.setConnectionRequestTimeout(15000)
.setSocketTimeout(15000)
.setRedirectsEnabled(true)
.build();
httpGet.setConfig(requestConfig);
// 4、CloseableHttpResponse execute(final HttpUriRequest request):执行请求
// 如果连接不上服务器,则抛出:java.net.ConnectException: Connection refused: connect
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
// 5、获取响应结果, 状态码 200 表示请求成功
int statusCode = httpResponse.getStatusLine().getStatusCode();
System.out.println("响应状态码:" + statusCode);
if (statusCode == 200) {
HttpEntity httpEntity = httpResponse.getEntity();
// 使用指定的字符编码解析响应消息实体
String feedback = EntityUtils.toString(httpEntity, "UTF-8");
System.out.println("feedback:" + feedback);
return feedback;
}
return "error";
}
}
8、主启动类
package com.example.olydemo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.example.olydemo.mapper")
@SpringBootApplication
public class OlyDemoApplication {
public static void main(String[] args) {
SpringApplication.run(OlyDemoApplication.class, args);
}
}
四、目录结构
五、总结
一步一步做出来的,可能项目经验比较少,命名有点问题,项目结构设计也不太好。但还是有那么一丢丢参考价值的。