• Spring+SpringMVC+Mybatis(开发必备技能)01、基础idea环境配置


    Spring+SpringMVC+Mybatis(开发必备技能)

    01、基础idea环境配置

    环境:

    数据库:MySQL

    开发工具:IntelliJ IDEA 2020.1.3 x64

    框架:SSM(Spring+SpringMVC+Mybatis)

    目录

    1、创建idea的maven项目

    2、引入maven所需要的所有包

    3、包解释:

    Spring需要的包:

    Mybatis需要的包:?

    jsp与servlet需要的包:

    数据库连接池DBCP:

    Json:

    JDBC组件:

    分页:

    复杂sql处理:

    4、创建资源文件夹:

    5、创建数据库链接在资源文件【jdbc.properties】

    ?编辑

    6、在【resources】下创建【mapper】文件夹与【UsersMapper.xml】测试类文件

    ?编辑

    7、Spring配置文件【applicationContext.xml】的创建

    8、spring-mvc配置文件spring-mvc.xml配置

    9、创建各层级【模型层model】、【数据层dao】、【控制器controller】、【业务逻辑接口层service】、【业务逻辑实现层serviceimpl】、【视图层resources/webapp/views】

    10、webapp下【WEB-INF/web.xml】配置

    11、创建测试数据库(也可以直接用我的,连接不变即可)

    12、完成各层级编码(具体注解与逻辑下篇文章具体讲解)

    【模型层Users】

    【数据层UsersMapper】

    【业务逻辑接口层UsersService】

    【业务逻辑实现层UsersServiceImpl】

    【控制层UsersController】

    【视图层GetInfo.jsp】

    13、配置Tomcat

    14、启动测试

    15、接口访问测试


    1、创建idea的maven项目

    写上项目名称,点击【Next】

    选择maven路径

    2、引入maven所需要的所有包

        
          org.springframework
          spring-context
          4.3.18.RELEASE
        
    
        
        
          org.springframework
          spring-core
          4.3.18.RELEASE
        
    
        
        
          org.springframework
          spring-beans
          4.3.18.RELEASE
        
    
        
        
          org.springframework
          spring-web
          4.3.18.RELEASE
        
    
        
        
          org.springframework
          spring-webmvc
          4.3.18.RELEASE
        
        
        
        
          org.mybatis
          mybatis
          3.4.6
        
    
        
        
          mysql
          mysql-connector-java
          5.1.38
        
    
        
        
        
          org.springframework
          spring-jdbc
          4.3.18.RELEASE
        
    
        
        
          org.springframework
          spring-tx
          4.3.18.RELEASE
        
        
        
          org.mybatis
          mybatis-spring
          1.3.2
        
    
        
        
        
          javax.servlet
          jstl
          1.2
        
    
        
        
          javax.servlet
          javax.servlet-api
          3.1.0
          provided
        
    
        
        
          commons-dbcp
          commons-dbcp
          1.4
        
        
        
        
          com.alibaba
          fastjson
          1.2.47
        
        
        
          com.fasterxml.jackson.core
          jackson-databind
          2.12.2
        
        
        
          com.fasterxml.jackson.core
          jackson-core
          2.12.2
        
        
        
          com.fasterxml.jackson.core
          jackson-annotations
          2.12.2
        
        
        
          com.alibaba
          druid
          1.1.10
        
        
        
          com.alibaba
          druid-spring-boot-starter
          1.1.10
        
        
        
          com.github.pagehelper
          pagehelper
          5.2.0
        
        
        
          com.github.jsqlparser
          jsqlparser
          4.0
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144

    粘贴位置:

    3、包解释:

    Spring需要的包:

      
          org.springframework
          spring-context
          4.3.18.RELEASE
        
        
        
          org.springframework
          spring-core
          4.3.18.RELEASE
        
    
        
        
          org.springframework
          spring-beans
          4.3.18.RELEASE
        
    
        
        
          org.springframework
          spring-web
          4.3.18.RELEASE
        
    
        
        
          org.springframework
          spring-webmvc
          4.3.18.RELEASE
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Mybatis需要的包:

    
    
    
      org.mybatis
      mybatis
      3.4.6
    
    
    
      mysql
      mysql-connector-java
      5.1.38
    
    
    
    
      org.springframework
      spring-jdbc
      4.3.18.RELEASE
    
    
    
      org.springframework
      spring-tx
      4.3.18.RELEASE
    
    
    
      org.mybatis
      mybatis-spring
      1.3.2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    jsp与servlet需要的包:

    
    
    
      javax.servlet
      jstl
      1.2
    
    
    
      javax.servlet
      javax.servlet-api
      3.1.0
      provided
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    数据库连接池DBCP:

    
    
      commons-dbcp
      commons-dbcp
      1.4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Json:

    
    
    
      com.alibaba
      fastjson
      1.2.47
    
    
    
      com.fasterxml.jackson.core
      jackson-databind
      2.12.2
    
    
    
      com.fasterxml.jackson.core
      jackson-core
      2.12.2
    
    
      com.fasterxml.jackson.core
      jackson-annotations
      2.12.2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    JDBC组件:

    
    
      com.alibaba
      druid
      1.1.10
    
    
    
      com.alibaba
      druid-spring-boot-starter
      1.1.10
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    分页:

    
    
      com.github.pagehelperpagehelper
      5.2.0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    复杂sql处理:

    
    
      com.github.jsqlparser
      jsqlparser
      4.0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4、创建资源文件夹:

    打开项目层级,看到包已经下载好了,并引入成功,但是【src】下只有webapp,所以需要鼠标右键创建需要的4个文件夹。

    在【src】上点击鼠标右键,创建四个文件夹:

    全选并回车创建

    项目层级:

    5、创建数据库链接在资源文件【jdbc.properties】

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com:3306/test?characterEncoding=utf8
    username=qwe8403000
    password=Qwe8403000
    #下面在有需要配置就行,没有需要不用记那么多,用的话过来复制
    #初始化链接数量
    initialSize=0
    #最大连接数,一般20够测试了
    maxActive=20
    #最多多少空闲在
    maxIdle=20
    #最少多少空闲在
    minIdle=1
    #最大等待时间
    maxWait=60000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    6、在【resources】下创建【mapper】文件夹与【UsersMapper.xml】测试类文件

    
    
    
        
        
        
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    7、Spring配置文件【applicationContext.xml】的创建

    配置文件: (有详细的注解)

    
    
    
        
        
            
        
        
        
            
            
            
            
        
    
        
        
            
            
            
            
            
        
    
        
        
            
            
            
            
        
    
        
        
            
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    8、spring-mvc配置文件spring-mvc.xml配置

    配置编码:

    
    
        
        
        
        
        
        
        
        
            
            
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    9、创建各层级【模型层model】、【数据层dao】、【控制器controller】、【业务逻辑接口层service】、【业务逻辑实现层serviceimpl】、【视图层resources/webapp/views】

    当前所有的层级以及包名,还差一个webapp下【WEB-INF/web.xml】没配置。

    10、webapp下【WEB-INF/web.xml】配置

    替换配置

    
    
      demo_515
      
      
        index.jsp
      
    
      
      
        org.springframework.web.context.ContextLoaderListener
      
    
      
      
        contextConfigLocation
        classpath:applicationContext.xml
      
      
      
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
          encoding
          utf-8
        
    
        
          forceEncoding
          true
        
      
      
        CharacterEncodingFilter
        /*
      
    
      
      
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
          contextConfigLocation
          classpath:spring-mvc.xml
        
        1
        true
      
    
      
        springmvc
        /
      
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    替换效果:(注释写在的相对好理解,不理解的留言)

    11、创建测试数据库(也可以直接用我的,连接不变即可)

    /*
     Navicat Premium Data Transfer
    
     Source Server         : myALi
     Source Server Type    : MySQL
     Source Server Version : 50732
     Source Host           : rm-bp1zq3879r28p726lco.mysql.rds.aliyuncs.com:3306
     Source Schema         : test
    
     Target Server Type    : MySQL
     Target Server Version : 50732
     File Encoding         : 65001
    
     Date: 24/05/2022 21:59:06
    */
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for users
    -- ----------------------------
    DROP TABLE IF EXISTS `users`;
    CREATE TABLE `users`  (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号',
      `userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户账号',
      `pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户密码',
      `nickName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户姓名',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表
    
    这个表是用来记录用户的基础信息
    
    ' ROW_FORMAT = Dynamic;
    
    -- ----------------------------
    -- Records of users
    -- ----------------------------
    INSERT INTO `users` VALUES (1, '文日红', '123456', '有一姑娘,清扬婉兮。');
    INSERT INTO `users` VALUES (2, '杨春红', '1234657', '灿如春华,皎若明月');
    INSERT INTO `users` VALUES (3, '顾容菲', '123', '二九年华,娉婷姌嫋。');
    INSERT INTO `users` VALUES (4, '韦文静', '1234', '明眸善睐,靥辅承权,瑰姿艳逸,仪静体闲。');
    INSERT INTO `users` VALUES (5, '卢雪', '12345', '落落大方,英姿飒爽。');
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    12、完成各层级编码(具体注解与逻辑下篇文章具体讲解)

    需要5个文件,依次是【模型层Users】、【数据层UsersMapper】、【业务逻辑接口层UsersService】、【业务逻辑实现层UsersServiceImpl】、【控制层UsersController】、【视图层GetInfo.jsp】顺序如果错了回看到层层报错,将所有文件编写完才能不报红,所以建议按照顺序来。

    【模型层Users】

    package com.item.model;
    
    public class Users {
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        public String getNickName() {
            return nickName;
        }
    
        public void setNickName(String nickName) {
            this.nickName = nickName;
        }
    
        @Override
        public String toString() {
            return "Users{" +
                    "id=" + id +
                    ", userName='" + userName + ''' +
                    ", pwd='" + pwd + ''' +
                    ", nickName='" + nickName + ''' +
                    '}';
        }
    
        private int id;
        private String userName;
        private String pwd;
        private String nickName;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    【数据层UsersMapper】

    package com.item.dao;
    
    import com.item.model.Users;
    import org.apache.ibatis.annotations.Param;
    
    import java.util.List;
    
    public interface UsersMapper {
        List GetInfo();
        List SelectName(@Param("nickName") String nickName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    【业务逻辑接口层UsersService】

    package com.item.service;
    
    import com.item.model.Users;
    import java.util.List;
    
    public interface UsersService {
        List GetInfo();
        List SelectName(String nickName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    【业务逻辑实现层UsersServiceImpl】

    package com.item.serviceimpl;
    
    import com.item.dao.UsersMapper;
    import com.item.model.Users;
    import com.item.service.UsersService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class UsersServiceImpl implements UsersService {
        @Autowired
        private UsersMapper usersMapper;
    
        @Override
        public List GetInfo() {
            return usersMapper.GetInfo();
        }
    
        @Override
        public List SelectName(String nickName) {
            return usersMapper.SelectName(nickName);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    【控制层UsersController】

    package com.item.controller;
    
    import com.item.model.Users;
    import com.item.service.UsersService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.servlet.http.HttpServletRequest;
    import java.util.List;
    
    @Controller
    @CrossOrigin
    public class UsersController {
        @Autowired
        private UsersService usersService;
    
        @RequestMapping("/GetInfoApi")
        @ResponseBody
        public Object GetInfoApi(){
            List list=usersService.GetInfo();
            System.out.println(list);
            return list;
        }
        @RequestMapping("/GetInfo")
        public String GetInfo(HttpServletRequest request,Model model){
            List list=usersService.GetInfo();
            model.addAttribute("lists",list);
            return "GetInfo";
        }
    
        @RequestMapping("/GetName")
        public String GetName(HttpServletRequest request,Model model){
            String nickName = request.getParameter("nickName");
            List list=usersService.SelectName(nickName);
            model.addAttribute("lists",list);
            return "GetInfo";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    【视图层GetInfo.jsp】

    <%@ page import="java.util.List" %>
    <%@ page import="com.item.model.Users" %><%--
    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2022/5/24 0024
      Time: 22:08
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
        
    
    
    
    <% List lists = (List) request.getAttribute("lists");%> <% for (Users u : lists) { %> <% } %>
    编号 账号 密码 昵称
    <%=u.getId()%> <%=u.getUserName()%> <%=u.getPwd()%> <%=u.getNickName()%>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    13、配置Tomcat

    去掉麻烦的路径:

    14、启动测试

    看到successfully,并且启动中没有错误提示代表启动成功。

    15、接口访问测试

    基本路径:【http://localhost:8088/

    api接口路径:【http://localhost:8088/GetInfoApi

    视图路径:【http://localhost:8088/GetInfo

    跨域测试(编码如下):

    
    
    
    
        
        
        
        Document
        
    
    
    
        
        
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    自行创建一个【index.html】用作测试:

    打开后,F12,看控制台【Console】,点击一下【测试】按钮即可看到数据。

    希望能给大家带来帮助,欢迎一键三连哦。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    el-table 多选回显,分页回显
    python+django+vue某小区物业管理系统
    Grafana+Prometheus打造运维监控系统(二)-数据获取篇-node_exporter
    【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?
    ScriptableObject数据容器讲解
    前端缓存汇总
    CentOS 9 Stream 上安装 WebStorm
    java auth 随笔 0-shiro
    Greenplum 查找数据目录占用最大的表
    CentOS 7 openssl 3.0.10 rpm包制作 —— 筑梦之路
  • 原文地址:https://blog.csdn.net/bsegebr/article/details/126114186