Spring 基础项目

第一部分、搭建基础结构

安装IDEA,安装教程自行查找,本次使用2020.3.4版本
使用IDEA创建一个Maven项目
,在pom.xml文件里面写入:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.3.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
    </dependencies>

这些依赖的作用不用多说,在新建的目录的resource目录下面,新建一个application.yml,写入:

server:
  port: 80
spring:
  datasource:
    url: jdbc:mysql://你的IP地址/demo?serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: 你的数据用户名
    password: 你的用户密码
  application:
    name: 'login—demo'
logging:
  level:
    root: info
    com.deng.p1: debug

创建一个新的目录层级:例如我的项目是:com/deng/p1 在创建的文件夹里面创建controller,service,service/impl,mapper等目录,并创建一个启动类SpringApplication.java。

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

在controller里面创建一个TestController.java类。

@RestController 
@RequestMapping("ctl")
public class TestController {
    @RequestMapping("test")
    public String test(){
        return "asd";
    }
}

@RestController表示的是这个controller层里面的方法返回值都是需要直接返回给前端的数据,作为响应体,如果使用的@Controller或者其他的注解,类中的方法的返回值会被作为视图View返回给前端。
@RequestMapping表示的是这个要访问这个类/方法,以GET请求举例,需要在URL写这个IP+端口+/类上的注解的值/方法上的注解的值/请求参数
写完以后,找到SpringApplication.java这main方法,启动它。在浏览器里面,localhost/ctl/test,就可以访问到你写的返回值了。

第二部分、搭建数据库服务

1.使用MySQL作为数据库

  • 方法一:使用rpm方式安装
• 
|  选项 | 数值  |

| ------------ | ------------ |

| Product Version  | 8.0.22  |

| Operating System | RedHat |

| OS Version |x86-64bit |

如何查看自己的操作系统信息?
cat /etc/redhat-release可以查看红帽Linux内核版本,其余系统请自行百度
uname -r可以查看自己的内核和架构版本,例如:3.10.0-1160.71.1.el7.x86_64,el7表示linux内核版本为7,架构属于x86架构,64位操作系统

在页面中下载mysql-community-server-8.0.22mysql-community-libs-8.0.22,mysql-community-common,mysql-community-client-plugins-8.0.22,mysql-community-client,mysql-community-client-plugins-8.0.2,找不到的话,用Ctrl+F搜索网页就可以看到,可以自己下载到本地,再使用xftp工具上传到服务器中
安装他们:

rpm -ivh mysql-community-libs-8.0.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-common-8.0.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.22-1.el7.x86_64.rpm
  • 方法二:使用yum安装(推荐)
  • 不用找官网下载各种文件,只需要一个:
  • 进入 https://dev.mysql.com/downloads/repo/yum/
  • 找到你的Linux版本对应的Package,例如我的是CentOS7,就选择redhat-el7的package
  • springboot 关闭Actuator监控 关闭springboot项目_System


  • 点击download下载,进入到新页面,点击
  • springboot 关闭Actuator监控 关闭springboot项目_mysql_02


  • 进入到你的服务器控制台:
  • 输入wget <你刚刚复制的地址>,例如我的:
    wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
  • 将他安装到你的服务器上:
    sudo yum install mysql80-community-release-el7-7.noarch.rpm
  • 这时候你可以选择安装最新的
    sudo yum install mysql-community-server
  • 或者查询指定版本:
    yum --showduplicates list mysql-community-server | expand版本会在下来列出
  • mysql-community-server.x86_64 8.0.21-1.el7 mysql80-community
  • mysql-community-server.x86_64 8.0.22-1.el7 mysql80-community
  • mysql-community-server.x86_64 8.0.23-1.el7 mysql80-community
  • mysql-community-server.x86_64 8.0.24-1.el7 mysql80-community
  • mysql-community-server.x86_64 8.0.25-1.el7 mysql80-community
  • mysql-community-server.x86_64 8.0.26-1.el7 mysql80-community
  • 使用sudo yum install mysql-community-server-8.0.22-1.el7进行安装
  • 此时可以使用systemctl status mysqld查看服务状态是未启动的
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html

启动MySQL服务systemctl start mysqld,再次查看状态就可以看到

● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2023-03-19 08:42:15 PDT; 3s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3705 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 3785 (mysqld)
   Status: "Server is operational"
    Tasks: 38
   CGroup: /system.slice/mysqld.service
           └─3785 /usr/sbin/mysqld

Mar 19 08:42:09 localhost.localdomain systemd[1]: Starting MySQL Server...
Mar 19 08:42:15 localhost.localdomain systemd[1]: Started MySQL Server.

查看日志:/var/log/mysqld.log

2023-03-19T15:42:11.132255Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.22) initializing of server in progress as process 3740
2023-03-19T15:42:11.142609Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-03-19T15:42:11.471932Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-03-19T15:42:12.132576Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: kpR9Hw5?M%-o
2023-03-19T15:42:14.645203Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.22) starting as process 3785
2023-03-19T15:42:14.654957Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2023-03-19T15:42:14.884161Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2023-03-19T15:42:14.977722Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2023-03-19T15:42:15.054065Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2023-03-19T15:42:15.054224Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2023-03-19T15:42:15.079033Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.22'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.

找到其中的字段:A temporary password is generated for root@localhost: kpR9Hw5?M%-o,其中kpR9Hw5?M%-o这部分就是密码。接下来需要登录MySQL服务器,重置MySQ的密码。
进入数据库以后,执行:ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';;这是你进入新数据库需要执行的第一步,再刷新权限FLUSH PRIVILEGES;;创建一个新的用户 create user 'root'@'%' identified by '你的新密码';,再将权限给到新创建的root上面:grant all privileges on *.* to 'root'@'%';,做完这个操作,一般来说都没问题了,使用FLUSH PRIVILEGES;刷新一下权限。
如果外部仍不能连接数据库,请检查防火墙,systemctl status firewalld,如果开启的,就可以给他关闭掉,systemctl stop firewalld;systemctl disable firewalld;

第三部分、遇到的BUG

1. 打的包在运行的时候,提示没有主属性清单:

在pom.xml里面的<project>标签的尾部加入:

<build>
        <defaultGoal>compile</defaultGoal>
        <sourceDirectory>src/main/java</sourceDirectory>
        <finalName>login-demo-${version}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

finalName标签指定你打完包后包的名称
version的版本和你现在的SpringBoot版本一致就行
如何打包:使用IDEA,右边的Maven菜单里面Lifecycle,先点package,就可以在Project菜单里面看见一个targe菜单,里面的Jar文件就是打包出来的文件

2. 在服务器里面使用80端口,但是提示:

Caused by: java.net.SocketException: Permission denied
	at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_333]
	at sun.nio.ch.Net.bind(Net.java:438) ~[na:1.8.0_333]
	at sun.nio.ch.Net.bind(Net.java:430) ~[na:1.8.0_333]
	at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:225) ~[na:1.8.0_333]

标识当前的用户没有使用80端口的权限,只有root用户可以使用80端口,提供的解决方式是:
使用root用户,运行下面的指令:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

该命令可以将80的端口映射到8080上面去

取消映射:iptables -t nat -L -n --line-numbers,看看你的映射是第几个,使用命令:iptables -t nat -D PREROUTING 1,这里假如它的序号是1

3. 使用系统管理员,给其他的Linux用户修改密码:

登录系统管理员:
使用passwd 要改名的用户