目录:
- SpringBoot入门案例(Idea联网版)
- SpringBoot入门案例(官网创建版)
- SpringBoot入门案例(阿里云版)
- SpringBoot入门案例(手工制作版)
- 教你一招,隐藏文件或文件夹
- 入门案例解析:parent
- 入门案例解析:starter
- 入门案例解析:引导类
- 入门案例解析:辅助功能
- REST风格简介
- RESTfuI入门案例
- RESTful快速开发
- 复制模块
- 属性配置方式
- 基础配置
- 3种配置文件类型
- 配置文件加载优先级
- 属性提示消失解决方案
- yaml数据格式
- 读取yaml单一属性数据
- yaml文件中的变量引用
- 读取yaml全部属性数据
- 读取yaml引用类型属性数据
- SpringBoot整合JUnit
- 整合JUnit--classes属性
- SpringBoot整合MyBatis
- SpringBoot整合MyBatis常见问题处理
- SpringBoot整合MyBatisPlus
- SpringBoot整合Druid
- 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程序需要确保联网且能够加载到程序框架结构
小结:
- 开发SpringBoot程序可以根据向导进行联网快速制作
- SpringBoot程序需要基于JDK8进行制作
- SpringBoot程序中需要使用何种功能通过勾选选择技术
- 运行SpringBoot程序通过运行Application程序入口进行
2.SpringBoot入门案例(官网创建版)
- 基于SpringBoot官网创建项目,地址: https://start.spring.io/
步骤:
- 打开SpringBoot官网,选择Quickstart Your Project
- 创建工程,并保存项目
- 解压项目,通过IDE导入项目
3.SpringBoot入门案例(阿里云版)
- 基于SpringBoot官网创建项目,地址: https://start.spring.io/
- 基于阿里云创建项目,地址: https://start.aliyun.com
- 阿里云提供的坐标版本较低,如果需要使用高版本,进入工程后手工切换SpringBoot版本
- 阿里云提供的工程模板与Spring官网提供的工程模板略有不同
步骤:
- 选择start来源为自定义URL
- 输入阿里云start地址
- 创建项目
4.SpringBoot入门案例(手工制作版)
手工创建项目(手工导入坐标)
手工创建项目(手工制作引导类)
步骤:
- 创建普通Maven工程
- 继承spring-boot-starter-parent
- 添加依赖spring-boot-starter-web
- 制作引导类Application
5.教你一招,隐藏文件或文件夹
隐藏指定文件/文件夹
Idea中隐藏指定文件或指定类型文件 Setting → File Types → Ignored Files and Folders
- 输入要隐藏的文件名,支持*号通配符
- 回车确认添加
6.入门案例解析:parent
SpringBoot简介
- SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
- Spring程序缺点
- 依赖设置繁琐
- 配置繁琐
- SpringBoot程序优点
- 起步依赖(简化依赖配置)
- 自动配置(简化常用工程相关配置)
- 辅助功能(内置服务器, ……)
- 开发springBoot程序要继承spring-boot-starter-parent
- spring-boot-starter-parent中定义了若干个依赖管理
- 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
- 继承parent的形式也可以采用引入依赖的形式实现效果
7.入门案例解析:starter
- starter
- SpringBoot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
- parent
- 所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖), 以达到减少依赖冲突的目的
- spring-boot-starter-parent各版本间存在着诸多坐标版本不同
- 实际开发
- 使用任意坐标时,仅书写GAV中的G和A, V由SpringBoot提供,除非SpringBoot未提供对应版本V
- 如发生坐标错误,再指定Version(要小心版本冲突)
总结:
- 开发springBoot程序需要导入坐标时通常导入对应的starter
- 每个不同的starter根据功能不同,通常包含多个依赖坐标
- 使用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
总结:
- 内嵌Tomcat服务器是SpringBoot辅助功能之一
- 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
- 变更内嵌服务器思想是去除现有服务器,添加全新的服务器
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.复制模块
原则
- 保留工程基础结构
- 抹掉原始工程痕迹
总结:
- 在工作空间中复制对应工程,并修改工程名称
- 删除与Idea相关配置文件,仅保留src目录与pom.xml文件
- 修改pom.xml文件中的artifactId与新工程/模块名相同
- 删除name标签(可选)
- 保留备份工程供后期使用
14.属性配置方式
修改配置
- 修改服务器端口
- server.prot=80
- 关闭运行日志图标(banner)
- spring.main.banner-mode=off
- 设置日志相关
- logging.level.root=debug
springbooot内置属性查询
15.基础配置
- SpringBoot中导入对应starter后,提供对应配置属性
- 书写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;}
}
运行结果:
- 使用@Value配合SpEL读取单个数据
- 如果数据存在多层级,依次书写层级名称即可
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;}
}
运行结果:
小结:
- 在配置文件中可以使用${属性名}方式引用属性值
- 如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析
22.读取yaml全部属性数据
- 使用Environment对象封装全部配置信息
- 使用@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引用类型属性数据
- 使用@ConfigurationProperties注解绑定配置信息到封装类中
- 封装类需要定义为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();}
}
项目结构:
运行结果:
小结:
- 导入测试对应的starter
- 测试类使用@SpringBootTest修饰
- 使用自动装配的形式添加要测试的对象
25.整合JUnit--classes属性
小结:
- 测试类如果存在于引导类所在包或子包中无需指定引导类
- 测试类如果不存在于引导类所在的包或子包中需要通过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
运行结果:
小结:
- 勾选MyBatis技术,也就是导入MyBatis对应的starter
- 数据库连接相关信息转换成配置
- 数据库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区别
- 导入坐标不同
- 数据层实现简化
小结:
- 手工添加MyBatis-Plus对应的starter
- 数据层接口使用BaseMapper简化开发
- 需要使用的第三方技术无法通过勾选确定时,需要手工添加坐标
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功能,做一层测一层
- 调通页面,确认异步提交成功后,制作所有功能
- 添加分页功能与查询功能