springboot+mybatisplus+redis连接东京奥运会接口,把数据存入数据库和缓存,并把数据从缓存返回

一、导入相关依赖

    <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);
    }

}

四、目录结构

五、总结 

  一步一步做出来的,可能项目经验比较少,命名有点问题,项目结构设计也不太好。但还是有那么一丢丢参考价值的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值