[黑马程序员SpringBoot2]——基础篇1

news2024/12/30 2:19:18

 目录:

  1.  SpringBoot入门案例(Idea联网版)
  2. SpringBoot入门案例(官网创建版)
  3. SpringBoot入门案例(阿里云版)
  4. SpringBoot入门案例(手工制作版)
  5. 教你一招,隐藏文件或文件夹
  6. 入门案例解析:parent
  7. 入门案例解析:starter
  8. 入门案例解析:引导类
  9. 入门案例解析:辅助功能
  10. REST风格简介
  11. RESTfuI入门案例
  12. RESTful快速开发
  13. 复制模块
  14. 属性配置方式
  15. 基础配置
  16. 3种配置文件类型
  17. 配置文件加载优先级
  18. 属性提示消失解决方案
  19. yaml数据格式
  20. 读取yaml单一属性数据
  21. yaml文件中的变量引用
  22. 读取yaml全部属性数据
  23. 读取yaml引用类型属性数据
  24. SpringBoot整合JUnit
  25. 整合JUnit--classes属性
  26. SpringBoot整合MyBatis
  27. SpringBoot整合MyBatis常见问题处理
  28. SpringBoot整合MyBatisPlus
  29. SpringBoot整合Druid
  30. SSMP整合案例制作分析 

1.SpringBoot入门案例(Idea联网版)

SpringBoot入门程序开发

  • SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程


SpringBoot基础配置

1.创建新模块,选择Spring Initializr,并配置模块相关基础信息

2.选择当前模块需要使用的技术集

3.开发控制器类

//Rest模式
@RestController
@RequestMapping("/books")
public class BookController {
@GetMapping
public String getById(){
System.out.println("springboot is running...");
return "springboot is running...";
}
}

4.运行自动生成的Application类

5.运行结果:

入门案例

最简SpringBoot程序所包含的基础文件

  • pom.xml文件

  • Application类

    package com.example._20231018;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

Spring程序与SpringBoot程序对比


注意:基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构
 

小结:

  1. 开发SpringBoot程序可以根据向导进行联网快速制作
  2. SpringBoot程序需要基于JDK8进行制作
  3. SpringBoot程序中需要使用何种功能通过勾选选择技术
  4. 运行SpringBoot程序通过运行Application程序入口进行
     

2.SpringBoot入门案例(官网创建版)

  • 基于SpringBoot官网创建项目,地址: https://start.spring.io/

步骤: 

  1. 打开SpringBoot官网,选择Quickstart Your Project
  2. 创建工程,并保存项目
  3. 解压项目,通过IDE导入项目
     

3.SpringBoot入门案例(阿里云版) 

  • 基于SpringBoot官网创建项目,地址: https://start.spring.io/

  • 基于阿里云创建项目,地址: https://start.aliyun.com

  • 阿里云提供的坐标版本较低,如果需要使用高版本,进入工程后手工切换SpringBoot版本
  • 阿里云提供的工程模板与Spring官网提供的工程模板略有不同

步骤: 

  1. 选择start来源为自定义URL
  2. 输入阿里云start地址
  3.  创建项目

4.SpringBoot入门案例(手工制作版) 

手工创建项目(手工导入坐标)

手工创建项目(手工制作引导类)

步骤: 

  1. 创建普通Maven工程
  2. 继承spring-boot-starter-parent
  3. 添加依赖spring-boot-starter-web
  4. 制作引导类Application

 5.教你一招,隐藏文件或文件夹

隐藏指定文件/文件夹


 

Idea中隐藏指定文件或指定类型文件 Setting → File Types → Ignored Files and Folders

  • 输入要隐藏的文件名,支持*号通配符
  • 回车确认添加

 6.入门案例解析:parent

SpringBoot简介

  • SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
  • Spring程序缺点
    • 依赖设置繁琐
    • 配置繁琐
  • SpringBoot程序优点
    • 起步依赖(简化依赖配置)
    • 自动配置(简化常用工程相关配置)
    •  辅助功能(内置服务器, ……)
       
  1. 开发springBoot程序要继承spring-boot-starter-parent
  2. spring-boot-starter-parent中定义了若干个依赖管理
  3. 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
  4. 继承parent的形式也可以采用引入依赖的形式实现效果

 7.入门案例解析:starter

  • starter
    • SpringBoot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
  • parent
    • 所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖), 以达到减少依赖冲突的目的
    • spring-boot-starter-parent各版本间存在着诸多坐标版本不同
  • 实际开发
    • 使用任意坐标时,仅书写GAV中的G和A, V由SpringBoot提供,除非SpringBoot未提供对应版本V
    • 如发生坐标错误,再指定Version(要小心版本冲突)

总结: 

  1. 开发springBoot程序需要导入坐标时通常导入对应的starter
  2. 每个不同的starter根据功能不同,通常包含多个依赖坐标
  3. 使用starter可以实现快速配置的效果,达到简化配置的目的 

8.入门案例解析:引导类

Application.class

package com.example._20231018;

import com.example._20231018.controller.BookController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args);
        BookController bean = ctx.getBean(BookController.class);
        System.out.println(bean);
        User user = ctx.getBean(User.class);
        System.out.println(user);
    }

}

运行结果:

 启动方式

  • SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
  • SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean
     

 9.入门案例解析:辅助功能

内置服务器

  • tomcat(默认)        apache出品,粉丝多, 应用面广,负载了若干较重的组件
  • jetty                      更轻量级, 负载性能远不及tomcat
  • undertow              undertow,负载性能勉强跑赢tomcat

总结:

  1. 内嵌Tomcat服务器是SpringBoot辅助功能之一
  2. 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
  3. 变更内嵌服务器思想是去除现有服务器,添加全新的服务器

10.REST风格简介

REST简介

  • REST (Representational State Transfer),表现形式状态转换

传统风格资源描述形式

  • http: / /localhost/user/getById?id=1
  • http: / /localhost/user/ saveUser 

REST风格描述形式

  • http: / / localhost/user/1
  • http: / / localhost/user 

REST风格优点:

  • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作书写简化 

按照REST风格访问资源时使用行为动作区分对资源进行了何种操作

  • http: / / localhost/users       查询全部用户信息     GET(查询)
  • http: / / localhost/users/1    查询指定用户信息     GET(查询)
  • http: / / localhost/users       添加用户信息            POST(新增/保存)
  • http: / / localhost/users       修改用户信息            PUT(修改/更新)
  • http:// localhost/users/1      删除用户信息            DELETE (删除)

根据REST风格对资源进行访问称为RESTful 

  • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
  • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、account.…..

11.RESTfuI入门案例 

UserController.class

package com.example._20231018.controller;

import com.example._20231018.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
public class UserController {
    @RequestMapping(value = "/users", method = RequestMethod.POST)
    @ResponseBody
    public String save(@RequestBody User user) {
        System.out.println("user save..." + user);
        return "{'moudle':'user save'}";
    }

    @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id) {
        System.out.println("user delete..." + id);
        return "{'moudle':'user delete'}";
    }

    @RequestMapping(value = "/users", method = RequestMethod.PUT)
    @ResponseBody
    public String update(@RequestBody User user) {
        System.out.println("user update..." + user);
        return "{'moudle':'user update'}";
    }


    @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
    @ResponseBody
    public String getById(@PathVariable Integer id) {
        System.out.println("user getById..." + id);
        return "{'moudle':'user getById'}";
    }

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    @ResponseBody
    public String getAll() {
        System.out.println("user getAll...");
        return "{'moudle':'user getAll'}";
    }
}

User.class

package com.example._20231018;
import org.springframework.stereotype.Component;

@Component
public class User {
    public String name;
    public Integer age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

项目结构:

postman验证接口:

新增操作

删除操作:

修改操作:

查询单个操作:

查询全部操作:

运行结果:

 

@RequestBody @RequestParam @PathVariable


区别

  • @RequestParam用于接收url地址传参或表单传参
  • @RequestBody用于接收json数据
  • @PathVariable用于接收路径参数,使用{参数名称}描述路径参数

应用

  • 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
  • 如果发送非json格式数据,选用@RequestParam接收请求参数
  • 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值 

 12.RESTful快速开发

BookController.class

package com.example._20231018.controller;

import com.example._20231018.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

//@Controller
//@ResponseBody
@RestController
@RequestMapping("/books")
public class BookController {
    //    @RequestMapping(method = RequestMethod.POST)
    //    @ResponseBody
    @PostMapping
    public String save(@RequestBody Book book) {
        System.out.println("book save..." + book);
        return "{'moudle':'book save'}";
    }

    //    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    //    @ResponseBody
    @DeleteMapping("/{id}")
    public String delete(@PathVariable Integer id) {
        System.out.println("book delete..." + id);
        return "{'moudle':'book delete'}";
    }

    //    @RequestMapping(method = RequestMethod.PUT)
    //    @ResponseBody
    @PutMapping
    public String update(@RequestBody Book book) {
        System.out.println("book update..." + book);
        return "{'moudle':'book update'}";
    }

    //    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    //    @ResponseBody
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id) {
        System.out.println("book getById..." + id);
        return "{'moudle':'book getById'}";
    }

    //    @RequestMapping(method = RequestMethod.GET)
    //    @ResponseBody
    @GetMapping
    public String getAll() {
        System.out.println("book getAll...");
        return "{'moudle':'book getAll'}";
    }
}

Book.class

package com.example._20231018;

import org.springframework.stereotype.Component;

@Component
public class Book {
    public String name;
    public int price;

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

postman测试接口:

新增操作:

删除操作:

 修改操作:

查询单个操作:

查询全部操作:

运行结果:

总结:

 

13.复制模块 

原则

  • 保留工程基础结构
  •  抹掉原始工程痕迹
     

总结: 

  1. 在工作空间中复制对应工程,并修改工程名称
  2. 删除与Idea相关配置文件,仅保留src目录与pom.xml文件
  3. 修改pom.xml文件中的artifactId与新工程/模块名相同
  4. 删除name标签(可选)
  5. 保留备份工程供后期使用 

14.属性配置方式 

 

修改配置

  • 修改服务器端口 
    • server.prot=80
  • 关闭运行日志图标(banner)
    • spring.main.banner-mode=off
  • 设置日志相关
    • logging.level.root=debug

 springbooot内置属性查询

 15.基础配置

  1. SpringBoot中导入对应starter后,提供对应配置属性
  2. 书写SpringBoot配置采用关键字+提示形式书写 

16.3种配置文件类型

  • 配置文件格式

  • SpringBoot提供了多种属性配置方式
     

总结:

  • SpringBoot提供了3种配置文件的格式
    • properties (传统格式 /默认格式)
    • yml(主流格式)
    • yaml

 17.配置文件加载优先级

  • SpringBoot配置文件加载顺序
    • application.properties > application.yml > application.yaml
  • 常用配置文件种类
    • application.yml

小结:

1.配置文件间的加载优先级

  • properties(最高)
  • yml
  • yaml(最低)

2. 不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
 

18.属性提示消失解决方案

 

小结:

  • 指定SpringBoot配置文件
    • setting →Project Structure Facets
    • 选中对应项目/工程·
    • customize Spring Boot
    • 选择配置文件 

19.yaml数据格式 

 

小结:

1. yaml语法规则

  • 大小写敏感
  • 属性层级关系使用多行描述,每行结尾使用冒号结束
  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
  • #表示注释

2.注意属性名冒号后面与数据之间有一个空格
3.字面值、对象数据格式、数组数据格式

20.读取yaml单一属性数据

 yaml与yml文件有啥不同?

  • YAML(Yet Another Markup Language)和YML(YAML)没有区别,它们是同一种文件格式的不同文件扩展名。
  • YAML 是一种可读性高、用途广泛的数据序列化格式。它参考了其他多种语言,包括C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。YAML 文件使用缩进和换行等符号来表示层次结构和序列关系,从而达到编写简单易读的数据文档的目的。
  • 由于历史原因,许多 Windows 程序员仍然不敢使用具有三个以上字符的扩展名,因此选择使用 yml 代替。但这只是一种习惯,并不影响文件的解析或者使用。
  • 因此,YAML 和 YML 是同一个文件格式的不同文件扩展名,只是习惯上大家更常使用 YAML 这个名称。

 示例:读取application.yml文件

country: china

user:
  name_1: itcast
  age: 16

a:
  b:
    c:
      d:
        e: 123

likes:
  - game
  - music
  - sleep

likes2: [ game,music,sleep ]


users3:
  - name: zhangsan
    age: 45

  - name: lisi
    age: 23

ReadYmlController.class

package com.example.demo_01.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/read")
public class ReadYmlController {
    @Value("${country}")
    private String country_variable;

    @Value("${user.name_1}")
    private String name_variable;

    @Value("${user.age}")
    private Integer age_variable;

    @Value("${a.b.c.d.e}")
    private Integer e_variable;

    @Value("${likes[1]}")
    private String music_variable;

    @Value("${likes2[0]}")
    private String game_variable;

    @Value("${users3[0].name}")
    private String name111_variable;

    @GetMapping
    public String showVariable() {
        System.out.println(country_variable);
        System.out.println(name_variable);
        System.out.println(age_variable);
        System.out.println(e_variable);
        System.out.println(music_variable);
        System.out.println(game_variable);
        System.out.println(name111_variable);

        return country_variable + name_variable + age_variable + e_variable + music_variable + game_variable + name111_variable;
    }
}

 运行结果:

 

  1. 使用@Value配合SpEL读取单个数据
  2. 如果数据存在多层级,依次书写层级名称即可 

21.yaml文件中的变量引用

application.yml

country: china

user:
  name_1: itcast
  age: 16

a:
  b:
    c:
      d:
        e: 123

likes:
  - game
  - music
  - sleep

likes2: [ game,music,sleep ]


users3:
  - name: zhangsan
    age: 45

  - name: lisi
    age: 23

baseDir: c\windows

#tempDir: c\windows\temp
tempDir: ${baseDir}\temp
#使用引号包裹的字符串,其中的转义字符可以生效
tempDir1: "${baseDir}\temp \t1 \t2 \t3"

ReadYmlController.class

package com.example.demo_01.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/read")
public class ReadYmlController {
    @Value("${country}")
    private String country_variable;

    @Value("${user.name_1}")
    private String name_variable;

    @Value("${user.age}")
    private Integer age_variable;

    @Value("${a.b.c.d.e}")
    private Integer e_variable;

    @Value("${likes[1]}")
    private String music_variable;

    @Value("${likes2[0]}")
    private String game_variable;

    @Value("${users3[0].name}")
    private String name111_variable;

    @Value("${tempDir}")
    private String temp_dir_variable;

    @Value("${tempDir1}")
    private String temp_dir1_variable;

    @GetMapping
    public String showVariable() {
        System.out.println(country_variable);
        System.out.println(name_variable);
        System.out.println(age_variable);
        System.out.println(e_variable);
        System.out.println(music_variable);
        System.out.println(game_variable);
        System.out.println(name111_variable);
        System.out.println(temp_dir_variable);
        System.out.println(temp_dir1_variable);

        return country_variable +
                name_variable +
                age_variable +
                e_variable +
                music_variable +
                game_variable +
                name111_variable +
                temp_dir_variable +
                temp_dir1_variable
                ;
    }
}

运行结果:

 

小结:

  1. 在配置文件中可以使用${属性名}方式引用属性值
  2. 如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析 

22.读取yaml全部属性数据

  1. 使用Environment对象封装全部配置信息
  2. 使用@Autowired自动装配数据到Environment对象中 

 示例:

ReadYmlController.class

package com.example.demo_01.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/read")
public class ReadYmlController {
    @Value("${country}")
    private String country_variable;

    @Value("${user.name_1}")
    private String name_variable;

    @Value("${user.age}")
    private Integer age_variable;

    @Value("${a.b.c.d.e}")
    private Integer e_variable;

    @Value("${likes[1]}")
    private String music_variable;

    @Value("${likes2[0]}")
    private String game_variable;

    @Value("${users3[0].name}")
    private String name111_variable;

    @Value("${tempDir}")
    private String temp_dir_variable;

    @Value("${tempDir1}")
    private String temp_dir1_variable;

    //使用自动装配将所有的数据封装到一个对象Environment中
    @Autowired
    private Environment environment;

    @GetMapping
    public String showVariable() {
        System.out.println(country_variable);
        System.out.println(name_variable);
        System.out.println(age_variable);
        System.out.println(e_variable);
        System.out.println(music_variable);
        System.out.println(game_variable);
        System.out.println(name111_variable);
        System.out.println(temp_dir_variable);
        System.out.println(temp_dir1_variable);
        System.out.println("---------------------------------");
        System.out.println(environment.getProperty("country"));
        System.out.println(environment.getProperty("user.age"));

        return country_variable +
                name_variable +
                age_variable +
                e_variable +
                music_variable +
                game_variable +
                name111_variable +
                temp_dir_variable +
                temp_dir1_variable
                ;
    }
}

运行结果:

23.读取yaml引用类型属性数据

 

 

  1. 使用@ConfigurationProperties注解绑定配置信息到封装类中
  2. 封装类需要定义为Spring管理的bean,否则无法进行属性注入 

代码示例:

application.yml

country: china

user:
  name_1: itcast
  age: 16

a:
  b:
    c:
      d:
        e: 123

likes:
  - game
  - music
  - sleep

likes2: [ game,music,sleep ]


users3:
  - name: zhangsan
    age: 45

  - name: lisi
    age: 23

baseDir: c\windows

#tempDir: c\windows\temp
tempDir: ${baseDir}\temp
#使用引号包裹的字符串,其中的转义字符可以生效
tempDir1: "${baseDir}\temp \t1 \t2 \t3"



datasource:
  driver: com.mysql.jdbc.Driver
  url: jdbc:mysql://localhost/springboot_db
  username: root
  password: 666666

 MyDataSource.class

package com.example.demo_01.entity;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

//1.定义数据模型封装yamL文件中对应的数据
//2.定义为spring管控的bean
//3.指定加载的数据
@Component
@ConfigurationProperties("datasource")
public class MyDataSource {
    private String driver;
    private String url;
    private String username;
    private String password;

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "MyDataSource{" +
                "driver='" + driver + '\'' +
                ", url='" + url + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

ReadYmlController.class

package com.example.demo_01.controller;

import com.example.demo_01.entity.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/read")
public class ReadYmlController {
    @Value("${country}")
    private String country_variable;

    @Value("${user.name_1}")
    private String name_variable;

    @Value("${user.age}")
    private Integer age_variable;

    @Value("${a.b.c.d.e}")
    private Integer e_variable;

    @Value("${likes[1]}")
    private String music_variable;

    @Value("${likes2[0]}")
    private String game_variable;

    @Value("${users3[0].name}")
    private String name111_variable;

    @Value("${tempDir}")
    private String temp_dir_variable;

    @Value("${tempDir1}")
    private String temp_dir1_variable;

    //使用自动装配将所有的数据封装到一个对象Environment中
    @Autowired
    private Environment environment;

    @Autowired
    private MyDataSource myDataSource;

    @GetMapping
    public String showVariable() {
        System.out.println(country_variable);
        System.out.println(name_variable);
        System.out.println(age_variable);
        System.out.println(e_variable);
        System.out.println(music_variable);
        System.out.println(game_variable);
        System.out.println(name111_variable);
        System.out.println(temp_dir_variable);
        System.out.println(temp_dir1_variable);
        System.out.println("---------------------------------");
        System.out.println(environment.getProperty("country"));
        System.out.println(environment.getProperty("user.age"));
        System.out.println("---------------------------------");
        System.out.println(myDataSource);

        return country_variable +
                name_variable +
                age_variable +
                e_variable +
                music_variable +
                game_variable +
                name111_variable +
                temp_dir_variable +
                temp_dir1_variable
                ;
    }
}

运行结果:

 

24.SpringBoot整合JUnit

  • 名称: @SpringBootTest
  • 类型:测试类注解
  • 位置:测试类定义上方
  • 作用:设置JUnit加载的SpringBoot启动类
  • 范例: 

代码示例:

BookDao.interface

package com.example.junit.Dao;

public interface BookDao {
    public void save();
}

 BookDaoImpl.class

package com.example.junit.Dao.impl;

import com.example.junit.Dao.BookDao;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {
    @Override
    public void save() {
        System.out.println("book dao is running ...");
    }
}

JunitApplicationTests.class

package com.example.junit;

import com.example.junit.Dao.BookDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class JunitApplicationTests {
    //1.注入你要测试的对象
    @Autowired
    private BookDao bookDao;


    @Test
    void contextLoads() {
        //2.执行要测试的对象对应的方法
        bookDao.save();
    }
}

项目结构:

运行结果:

小结:

  1. 导入测试对应的starter
  2. 测试类使用@SpringBootTest修饰
  3. 使用自动装配的形式添加要测试的对象

 25.整合JUnit--classes属性

小结:

  1. 测试类如果存在于引导类所在包或子包中无需指定引导类
  2. 测试类如果不存在于引导类所在的包或子包中需要通过classes属性指定引导类 

26.SpringBoot整合MyBatis

整合MyBatis

  • 核心配置:数据库连接相关信息(连什么?连谁?什么权限)
  • 映射配置:SQL映射(XML/注解)

 

 

代码示例:

BookDao.interface

package com.example._20231023.dao;


import com.example._20231023.domain.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface BookDao {
    @Select("select * from tbl_book where id = #{id}")
    public Book getById(Integer id);
}

Book.class

package com.example._20231023.domain;

public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", type='" + type + '\'' +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Application.Tests

package com.example._20231023;

import com.example._20231023.dao.BookDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ApplicationTests {

    @Autowired
    private BookDao bookDao;

    @Test
    void contextLoads() {
        System.out.println(bookDao.getById(11));
    }

}

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3308/test_db
    username: root
    password: 666666

运行结果:

小结:

  1. 勾选MyBatis技术,也就是导入MyBatis对应的starter
  2. 数据库连接相关信息转换成配置
  3. 数据库SQL映射需要添加@Mapper被容器识别到 

 27.SpringBoot整合MyBatis常见问题处理

  • MySQL 8.X驱动强制要求设置时区
    • 修改url,添加serverTimezone设定
    • 修改MySQL数据库配置(略)
  • 驱动类过时,提醒更换为com.mysql.cj.jdbc.Driver 

28.SpringBoot整合MyBatisPlus 

BookDao.interface

package com.example._20231024.dao;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example._20231024.domain.Book;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface BookDao extends BaseMapper<Book> {

}

 Book.class

package com.example._20231024.domain;

public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", type='" + type + '\'' +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3308/test_db
    username: root
    password: 666666

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_

ApplicationTests

package com.example._20231024;

import com.example._20231024.dao.BookDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ApplicationTests {

    @Autowired
    private BookDao bookDao;

    @Test
    void contextLoads() {
        System.out.println(bookDao.selectById(2));
    }

    @Test
    void testGetAll() {
        System.out.println(bookDao.selectList(null));
    }
}

运行结果:

MyBatis-Plus与MyBatis区别

  • 导入坐标不同
  • 数据层实现简化 

 

小结:

  1. 手工添加MyBatis-Plus对应的starter
  2. 数据层接口使用BaseMapper简化开发
  3. 需要使用的第三方技术无法通过勾选确定时,需要手工添加坐标

29.SpringBoot整合Druid

整合任意第三方技术

  • 导入对应的starter
  • 配置对应的设置或采用默认配置

代码示例:

BookDao.interface

package com.example.dao;

import com.example.domain.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface BookDao {
    @Select("select * from tbl_book where id = #{id}")
    public Book getById(Integer id);
}

 Book.class

package com.example.domain;

public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", type='" + type + '\'' +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

application.yml

#spring:
#  datasource:
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://localhost:3308/test_db
#    username: root
#    password: 666666
#    type: com.alibaba.druid.pool.DruidDataSource

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3308/test_db
      username: root
      password: 666666

 ApplicationTests

package com.example;

import com.example.dao.BookDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ApplicationTests {

    @Autowired
    private BookDao bookDao;

    @Test
    void contextLoads() {
        System.out.println(bookDao.getById(3));
    }

}

运行结果:

小结:

  • 整合Druid需要导入Druid对应的starter
  • 根据Druid提供的配置方式进行配置
  • 整合第三方技术通用方式
    • 导入对应的starter
    • 根据提供的配置格式,配置非默认值对应的配置项

30.SSMP整合案例制作分析

SSMP整合案例

  • 案例效果演示
  • 案例实现方案分析
    • 实体类开发---使用Lombok快速制作实体类
    • Dao开发----整合MyBatisPlus,制作数据层测试类
    • Service开发----基于MyBatisPlus进行增量开发,制作业务层测试类
    • Controller开发----基于Restful开发,使用PostMan测试接口功能
    • Controller开发----前后端开发协议制作
    • 页面开发--基于VUE+ElementuI制作,前后端联调,页面数据处理,页面消息处理
      • 列表、新增、修改、删除、分页、查询
    • 项目异常处理
    • 按条件查询--—页面功能调整、controller修正功能、Service修正功能

小结:

  • SSMP案例效果演示
  • SSMP案例制作流程解析
    • 先开发基础CRUD功能,做一层测一层
    • 调通页面,确认异步提交成功后,制作所有功能
    • 添加分页功能与查询功能 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大数据】Hadoop

文章目录 概述Hadoop组成HDFSMapReduce写MapReduce程序&#xff08;Hadoop streaming&#xff09; YARNHadoop 启动 工作方式Hadoop的主从工作方式Hadoop的守护进程 运行模式本地运行模式伪分布式运行模式完全分布式运行模式 Hadoop高可用的解决方案ZooKeeper quorumZKFC 环境搭…

k8s集群镜像下载加gradana监控加elk日志收集加devops加秒杀项目

展示 1.配套资料2.devops 3.elk日志收集 4.grafana监控 5.dashboard![在这里插入图片描述](https://img-blog.csdnimg.cn/bf294f9fd98e4c038858a6bf5c34dbdc.png 目的 学习k8s来来回回折腾很久了&#xff0c;光搭个环境就能折腾几天。这次工作需要终于静下心来好好学习了一…

WebAPI项目在Linux服务器上部署记录

对已有的WebAPI项目进行发布 发布流程 需要把publish的文件夹直接上传至linux服务器 在Linux服务器上部署环境 检查是否安装了dotnet环境 直接命令行输入 dontnet&#xff0c;如果弹出的是下面的语句&#xff0c;说明没有安装dotnet环境 -bash: dotnet:command not found…

软件开发工具总结篇

作为软件开发人员&#xff0c;我们需要使用许多工具来帮助我们完成工作。这些工具包括编程语言、编辑器、集成开发环境&#xff08;IDE&#xff09;和其他辅助工具。在本文中&#xff0c;我们将讨论一些常见的软件开发工具&#xff0c;并对它们进行比较。 编程语言 编程语言是…

SpringCloud复习:(1)netflix包里的DiscoveryClient类

DiscoveryClient类实现了EurekaClient接口 它的主要作用&#xff1a;服务注册&#xff0c;服务续约&#xff0c;服务下线&#xff0c;获取服务列表。 initScheduledTasks方法用来开启定时任务来完成上述功能。 上图中的代码用来从服务器定期&#xff08;默认30秒&#xff09;…

TLSR825x之BDT烧录固件

泰凌烧录调试工具&#xff08;BDT&#xff09;适用于泰凌全系列。在SDK开发过程中&#xff0c;BDT的功能包括“擦除Flash扇区”、“下载固件”、“通信失败时激活MCU”、“访问包括FLASH /CORE /ANALOG /OTP在内的存储空间”、“读/写全局变量”和“查看USB 日志”。 泰凌BDT_…

解密一致性哈希算法:实现高可用和负载均衡的秘诀

解密一致性哈希算法&#xff1a;实现高可用和负载均衡的秘诀 前言第一&#xff1a;分布式系统中的数据分布问题&#xff0c;为什么需要一致性哈希算法第二&#xff1a;一致性hash算法的原理第三&#xff1a;一致性哈希算法的优点和局限性第四&#xff1a;一致性哈希算法的安全性…

初识JAVA,带你入门

本章重点&#xff1a; 1. Java语言简介、发展概述、语言优势、与C/C区别 2. 初识Java程序入口之main方法 3. 注释、标识符、关键字 1. Java语言概述 1.1 Java是什么&#xff1f; Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法和易于理解的语义…

结构体、枚举、位段、联合体详解

&#x1f388;个人主页&#xff1a;.满船清梦压星河_-CSDN博客 &#x1f302;c/c领域新星创作者 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xf…

虚拟机安装centos系统后配置桥接网络

一.桥接网络和nat网络的区别 桥接模式 通过使用物理机网卡 具有单独ip,但是需要手动配置。 在bridged模式下&#xff0c;VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机&#xff0c;它可以访问网内任何一台机器。主机网卡和虚拟网卡的IP地址处于同一个网段&#xff…

SVN服务数据迁移(windows)

1.原服务器和目标服务器都要安装VISUALSVN SERVER(官方下载地址) 2.在原svn服务器备份 得到备份文件&#xff0c;并传至新服务器 3.在新服务器恢复备份 选择备份文件 输入仓库名 4.检验文件和历史记录是否完整

我的创作纪念日 - 第四年

机缘 几乎自己的所有文章都用同一个模板&#xff0c;虽然高效&#xff0c;但也乏味&#xff0c;就让每年都有一次例外吧。 不知不觉已经过去了四年了&#xff0c;虽然很早就在CSDN查阅资料&#xff0c;但是真正落笔创作是在4年前。那个时候自己已经是一个从事培训讲师&#x…

人机关系中不但有“是否”还有“是非”

“是否”和“是非”的区别在于它们所提问的内容和性质不同。 “是否”用于提问某个事件或行为是否发生或存在&#xff0c;通常可以回答“是”或“否”。例如&#xff0c;“你今天早上吃早餐了吗&#xff1f;”这个问题用的就是“是否”&#xff0c;可以回答“是”或“否”。 而…

【JavaEE】网络编程---TCP数据报套接字编程

一、TCP数据报套接字编程 1.1 ServerSocket API ServerSocket 是创建TCP服务端Socket的API ServerSocket 构造方法&#xff1a; ServerSocket 方法&#xff1a; 1.2 Socket API Socket 是客户端Socket&#xff0c;或服务端中接收到客户端建立连接&#xff08;accept方法&…

IP-guard发布新版本4.82.624.0

http://www.tec-development.com/down/IPguard/Release/V4/IPguard4.82.0624.0.zip?s=44869B0835D388673FC6DB5F45C1E0E876895C1108B86C7E76877511EB1018A4http://www.tec-development.com/down/IPguard/Release/V4/IPguard4.82.0624.0.zip?s=44869B0835D388673FC6DB5F45C1E0…

JAVA-TreeSet使用方式

1. TreeSet 在一次写力扣题的时候&#xff0c;用到了TreeSet&#xff0c;这里记录一下TreeSet的常用方式。 TreeSet的特点&#xff1a;有序&#xff0c;不可重复&#xff0c;红黑树&#xff0c;基于Treemap实现&#xff0c;自定义排序等特点。 java中实现的Set有HashSet ,Lin…

thinkphp 解决跨域的三个方式

1. 在tp入口index.php 加上header //支持跨域 header("Access-Control-Allow-Origin:*"); header(Access-Control-Allow-Methods:*); header(Access-Control-Allow-Headers:x-requested-with, content-type,token); 2. 在route.php加上 allowCrossDomain()&#xff…

自定义指令与Apollo:定制化数据查询与变更

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【ArcGIS模型构建器】04:根据矢量范围批量裁剪影像栅格数据

本文以中国2000-2010-2020年3期GLC30土地覆盖数据为例,演示用模型构建器批量裁剪出四川省3年的数据。 文章目录 一、结果预览二、模型构建三、运行模型四、注意事项一、结果预览 用四川省行政区数据裁剪出的3年Globeland30(配套实验数据data04.rar中有三年中国区域成品数据)…

永磁无刷直流(无框)力矩电机brushless DC motor (BLDCM)

(无框)力矩电机&#xff0c;全称应该为永磁无刷直流(无框)力矩电机&#xff0c;其显著的特征是&#xff1a; 较大的径长比&#xff08;diameter-to-length ratio&#xff09;较多数目的磁极&#xff08;magnet poles&#xff09; 无框架电机是传统电机中用于产生扭矩和速度的…