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

目录:

  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.开发控制器类

bash 复制代码
//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类

    bash 复制代码
    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入门案例(官网创建版)

步骤:

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

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

  • 阿里云提供的坐标版本较低,如果需要使用高版本,进入工程后手工切换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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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(最低)
  1. 不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留

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文件

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
package com.example.junit.Dao;

public interface BookDao {
    public void save();
}

BookDaoImpl.class

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
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

bash 复制代码
#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

bash 复制代码
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功能,做一层测一层
    • 调通页面,确认异步提交成功后,制作所有功能
    • 添加分页功能与查询功能
相关推荐
程序员是干活的3 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
freellf8 天前
数据结构及基本算法
1024程序员节
BruceGerGer25 天前
flutter开发实战-flutter web加载html及HtmlElementView的使用
flutter·1024程序员节
网络冒险家2 个月前
【软考】系统集成项目管理工程师【第二版】
职场和发展·软考·集成学习·1024程序员节·系统集成项目工程师
BruceGerGer2 个月前
flutter开发实战-AssetBundle读取指定packagename的文件
flutter·1024程序员节
sheng12345678rui2 个月前
最新缺失msvcp140.dll的多种解决方法,有效解决电脑dll问题
windows·microsoft·电脑·dll文件·1024程序员节
a5553338203 个月前
电脑显示mfc140u.dll丢失的修复方法,总结7种有效的方法
java·经验分享·dll·dll文件丢失·1024程序员节
行十万里人生3 个月前
C++ 智能指针
linux·c++·git·阿里云·容器·蓝桥杯·1024程序员节
a5553338203 个月前
启动鸣潮提示错误代码126:加载d3dcompiler_43.dll错误或缺失的7个解决方法
前端·经验分享·dll·dll文件丢失·1024程序员节
BruceGerGer3 个月前
flutter开发实战-Webview及dispose关闭背景音
flutter·1024程序员节