[黑马程序员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.开发控制器类

//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)@ResponseBodypublic String save(@RequestBody User user) {System.out.println("user save..." + user);return "{'moudle':'user save'}";}@RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id) {System.out.println("user delete..." + id);return "{'moudle':'user delete'}";}@RequestMapping(value = "/users", method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user) {System.out.println("user update..." + user);return "{'moudle':'user update'}";}@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id) {System.out.println("user getById..." + id);return "{'moudle':'user getById'}";}@RequestMapping(value = "/users", method = RequestMethod.GET)@ResponseBodypublic 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;@Overridepublic 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@PostMappingpublic 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@PutMappingpublic 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@GetMappingpublic 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;@Overridepublic 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: chinauser:name_1: itcastage: 16a:b:c:d:e: 123likes:- game- music- sleeplikes2: [ game,music,sleep ]users3:- name: zhangsanage: 45- name: lisiage: 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;@GetMappingpublic 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: chinauser:name_1: itcastage: 16a:b:c:d:e: 123likes:- game- music- sleeplikes2: [ game,music,sleep ]users3:- name: zhangsanage: 45- name: lisiage: 23baseDir: 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;@GetMappingpublic 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中@Autowiredprivate Environment environment;@GetMappingpublic 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: chinauser:name_1: itcastage: 16a:b:c:d:e: 123likes:- game- music- sleeplikes2: [ game,music,sleep ]users3:- name: zhangsanage: 45- name: lisiage: 23baseDir: c\windows#tempDir: c\windows\temp
tempDir: ${baseDir}\temp
#使用引号包裹的字符串,其中的转义字符可以生效
tempDir1: "${baseDir}\temp \t1 \t2 \t3"datasource:driver: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost/springboot_dbusername: rootpassword: 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;}@Overridepublic 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中@Autowiredprivate Environment environment;@Autowiredprivate MyDataSource myDataSource;@GetMappingpublic 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 {@Overridepublic 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.注入你要测试的对象@Autowiredprivate BookDao bookDao;@Testvoid 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;@Overridepublic 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 {@Autowiredprivate BookDao bookDao;@Testvoid contextLoads() {System.out.println(bookDao.getById(11));}}

application.yml

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3308/test_dbusername: rootpassword: 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;@Overridepublic 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.Driverurl: jdbc:mysql://localhost:3308/test_dbusername: rootpassword: 666666mybatis-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 {@Autowiredprivate BookDao bookDao;@Testvoid contextLoads() {System.out.println(bookDao.selectById(2));}@Testvoid 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;@Overridepublic 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.DruidDataSourcespring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3308/test_dbusername: rootpassword: 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 {@Autowiredprivate BookDao bookDao;@Testvoid 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.rhkb.cn/news/168819.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序——后台交互

目录 后台准备 pom.xml 配置数据源 整合mtbatis 前后端交互 method1 method2 后台准备 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org…

解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题

文章目录 问题描述解决方案1. 创建树形表格2. 实现全选功能3. 实现多选功能4. 实现子节点勾选5. 实现父节点勾选 结论 &#x1f389;欢迎来到Java学习路线专栏~解决Vue 3 Element Plus树形表格全选多选以及子节点勾选的问题 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博…

RabbitMQ运行机制和通讯过程介绍

文章目录 1.RabbitMQ 环境搭建2.RabbitMQ简介3.RabbitMQ的优势&#xff1a;4. rabbitmq服务介绍4.1 rabbitmq关键词说明4.2 消息队列运行机制4.3 exchange类型 5.wireshark抓包查看RabbitMQ通讯过程 1.RabbitMQ 环境搭建 参考我的另一篇&#xff1a;RabbitMQ安装及使用教程&am…

数据结构数组 Array 手写实现,扩容原理

数组数据结构 数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一组具有相同类型数据的集合。 数组的特点&#xff1a; 数组是相同数据类型的元素集合&#xff08;int 不能存放 double&#xff09;数组中各元素的存储是有先…

(免费领源码)php#mysql红色旅游网站99214-计算机毕业设计项目选题推荐

摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于旅游服务管理也是十分常见的。过去使用手工的管理方式对旅游服务进行管理&#xff0c;造成了管理繁琐、难以维护等问题&#xff0c;如今使用计算机对旅游服务的各项基本信息进…

2023年10月24日程序员节

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Coreldraw2020最新64位电脑完整版本下载教程

安装之前所有的杀毒软件都要退出。无论是360&#xff0c;腾讯管家&#xff0c;或者电脑自带的安全中心&#xff0c;要不然会阻止安装。 CorelDRAW2020版win下载如下:https://wm.makeding.com/iclk/?zoneid55678 CorelDRAW2020版mac下载如下:https://wm.makeding.com/iclk/?…

linux下安装配置maven

一. 下载maven安装包 安装 maven 环境前&#xff0c;需要先安装 java 环境&#xff0c;笔者这里已经成功安装 java 环境&#xff0c;如果没有安装 java 环境&#xff0c;可以参考&#xff1a;https://blog.csdn.net/qq_44936392/article/details/133931321?spm1001.2014.3001.…

.net6部署到linux上(CentOS Linux 7)

目录 一、先在linux上配置.net环境 添加 Microsoft 包存储库 安装 SDK 安装运行时 检查 SDK 版本可使用终端查看当前安装的 .NET SDK 版本。 打开终端并运行以下命令。 二、创建.net6 mvc项目 并发布 创建项目 修改默认端口 打包发布到文件夹 运行打包项目查看项目是否…

redis 数据结构

一、为什么要扒一下底层技术 首先我是一个解决方案工程师&#xff0c;为什么要看redis底层的设计呢&#xff1f;总结下来分几点&#xff1a; 1. 让系统跑起来更放心 2. 面试中可以对跟对面的牛马侃大山、吹&#x1f42e; 3. 虚一点&#xff0c;举一反三&#xff0c;学习一下…

SocketBase类库

SocketBase类库主要是方便创建Socket客户端和Socket服务端的基础实现。 抽象基类&#xff1a;主要实现创建Socket public abstract class NetworkBase{} 通用基类&#xff1a;指定了消息的解析规则&#xff0c;指定了数据转换的规则 的基本实现 /// <summary>/// 支持长…

Kotlin函数作为参数指向不同逻辑(二)

Kotlin函数作为参数指向不同逻辑&#xff08;二&#xff09; fun sum(): (Int, Int) -> Int {return { a, b -> (a b) } }fun multiplication(): (Int, Int) -> Int {return { a, b -> (a * b) } }fun math(a: Int, b: Int, foo: (Int, Int) -> Int): Int {ret…

基于OpenAPI、freemarker动态生成swagger文档

前言 spring项目中可以使用springfox或者springdoc&#xff0c;通过写注解的方式生成swagger文档&#xff0c;下面介绍一种不写注解&#xff0c;动态生成swagger文档的方式&#xff0c;在某些场景会适用&#xff0c;例如接口是动态生成的&#xff0c;此时swagger就不能通过注解…

Xshell+screen解决ssh连接 服务器掉线的问题

Linux screen命令解决SSH远程服务器训练代码断开连接后运行中断_linux screen ssh-CSDN博客 Linux命令之screen命令_linux screen_恒悦sunsite的博客-CSDN博客 使用教程&#xff1a; 这里粗略介绍一下 &#xff08;1&#xff09;xshell xftp&#xff08;xshell点这个&#…

解救Kubernetes混乱:Descheduler快速实现资源平衡

By default, Kubernetes doesn’t recompute and rebalance workloads. You could have a cluster with fewer overutilized nodes and others with a handful of pods How can you fix this? 关注【云原生百宝箱】公众号&#xff0c;快速掌握云原生 默认情况下&#xff0c;Ku…

Linux_API_系列-整体概览

总论 Linux下API编程不像Windows一样&#xff0c;对每种设备和不同功能都有统一的API&#xff0c;所以有了《Windows核心编程》这种导论一类的大而全的书籍&#xff0c;整本书厚的像一块砖头。 Linux下贯彻了一贯的“一切皆文件”的宗旨&#xff0c;所以对于系统编程而言&…

RabbitMQ相关的其他知识点

RabbitMQ相关的其他知识点 一、幂等性1.1 概念1.2 消息重复消费1.3 消费端的幂等性保障 二、优先队列2.1 应用场景2.2 实现原理2.3 代码实现 三、惰性队列3.1 定义3.2 应用场景3.3 两种设置模式3.4 内存开销对比 一、幂等性 1.1 概念 用户对于同一操作发起的一次请求或者多次请…

初识JAVA,带你入门

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

操作系统学习笔记7-IO管理

文章目录 1、IO管理学什么(学习逻辑图)2、IO管理硬件知识-IO设备的分类(硬件分类)3、IO管理硬件知识-IO控制方式的发展过程4、IO管理硬件知识-IO控制方式-程序直接控制方式5、IO管理硬件知识-IO控制方式-中断控制方式6、IO管理硬件知识-IO控制方式-DMA控制方式7、IO管理硬件知识…

中心胖AP(AD9430DN)+远端管理单元RU(R240D)+出口网关,实现组网

适用于&#xff1a;V200R008至V200R019C00版本的万兆中心胖AP&#xff08;AD9431DN-24X&#xff09;。 组网规划 RU管理&#xff1a;VLAN 100&#xff0c;网段为192.168.100.0/24。 无线业务&#xff1a;VLAN 3&#xff0c;SSID为“wlan-net”&#xff0c;密码为“88888888”…