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

news2025/2/26 22:57:40

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

1. 创建数据库&表

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

2. 导入ORM依赖&配置

在pom.xml中导入
要更新maven环境

<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>

01
在application.properties中加入

# 应用服务 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与扫描

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

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接口输入

04
03

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

复制文件所在路径
05
Application程序配置,让Mapper可以被SpringBoot扫描到,进行管理

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中测试它:

@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方式开发&配置07

08
09

在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>

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

# 应用服务 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控制器:

/**
* 将股票基本信息从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:

/**
* 保存股票基本信息
* @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

<?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、字段值同步

011

3、令牌有效性问题
120积分的令牌,有效性一小时才能执行一次stock_basic 接口。
如果一小时执行了一次了,要么再等一个小时,要么使用积分更高的令牌。

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

1.准备好CSV文件
012
2. 编写controller

/**
* openCSV
*/
@RequestMapping("/r9")
public void r9() {
   stockService.saveStockBasicInfoFromCSV();
}

  1. 编写Service
/**
* 通过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上的一个案例完成了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1087547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十个面试排序算法

一、 前言 最常考的是快速排序和归并排序&#xff0c;并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景…

Python爬虫(二十三)_selenium案例:动态模拟页面点击

本篇主要介绍使用selenium模拟点击下一页&#xff0c;更多内容请参考:Python学习指南 #-*- coding:utf-8 -*-import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keys from bs4 import BeautifulSoup import timeclass douyuSelenium…

hive 之select 中文乱码

此处的中文乱码和mysql的库表 编码 latin utf 无关。 直接上案例。 有时候我们需要自定义一列&#xff0c;有时是汉字有时是字母&#xff0c;结果遇到这种情况了。 说实话看到这真是糟心。这谁受得了。 单独select 没有任何问题。 这是怎么回事呢&#xff1f; 经过一番检查&…

记录遇到的前端面试题,欢迎指正

css 1.隐藏元素的方式 转自将页面元素隐藏的10种方法 display:none display属性用于设置页面元素的显示方式&#xff0c;能够控制元素的显示或者隐藏&#xff0c;当他的值被设置为none时&#xff0c;就会隐藏对应的元素&#xff0c;使其不可见。 这种方法是最常用的隐藏元素的…

uboot启动流程-board_init_r函数执行过程

一. uboot启动流程 本文来了解 board_init_r 函数执行过程。_main函数会调用到 board_init_r 函数。 二. board_init_r函数执行过程 _main 函数会调用到 board_init_r 函数。 _main 函数在 uboot的 /arch/arm/lib/crt0.S 文件中。_main函数中&#xff0c;执行完 relocate_…

SLAM从入门到精通(ROS网络通信)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前我们学习ros的时候&#xff0c;大部分都是基于仿真来做的。但是最终&#xff0c;我们还是要把ros部署到小车上的。这就带来一个问题&#xff0…

qgis c++ api 整体框架详解

文章目录 整体架构QGis库官方文档编译生成的库 core地图和图层矢量图层(Vector layers)图层要素符号图层要素要素渲染(feature renderer)符号(symbol) 坐标映射数据源(data provider) Raster layers图层符号数据源坐标映射 core库其他有用类 guiQgsMapCanvasQgsMapToolQgsLayer…

VIT(Vision Transformer)学习(三)-纯VIT之swin transformer模型理解

语义分割网络纯 TRF 结构&#xff1a;VIT主干作为编码器&#xff0c;设计一个基于 TRF 架构的解码器。 今天学习swin transformer 源码地址: https://github.com/microsoft/Swin-Transform 哔哩哔哩讲解&#xff1a;12.1 Swin-Transformer网络结构详解_哔哩哔哩_bilibili 博…

支付宝开放平台第三方代小程序开发,消息服务推送通知总结

大家好&#xff0c;我是小悟 关于支付宝开放平台第三方代小程序开发的消息服务推送通知&#xff0c;是开放平台代小程序实现业务的重要功能。 消息服务推送通知&#xff0c;支持商家两种通讯协议来接收消息&#xff0c;分别为websocket 长连接和http。 关于websocket方式&am…

CentOS 7 编译安装Boost

1、前提条件 linux平台/CentOS 7 下要编译安装Boost除gcc和gcc-c之外&#xff0c;还需要两个开发库&#xff1a;bzip2-devel 和python-devel &#xff0c;因此在安装前应该先保证这两个库已经安装。 安装指令: yum install bzip2 bzip2-devel bzip2-libs python-devel Cent…

学习开发一个RISC-V上的操作系统(汪辰老师) — 01-helloRVOS程序讲解

前言 &#xff08;1&#xff09;此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 &#xff08;2&#xff09;该课程相关代码gitee链接&#xff1b; &#xff08;3&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;4&#xff09; start.S &a…

SpringBoot项目入门: IDEA 创建SpringBoot项目

方式1:在线创建项目 https://start.spring.io/ 环境准备 &#xff08;1&#xff09;JDK 环境必须是 1.8 及以上&#xff0c;传送门&#xff1a;jdk1.8.191 下载&#xff08;2&#xff09;后面要使用到 Maven 管理工具 3.2.5 及以上版本&#xff08;3&#xff09;开发工具建议…

leetcode-279. 完全平方数

1. 题目链接 链接: 题目链接 2. 解答 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>bool issquare(int n) {if (n 1 || n 4) return true;if (n 2 || n 3) return false;for (int i 3; i < n/2; i ) {if (n i*i) return true;}…

【HCIE】12.VXLAN

VXLAN&#xff0c;是一种IP VPN&#xff0c;每台设备几乎都支持IP&#xff0c;而MPLS会有很多设备不会支持&#xff0c;所以VXLAN是使用的较多。 采用MAC in UDP封装方式&#xff0c;MAC指的是原始数据的以太头部被封装到新的UDP头部里面。是基于三层的一个虚拟网络。 技术背…

13.SpringBoot项目之Service层

SpringBoot项目之Service层 JavaEE三层架构 为了项目维护方便&#xff0c;为了项目开发便利。三层架构功能控制器层&#xff1a;controller方便和前端数据进行交互业务层&#xff1a;service处理各种业务持久化层&#xff1a;mapper和数据库进行数据交互 抽取出service层 按…

华为汪涛:5.5G时代UBB目标网,跃升数字生产力

[阿联酋&#xff0c;迪拜&#xff0c;2023年10月12日] 在2023全球超宽带高峰论坛上&#xff0c;华为常务董事、ICT基础设施业务管理委员会主任汪涛发表了“5.5G时代UBB目标网&#xff0c;跃升数字生产力”的主题发言&#xff0c;分享了超宽带产业的最新思考与实践&#xff0c;探…

Ubuntu 23.10 Beta 镜像开放下载

导读Canonical放出了 Ubuntu 23.10 Beta 镜像&#xff0c;此外 Edubuntu、Kubuntu、Lubuntu、Ubuntu Budgie、Ubuntu Cinnamon、Ubuntu Kylin、Ubuntu MATE、Ubuntu Studio、Ubuntu Unity 和 Xubuntu 等风味版本也同步放出镜像。 近日消息&#xff0c;Canonical 放出了 Ubuntu …

【1++的Linux】之文件(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;文件描述符二&#xff0c;重定向三&#xff0c;理解Linux下一切皆文件 一&#xff0c;文件描述符 我们先来看一段代码&#xff1a; #include<unistd.h&g…

什么是CDN内容分发网络?如何做到加速的?

这里写目录标题 CDN如何做到加速的&#xff1f; CDN content delivery network内容分发网络是建立并覆盖在承载网上&#xff0c;由遍布全球的边缘节点服务器群组成的分布式网络。 CDN将源站资源缓存在遍布全球的边缘加速节点服务器上&#xff0c;当客户需要访问和获取资源的时…