14. SpringBoot项目之数据保存到数据库

SpringBoot项目之数据保存到数据库

1. 创建数据库&表

本栏目前面文章中已经讲过MySql连接SqlYog以及创建数据库&表 --->传送门

2. 导入ORM依赖&配置

在pom.xml中导入

要更新maven环境

java 复制代码
<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>2.2.2</version>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.33</version>
</dependency>

在application.properties中加入

java 复制代码
# 应用服务 WEB 访问端口 8080
server.port=8080
# 配置数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3380/db_stock_test?serverTimezone=UTC
spring.datasource.username=root  //mysql 安装时的用户名
spring.datasource.password=1234  //mysql 安装时的密码

3. 创建Mapper与扫描

在stock下创建javabean软件包,在javabean软件包下创建StockBasicInfo类输入

java 复制代码
import lombok.Data;
@Data
public class StockBasicInfo {
   private Integer id;
   private String tushareCode;
   private String stockCode;
   private String stockName;
   private String locate;
   private String industry;
   private String market;
   private String list_date;
}

在stock下创建mapper软件包,在mapper软件包下创建StockMapper接口输入


java 复制代码
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface StockMapper {
   //将股票信息保存到数据库
   int saveStockBasicInfo(@Param("info") StockBasicInfo stockBasicInfo);
}

复制文件所在路径

Application程序配置,让Mapper可以被SpringBoot扫描到,进行管理

java 复制代码
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableSwagger2
@MapperScan("com.demo_20230830.stock.mapper")

public class Demo20230830Application {

   public static void main(String[] args) {
       SpringApplication.run(Demo20230830Application.class, args);
   }

   /**
    * 向spring注册RestTemplate工具
    * @return
    */
   @Bean
   public RestTemplate getRestTemplate(){
       return new RestTemplate();
   }
}

在service中测试它:

java 复制代码
@Service
public class StockService {
   @Autowired
   private StockMapper stockMapper;
   /**
    * 处理股票基本信息的json字符串
    * @param json
    */
   public void stockBasicJsonInfoHandler(String json){
       //5、JSON转换
       JSONObject jsonObject = JSONObject.parseObject(json);
       //获取请求id(测试用)
       String requestId = jsonObject.getString("request_id");
       //获取本次的所有数据
       JSONObject data = jsonObject.getJSONObject("data");
       //获取表头(数组)
       JSONArray fields = data.getJSONArray("fields");
       //fields.fori
       for (int i = 0; i < fields.size(); i++) {
           System.out.print(fields.get(i)+"\t\t");
       }
       System.out.println();
       //获取表格内部数据
       JSONArray items = data.getJSONArray("items");
       for (int i = 0; i < items.size(); i++) {
           JSONArray jsonArray = items.getJSONArray(i);
           //展示这一行的数据
           for (int j = 0; j < jsonArray.size(); j++) {
               System.out.print(jsonArray.get(j)+"\t\t");
           }
           System.out.println();
       }
       System.out.println(stockMapper);
   }

   /**
    * 从CSV文件中读取股票信息
    */
   public void stockBasicInfoCSVHandler() {
       File file;
       try {
           file = ResourceUtils.getFile("classpath:csvdata/stock_basic.csv");
       } catch (FileNotFoundException e) {
           throw new RuntimeException(e);
       }
       try (
               FileReader reader = new FileReader(file);
       ) {
           CSVReader csvReader = new CSVReader(reader);
           List<String[]> list = csvReader.readAll();
           for (String[] arr : list) {
               //展示某一行的数据
               for (String s : arr) {
                   System.out.print(s + "\t\t");
               }
               System.out.println();
           }
       } catch (FileNotFoundException e) {
           throw new RuntimeException(e);
       } catch (IOException e) {
           throw new RuntimeException(e);
       } catch (CsvException e) {
           throw new RuntimeException(e);
       }
   }
}

4. xml方式开发&配置


在StockMapper.xml中导入

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo_20230830.stock.mapper.StockMapper">
</mapper>

application.properties中加入配置mapper.xml的路径

java 复制代码
# 应用服务 WEB 访问端口
server.port=8080
# 配置数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3380/db_stock_test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1234


#配置mapper.xml的路径
mybatis.mapper-locations=classpath:mapper/*.xml

5. 保存数据到数据库

抓取实时数据保存数据库

MyController2控制器:

java 复制代码
/**
* 将股票基本信息从tushare平台获取,并保存数据库
*/
@RequestMapping("/r8")
public void r8(){
   //1、封装map参数
   HashMap<String, String> map = new HashMap<>();
   map.put("api_name","stock_basic");
   map.put("token","你自己的token");
   //2、设置请求头信息
   HttpHeaders httpHeaders = new HttpHeaders();
   httpHeaders.setContentType(MediaType.APPLICATION_JSON);
   //3、封装头实体内容
   HttpEntity<Map> entity = new HttpEntity<>(map, httpHeaders);
   //4、传递信息
   String json = restTemplate.postForObject("http://api.tushare.pro", entity, String.class);
   //5、调用业务层,处理并展示json数据
   stockService.saveStockBasicInfo(json);
}

StockService:

java 复制代码
/**
* 保存股票基本信息
* @param json
*/
public void saveStockBasicInfo(String json){
   //5、JSON转换
   JSONObject jsonObject = JSONObject.parseObject(json);
   //获取请求id(测试用)
   String requestId = jsonObject.getString("request_id");
   //获取本次的所有数据
   JSONObject data = jsonObject.getJSONObject("data");
   //获取表格内部数据
   JSONArray items = data.getJSONArray("items");
   for (int i = 0; i < items.size(); i++) {
       JSONArray jsonArray = items.getJSONArray(i);
       StockBasicInfo stockBasicInfo = new StockBasicInfo();
       stockBasicInfo.setTushareCode(jsonArray.getString(0));
       stockBasicInfo.setStockCode(jsonArray.getString(1));
       stockBasicInfo.setStockName(jsonArray.getString(2));
       stockBasicInfo.setLocate(jsonArray.getString(3));
       stockBasicInfo.setIndustry(jsonArray.getString(4));
       stockBasicInfo.setMarket(jsonArray.getString(5));
       stockBasicInfo.setList_date(jsonArray.getString(6));
       int rows = stockMapper.saveStockBasicInfo(stockBasicInfo);
       System.out.println("保存成功了"+rows+"条,保存成功的数据是:"+stockBasicInfo);
   }
}

StockMapper.xml

java 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo_20230830.stock.mapper.StockMapper">
   <insert id="saveStockBasicInfo">
       insert into tb_stock_basic_info (
                                  tushareCode,
                                  stockCode,
                                  stockName,
                                  locate,
                                  industry,
                                  market,
                                  list_date
       ) values(
                               #{info.tushareCode},
                               #{info.stockCode},
                               #{info.stockName},
                               #{info.locate},
                               #{info.industry},
                               #{info.market},
                               #{info.list_date}
                       )
       <selectKey resultType="java.lang.Integer" keyProperty="info.id" order="AFTER">
           select LAST_INSERT_ID()
       </selectKey>
   </insert>
</mapper>
小结:
1、数据库与数据表名字的同步
2、字段值同步
3、令牌有效性问题
120积分的令牌,有效性一小时才能执行一次stock_basic 接口。
如果一小时执行了一次了,要么再等一个小时,要么使用积分更高的令牌。

解析CSV历史数据保存数据库

1.准备好CSV文件

  1. 编写controller
java 复制代码
/**
* openCSV
*/
@RequestMapping("/r9")
public void r9() {
   stockService.saveStockBasicInfoFromCSV();
}
  1. 编写Service
java 复制代码
/**
* 通过CSV文件,将数据存入数据库
*/
public void saveStockBasicInfoFromCSV() {
   File file;
   try {
       file = ResourceUtils.getFile("classpath:csvdata/stock_basic.csv");
   } catch (FileNotFoundException e) {
       throw new RuntimeException(e);
   }
   try (
           FileReader reader = new FileReader(file);
   ) {
       CSVReader csvReader = new CSVReader(reader);
       List<String[]> list = csvReader.readAll();
       for (int i = 1; i < list.size(); i++) {
           String[] arr = list.get(i);
           StockBasicInfo stockBasicInfo = new StockBasicInfo();
           stockBasicInfo.setTushareCode(arr[0]);
           stockBasicInfo.setStockCode(arr[1]);
           stockBasicInfo.setStockName(arr[2]);
           stockBasicInfo.setLocate(arr[3]);
           stockBasicInfo.setIndustry(arr[4]);
           stockBasicInfo.setMarket(arr[5]);
           stockBasicInfo.setList_date(arr[6]);
           int rows = stockMapper.saveStockBasicInfo(stockBasicInfo);
           System.out.println("保存成功了"+rows+"条,保存成功的数据是:"+stockBasicInfo);
       }
   } catch (FileNotFoundException e) {
       throw new RuntimeException(e);
   } catch (IOException e) {
       throw new RuntimeException(e);
   } catch (CsvException e) {
       throw new RuntimeException(e);
   }
}

4.Mapper上的一个案例完成了

相关推荐
工业互联网专业2 分钟前
毕业设计选题:基于springboot+vue+uniapp的驾校报名小程序
vue.js·spring boot·小程序·uni-app·毕业设计·源码·课程设计
Monodye10 分钟前
【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)
java·网络·数据结构·算法·系统架构
一丝晨光16 分钟前
逻辑运算符
java·c++·python·kotlin·c#·c·逻辑运算符
ForRunner12319 分钟前
使用 Python 高分解决 reCAPTCHA v3 的指南
数据库·python·microsoft
无名指的等待71240 分钟前
SpringBoot中使用ElasticSearch
java·spring boot·后端
Tatakai251 小时前
Mybatis Plus分页查询返回total为0问题
java·spring·bug·mybatis
武子康1 小时前
大数据-133 - ClickHouse 基础概述 全面了解
java·大数据·分布式·clickhouse·flink·spark
晓幂1 小时前
CTFShow-信息搜集
笔记·学习
.生产的驴1 小时前
SpringBoot 消息队列RabbitMQ 消费者确认机制 失败重试机制
java·spring boot·分布式·后端·rabbitmq·java-rabbitmq
躺平的花卷1 小时前
Python爬虫案例六:抓取某个地区某月份天气数据并保存到mysql数据库中
数据库·爬虫·python·mysql