当前位置: 首页 > news >正文

学习基于springboot秒杀系统-环境配置(接口封装,mybatis,mysql,redis(Linux))

文章目录

  • 前言
  • 创建springboot项目
  • 封装controller层输入输出
    • rest api 的json输出
    • 返回页面
  • 集成mybatis
  • 集成redis
    • 下载虚拟机和centos
    • 下载redis.tar.gz
    • 上传redis.tar.gz 到虚拟机

前言

今天开始记录学习秒杀系统-课程是基于慕课上的搜索秒杀系统的课程,老师讲解非常好。这系列的笔记更多可能会记录我学习的疑问点和遇到的问题,一些环境配置并没有系统的介绍。环境配置有问题可以单独搜索相关

创建springboot项目

我用的是idea2024专业版,创建springboot项目非常方便。最大的问题可能是怎样下载专业版(大家自行百度)
项目创建完成后 我们创建以下包和目录
在这里插入图片描述
这里说明以下为什么要在org.example.miaosha_1创建包 因为springboot扫描bean的路径已经不用xml配置了,所以扫描路径必须规定好要在启动程序同级或者下级。

创建完后我们直接进入正题配置以下依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

封装controller层输入输出

controller 里边的方法根据返回类型分为两大类 1.返回json 2.返回页面 。对于两种不同的信息,我们要对其封装。为什么封装?因为不封装会显得很乱格式各样的数据都有,我们需要集中把返回信息定义在一个类中。其实最繁琐的就是第一类。

rest api 的json输出

一般服务端会给客户端做接口的约定
什么样子呢{"code": 错误码 "msg":错误信息 "data":成功时返回的数据 }
所以在根目录下创建一个包result,在创建一个Result类 封装输入输出结果。定义好后,我们发现在controller层需要写很多凌乱的代码 比如对于每个错误信息我们都需要在这里定义,然后调用Result构造函数。其实没什么问题,但是很难看,因为我们错误信息很多啊比如各种验证,各种访问策略。假如都写在controller,就会显得本末倒置,也让错误信息满天飞,一会定义一个一会定义一个。

public class Result<T> {private int code;private String msg;private T data;private Result(CodeMsg codeMsg) {this.code = codeMsg.getCode();this.msg = codeMsg.getMsg();}public static <T> Result<T> success(T data) {return new Result<T>(data);}public static <T>Result<T> error(CodeMsg codeMsg) {return new Result<T>(codeMsg);}private Result(T data) {this.data = data;this.code = 0;this.msg = "success";}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Result(int code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}
}

这里记录一下我多年的疑问1.为什么要让构造方法成为private方法 ,不能变为public吗 。这是因为我们外部用此对象时 我们只能success和error去调用构造函数 防止很混乱。
2.为什么这两种方法要设置static方式呢 ,static方式的作用是让此方法变为这个类的,而不是这个对象的。注意对象和类有本质区别,对象是new出来的。我们不加static的话每次用都需要先new 一个对象然后使用此方法。 而加了之后我们直接使用即可
比如

Tool tool = new Tool(); // 必须先 new
tool.sayHi();           // 然后才能调用Tool.sayHello(); // 直接通过类名调用!不需要 new!

此外 由于构造器设置了private你没法通过new 来初始化。

再在此目录下创建一个类

package org.example.miaosha_1.result;public class CodeMsg {private int code;private String msg;//通用异常public static CodeMsg SUCCESS = new CodeMsg(0, "success");public static CodeMsg ERROR = new CodeMsg(1, "error");//登录模块5002XX//商品模块//订单模块//订单模块 5005XXpublic CodeMsg(int code, String msg) {this.code = code;this.msg = msg;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

这样我们的错误信息可以只在CodeMsg类下定义了。代码更优雅

返回页面

(1)配置 在applications.properties文件下,输入

spring.thymeleaf.cache=false
spring.thymeleaf.content-type=text/html
spring.thymeleaf.enabled=true
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.mode=HTML5
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

其中后两行的含义是当我们在controller层,想要返回页面时,我们只需返回一个字符串。随后在resources 目录下新建templates文件夹,在此文件下创建对应的html文件 ,我们就可以返回。比如在controller层方法如下

    @RequestMapping("/theymeleaf")public String theymeleaf(Model model){return "hello";}

我们需要“在resources 目录下新建templates文件夹,在此文件下创建hello.html文件 ” 。

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>hello</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'hello:'+${name}" ></p>
</body>
</html>

文件复制以上内容。 其中th代表一个别名,th 是这个命名空间的前缀,用于标识与Thymeleaf相关的属性和指令。可以理解为没有th的块,你用不了thymeleaf。 比如我们在

p标签用了 th,我们就可以使用在后台属性注入。修改后的contraoller方法时
  @RequestMapping("/theymeleaf")public String theymeleaf(Model model){model.addAttribute("name","Bendong");return "hello";}

**可能的问题:**这里记录一个问题 假如你在controller方法类前边加的是RestController 注解你使用了 @RestController 而不是 @Controller
@RestController = @Controller + @ResponseBody
所以哪怕你没加 @ResponseBody,它自动加了!
于是返回的 “hello” 被当作纯字符串响应给浏览器了,而不是视图名。 所以要想返回视图名字直接加 controller

集成mybatis

首先 配置依赖

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency>

在打开applications.properties配置

mybatis.type-aliases-package=org.example.miaosha_1.domains
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=3000
mybatis.mapperLocations = classpath:org/example/miaosha_1/dao/*.xml

配置说明:第一行代表,你数据库表中对应的等值对象
第二行:将下划线转化为驼峰
三四行不用管
第五行代表,用配置文件查询时去哪扫描

这里稍微解释一下第一行,其实它的作用是让 MyBatis 自动扫描 org.example.miaosha_1.domains 包下的所有类,并为每个类注册一个 类型别名(Type Alias)。注册别名后,在你的 XML 映射文件(如 UserMapper.xml)中就可以使用简短的类名来表示 Java 类型,而不需要写完整的包名。例如:

<!-- 不用别名写法 -->
<resultMap id="userMap" type="org.example.miaosha_1.domains.User"><!-- 用了别名后 -->
<resultMap id="userMap" type="User">

随后配置mysql,这里注意一定要和自己电脑下载的mysql server的版本一致 一般是8和5,我用的8。
还是一样的配置依赖

    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.14</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>

配置applications.properties

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/miaoshademo?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.filters=stat
spring.datasource.maxActive=2
spring.datasource.initialSize=1
spring.datasource.maxWait=60000
spring.datasource.minIdle=1
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20

前三行换成自己电脑的配置,随后自行测试有没有成功。如果版本是5第三行去掉cj

集成redis

下载虚拟机和centos

详情右转至 VMware-workstation安装教程–超详细(附带安装包)附带安装CentOS系统教程

下载redis.tar.gz

这里直接附上链接 https://pan.baidu.com/s/15zRDtzgB1_sSZYDhxhzXTg 提取码 blwy

上传redis.tar.gz 到虚拟机

我用的较为简单的方式 即共享文件夹
在这里插入图片描述

打开虚拟机设置 点击选项
在这里插入图片描述
添加 选择你安装redis安装包的文件夹
进入虚拟机 打开终端输入命令 cd /mnt/hgfs ls
查看是否共享成功
在这里插入图片描述
输入命令 tar -zvxf redis-6.2.1.tar.gz 解压后
分别输入以下命令 1.切换到root(升级权限) 2.移动文件夹
在这里插入图片描述
切换到 /usr/local/redis
直接编译 输入make(这一步可能会失败,因为你没有安装gcc编译环境)
安装gcc编译环境 yum -y install gcc automake autoconf libtool make
还有可能失败 ,因为你没的虚拟机不能访问网络 具体去搜一下吧
编译完成后
输入 vi redis.conf
在这里插入图片描述
注意进入你想要修改 则进入编辑模式 按i ,进入命令模式 按esc 默认是esc
然后输入:/bind 这句代码是查找bind的位置 ,然后改为0.0.0.0 就是所有主机都可以访问
在这里插入图片描述

退出编辑模式 输入:/dae 将no改为yes

随后配置好后 导入依赖

redis.clients
jedis


com.alibaba
fastjson
1.2.38

配置linux的主机
redis.host=xxxxxx
redis.port=6379
redis.timeout=3
redis.password=123456
redis.poolMaxTotal=10
redis.poolMaxIdle=10
redis.poolMaxWait=3
随后环境配置完成,然后自行测试一下。

如果觉得繁琐可以直接用windows安装的redis,前边也用不到很多。

http://www.dtcms.com/a/268609.html

相关文章:

  • 2025年全国青少年信息素养大赛图形化(Scratch)编程小学低年级组初赛样题答案+解析
  • 登山第二十六梯:单目3D检测一切——一只眼看世界
  • 【C++开源库使用】使用libcurl开源库发送url请求(http请求)去下载用户头像文件(附完整源码)
  • 【R语言】 在读取 CSV 或 Excel 文件时的标准输出
  • 自定义简单线性回归模型
  • 【AI大模型】神经网络反向传播:核心原理与完整实现
  • 电脑电压过高的影响与风险分析
  • 轨迹优化 | 基于激光雷达的欧氏距离场ESDF地图构建(附ROS C++仿真)
  • 回溯题解——子集【LeetCode】二进制枚举法
  • ssh: Could not resolve hostname d: Temporary failure in name resolution
  • 从依赖地狱到依赖天堂PNPM
  • 01、通过内网穿透工具把家中闲置电脑变成在线服务器
  • C盘瘦身 -- 虚拟内存文件 pagefile.sys
  • (六)PS识别:源数据分析- 挖掘图像的 “元语言”技术实现
  • python list去重
  • 【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
  • Docker 将镜像打成压缩包将压缩包传到服务器运行
  • 物联网技术的关键技术与区块链发展趋势的深度融合分析
  • Java SE与Java EE使用方法及组件封装指南
  • 安卓10.0系统修改定制化_____安卓9与安卓10系统文件差异 有关定制选项修改差异
  • Java 并发编程中的同步工具类全面解析
  • qiankun隔离机制
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的高校实验室资源综合管理系统,推荐!
  • 按键开关:新型防水按键开关的特点!
  • 音频流媒体技术选型指南:从PCM到Opus的实战经验
  • 【Java面试】Https和Http的区别?以及分别的原理是什么?
  • 02 除了前面常见图表,还有许多更细分或专业的可视化类型,尤其是在特定领域(如金融、工程、生物信息等)。
  • GaussDB应用场景全景解析:从金融核心到物联网的分布式数据库实践
  • OpenCV 人脸分析----人脸识别的一个经典类cv::face::EigenFaceRecognizer
  • Oracle PL/SQL 编程基础详解(从块结构到游标操作)