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

前言

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

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

    //商品模块

    //订单模块

    //订单模块 5005XX


    public 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,前边也用不到很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值