写在前面

今天是2022.9.19,黑马程序员开课,一共两周左右的时间,在这里记录一下学习的过程。

技术栈简介

maven: 自动下载 jar,从中央仓库 (国外,全球所有公开的jar)。

Day1

需求2:书写一个请求

  1. 书写一个请求,用来接收浏览器发起的get请求,如:https://localhost:8080/books/2

  2. 在idea控制台输出,参数接受情况

  3. 在访问后,返回数据,显示在页面上。

    1. 返回数据成功
  4. 代码:

    1. ~~~java
      package com.example.demo.controller;

      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;

      import java.util.ArrayList;
      import java.util.List;

      //标明是控制层,用来接收前端数据
      @RestController
      //前端请求本类时,需要加一个前缀,ip/books
      @RequestMapping(“/books”)
      public class BookController {

      @RequestMapping("/getbook")
      public String getBookById(Integer id){
          return "hello springboot"+id;
      }
      
      @RequestMapping("/getlist")
      public List<String> getBooks(){
          ArrayList<String> strings = new ArrayList<>();
      
          strings.add("计算机基础");
          strings.add("凡人修仙传");
          strings.add("遮天");
          return strings;
      }

      }

      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

      ### 需求3:增加其他请求方法

      1. 接收2个普通参数,如http://localhost:8080/books/getById?id=2&name=zs

      2. @RequestParam注解用来绑定前端参数和方法形参,解决方法形参名和前端参数不一致的问题

      3. 当前端参数和形参名一致的时候,@RequestParam可以省略

      4. @GetMapping("/getById")注解在方法上,表示访问这个方法的路径是:类名路经+方法路径,如:books/getById?参数1=参数值&参数2=参数值

      5. 上述的结果是返回一个字符串,接下来,返回一个集合数据,相当于返回数据库中的多列数据

      1. ~~~java
      //4种常见的请求方式
      // get获取
      // post增加
      // put修改
      // delete删除
      @GetMapping("getById")
      //http://localhost:8080/books/getById?id=2&name=zs
      public String getById3(@RequestParam Integer id,@RequestParam("name") String name){
      System.out.println("id:"+id+" "+name);
      return "getById3 hello ,springboot " + id+" "+name;
      }
      /**
      * 需求:返回一个字符串的集合:如涉外学院 财经学院 长沙学院
      * 路经:http://localhost:8080/books/list
      */
      @GetMapping("/List")
      public List<String> getList(){
      ArrayList<String> strings = new ArrayList<>();
      strings.add("涉外学院");
      strings.add("财经学院");
      strings.add("长沙学院");

      return strings;
      }
    2. 返回成功

需求5:修改访问端口8080为80

  1. 将application.properties后缀名改为yml

  2. 输入port,根据提示修改 80

    1. 修改后

    2. 重新运行

    3. 观察控制台

    4. 在依赖中添加:

      1. <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                </dependency>
        
        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

        5. 在controller类中,新建R:

        1. ~~~java
        package com.example.demo.controller;

        import lombok.Data;

        import java.util.HashMap;
        import java.util.Map;

        @Data
        public class R<T> {
        private Integer code;//编码,1成功,0和其他数字失败
        private String msg;//错误信息
        private T data;//数据
        private Map map = new HashMap();//动态数据

        public static <T> R<T> success(T object){
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        return r;
        }

        public static <T> R<T> error(String msg){
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
        }

        public R<T> add(String key,Object value){
        this.map.put(key,value);
        return this;
        }
        }
        ### 需求6:查询数据库之准备数据
  3. 新建数据库

  4. DROP TABLE IF EXISTS `tbl_book`;
    CREATE TABLE `tbl_book`(
        `id` int(11) PRIMARY KEY AUTO_INCREMENT,
        `type` varchar(100) ,
        `name` varchar(100) ,
        `description` varchar(100)
    );
    
    INSERT INTO `tbl_book` VALUES ('1','计算机理论','spring实战第5版','Spring入门经典教程');
    INSERT INTO `tbl_book` VALUES ('2','计算机理论','spring 5核心原理与30个类手写实战','10年沉淀之作,手写Spring精华思想');
    INSERT INTO `tbl_book` VALUES ('3','计算机理论','Spring 5 设计模式','深入Spring源码剖析');
    INSERT INTO `tbl_book` VALUES ('4','计算机理论','Spring MVC+MyBatis 开发从入门到项目实战','全方位解析面向web应用的轻量级开发框架');
    INSERT INTO `tbl_book` VALUES ('5','计算机理论','轻量级 Java Web企业项目实战','源码级剖析Spring框架');
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    3. ![数据表已经建好](/images/python/image-20220919224532480.png)

    4. 在com.example.demo的包中中创建domain包,在包中创建Book对象

    1. 使用@TableName注解爆红:在依赖中导入

    1. ~~~java
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
    </dependency>
    2. ~~~java package com.example.demo.domain; import com.baomidou.mybatisplus.annotation.TableName; @TableName("tbl_book") public class Book { private Integer id; private String name; private String type; private String description; public Book(Integer id, String name, String type, String description) { this.id = id; this.name = name; this.type = type; this.description = description; } public Integer getId() { return id; } public String getName() { return name; } public String getType() { return type; } public String getDescription() { return description; } public void setId(Integer id) { this.id = id; } public void setName(String name) { this.name = name; } public void setType(String type) { this.type = type; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return "Book{" + "id=" + id + ", name='" + name + '\'' + ", type='" + type + '\'' + ", description='" + description + '\'' + '}'; } }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    3. 再添加两个依赖

    1. ~~~java
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.9</version>
    </dependency>
    2. 在yml文件中配置数据库设置 1. ~~~java spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/swdb?serverTimezone=UTC username: root password: 100122200
    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

    ### 需求8:完成数据的增删改查



    ![成功](/images/python/image-20220919234438299.png)

    删除:

    ![image-20220919234822041](/images/python/image-20220919234822041.png)

    ![删除成功](/images/python/image-20220919234905297.png)

    ## Day2

    ### 需求9 完成SpringBoot参数传递

    1. 请求方式

    1. get --参数是在路径上,参数在请求行上,参数的大小有限制,一般只能传2k,安全性较低,因此get用于获取资源
    2. post --参数是在请求体,参数的大小无限制,参数在请求体中,安全性较高,用于提交用户数据
    3. put --提交参数,数据一般在请求体中
    4. delete --用来删除数据
    5. restfull风格:使用请求方式来区分请求的动作
    6. 网络三要素:ip、port、协议
    7. http协议的特点:
    1. 请求数据(请求行、请求头、请求体)和响应数据
    2. 一次请求对应一次响应
    3. http协议是无状态的,不能读取上一次请求的信息 --解决方案:会话技术:cookie(存在浏览器中),session(存在服务器中,占内存)

    2. ~~~java
    package com.example.demo.controller;

    import com.example.demo.domain.Book;
    import com.example.demo.mapper.BookMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;

    import java.util.ArrayList;
    import java.util.List;

    //标明是控制层,用来接收前端数据
    @RestController
    //前端请求本类时,需要加一个前缀,ip/books
    @RequestMapping("/books")
    public class BookController {
    @Autowired
    BookMapper bookMapper;

    @GetMapping("/{id}")
    public R<Book> getBookById(@PathVariable Long id){

    Book book = bookMapper.selectById(id);
    book.setName("计算机基础");

    return R.success(book);
    }

    @GetMapping
    public R<List<Book>> getBooks(){
    List<Book> books = bookMapper.selectList(null);
    return R.success(books);
    }

    @PostMapping
    public R<String> saveBook(Book book){
    System.out.println(book);
    int insert = bookMapper.insert(book);
    return insert>0?R.success("save ok"):R.error("save failed");
    }

    //http://localhost:80/books/delete/id
    //@PathVariable 代表是路径参数,当路径参数和形参名字一样的时候,@PathVariable括号可以省略
    @DeleteMapping("/{id}")
    public R<String> deleteBook(@PathVariable Long id){
    System.out.println("删除id="+id);

    int i = bookMapper.deleteById(id);
    return i>0?R.success("delete ok"):R.error("delete failed");
    }

    //4种常见的请求方式
    // get获取
    // post增加
    // put修改
    // delete删除
    @GetMapping("getById")
    //http://localhost:8080/books/getById?id=2&name=zs
    public String getById3(@RequestParam Long id,@RequestParam("name") String name){
    System.out.println("id:"+id+" "+name);
    return "getById3 hello ,springboot " + id+" "+name;
    }
    /**
    * 需求:返回一个字符串的集合:如涉外学院 财经学院 长沙学院
    * 路经:http://localhost:8080/books/list
    */
    @GetMapping("/List")
    public List<String> getList(){
    ArrayList<String> strings = new ArrayList<>();
    strings.add("涉外学院");
    strings.add("财经学院");
    strings.add("长沙学院");

    return strings;
    }
    }