SpringBoot详解2:Web开发
引言
接下来,我们开始学习Spring Boot
的Web
开发,从这一章往后,就属于我们实战部分的内容了。
其实Spring Boot
的东西用起来非常简单,因为Spring Boot
最大的特点就是自动装配。
使用Spring Boot
的步骤:
1、创建一个Spring Boot
应用,选择我们需要的模块,Spring Boot
就会默认将我们的需要的模块自动配置好
2、手动在配置文件中配置部分配置项目就可以运行起来了。
3、专注编写业务代码,不需要考虑以前那样一大堆的配置了。
要熟悉掌握开发,之前学习的自动配置原理一定要搞明白!
比如:Spring Boot
到底帮我们配置了什么?我们能不能修改?我们能修改哪些配置?我们能不能扩展?
- **自动配置类(
xxxAutoconfiguration
):**向容器中自动配置组件(Bean
)。 - 属性配置类(
xxxProperties
):封装(properties
或yaml
)配置文件的内容,供自动配置类使用。
没事就找找类,看看自动装配原理!
我们之后来进行一个单体项目的小项目测试,让大家能够快速上手开发!
附:搭建Spring Boot开发环境
(1)在IDEA
中新建一个项目名称为:springboot-02-web
的Spring Initializr
项目。项目信息如下图所示:
(2)选择初始化的组件(勾选Spring Web
即可)和Spring Boot
的版本(我们这里选择2.7.7版)。
(3)填写项目路径,等待项目构建成功。
(4)先删除IDEA
自动生成的.mvn
文件夹、.gitignore
、HELP.md
、mvnw
、mvnw.cmd
文件。
(5)然后,在Settings
中手动配置Maven
的安装目录、配置文件和本地仓库。
**注:**若Maven
未识别到该子项目,则右键为其添加Maven
支持。
(6)在程序的主启动类(Springboot02WebApplication
)的同级目录下:
- 新建一个
controller
包,用于存放控制器代码; - 新建一个
service
包,用于存放业务层代码; - 新建一个
dao
包,用于存放持久层代码(映射器接口及其对应的映射器配置文件); - 新建一个
pojo
包,用于存放实体类; - 新建一个
utils
包,用于存放我们封装的各种工具; - 新建一个
config
包,用于存放自定义配置文件。
**注:**程序的主启动类一定要与controller
、service
、dao
、pojo
、utils
、config
包在同级目录下,否则识别不到【约定大于配置】。
(7)在controller
包下新建一个HelloController
类。
HelloController.java
文件:
1 | package com.atangbiji.controller; |
(8)启动主启动类中的main
函数,在浏览器中输入http://localhost:8080/hello
,页面访问成功。访问结果如下图所示:
11、静态资源处理
11.1、传统web项目访问静态资源
在传统的web
项目开发中,我们都是将所有的前端页面放在项目的webapp
(或web
)目录下。如下图所示:
注:
- 放在
WEB-INF
目录下的资源是受保护的,在浏览器上不能够通过路径直接访问。所以像HTML
、CSS
、JS
、image
等静态资源一定要放到WEB-INF
目录之外。 - 传统
Web
项目发布后,都会被放到Web服务器(Tomcat
)中指定的web应用文件夹下(webapps
目录)。(详见《Tomcat详解》)
11.2、Spring Boot项目访问静态资源
SpringBoot
项目中对静态资源的存放位置,是有规定的!
在Spring Boot
中,Spring MVC
的web
配置都在WebMvcAutoConfiguration
这个自动配置类中。
(1)全局搜索WebMvcAutoConfiguration
,可以发现:该类内部有一个WebMvcAutoConfigurationAdapter
静态类。
(2)点击进入WebMvcAutoConfigurationAdapter
类,可以发现其中有一个addResourceHandlers
( 添加资源处理器)方法。
WebMvcAutoConfiguration.java
文件:
1 |
|
分析上述函数可以发现:Spring Boot
默认会通过以下三种方式访问静态资源。
11.2.1、方式一:直接访问Webjars包特定目录下的静态资源(了解)
11.2.1.1、什么是webjars
?
WebJars
就是将客户端Web
库(如jQuery
、echarts
、layui
、Bootstrap
等)打包后生成的一个个 jar
(Java Archive
)包。
Spring Boot
源码在addResourceHandlers
函数中将URL
访问路径"/webjars/**"
映射到了项目的"classpath:/META-INF/resources/webjars/"
目录下。
这样,我们便可以通过URL
访问到Webjars
包"classpath:/META-INF/resources/webjars/"
目录下的静态资源文件了。
因此,我们可以将静态资源存放在项目的"classpath:/META-INF/resources/webjars/"
目录下。
注:我们一般不使用该方式访问我们自己编写的静态资源(如:HTML
、CSS
、JS
、image
等)。
11.2.1.2、访问示例
如:我们要访问并使用jQuery
库,我们只需要:
(1)去WebJars
官网查找jQuery
库的Maven
依赖,并将该依赖添加到Spring Boot
项目的pom.xml
文件中。
pom.xml
文件:
1 | <!-- jQuery的WebJars依赖 --> |
(2)导入完毕后,查看webjars
目录结构。如下图所示:
此时,我们便可以通过URL
(http://localhost:8080/webjars/**
)访问到Webjars
包"classpath:/META-INF/resources/webjars/"
目录下的静态资源了。
(3)启动主启动类中的main
函数,在浏览器中输入http://localhost:8080/webjars/jquery/3.4.1/jquery.js
,便可以成功访问jquery.js
文件。访问结果如下图所示:
11.2.2、方式二:直接访问本地默认路径下的静态资源
11.2.2.1、源码分析
继续分析addResourceHandlers
( 添加资源处理器)方法中的第二种静态资源映射规则,可以发现:其中调用了getStaticPathPattern
方法用于获取静态资源的URL
访问路径;调用了getStaticLocations
方法用于获取静态资源的本地存放目录。
(1)点击进入getStaticPathPattern
方法,可以发现静态资源的URL
访问路径为:"/**"
。
WebMvcProperties.java
文件:
1 | //静态资源访问路径 |
(2)点击进入getStaticLocations
方法,可以发现静态资源默认的本地存放目录为:"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"
。
WebProperties.java
文件:
1 | //静态资源默认的本地存放目录 |
即:Spring Boot
源码在addResourceHandlers
函数中将URL
访问路径"/**"
默认映射到了项目的"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"
目录下。
这样,我们便可以通过URL
访问项目默认目录下的静态资源文件了。
11.2.2.2、结论
- 我们可以将静态资源存放在项目的以下目录下:
1 | "classpath:/META-INF/resources/" |
- 访问上述四个目录的优先级为:
"classpath:/META-INF/resources/"
>"classpath:/resources/"
>"classpath:/static/"
>"classpath:/public/"
。
我们在项目的resources
根目录下新建对应的文件夹,都可以存放我们的静态文件。如:我们访问 http://localhost:8080/test.png
, Spring Boot
就会去默认的这些文件夹中寻找对应的静态资源test.png
文件。
注:我们一般使用这种方式访问我们自己编写的静态资源(如:HTML
、CSS
、JS
、image
等)。
11.2.3、方式三:自定义静态资源存放路径(了解)
我们也可以在(properties
或yaml
)配置文件中自定义静态资源的URL
访问路径和本地存放目录。如:
application.properties
文件:
1 | #自定义静态资源的URL访问路径 |
注:
- 一旦自己定义了静态资源的访问路径或本地存放目录,
Spring Boot
默认配置的访问路径或本地存放目录就会失效了! - 我们一般不自定义静态资源的访问路径和本地存放目录,而是使用默认的配置。
11.3、欢迎页定制
11.3.1、源码分析
Spring Boot
的欢迎页同样是在WebMvcAutoConfiguration
自动配置类中进行处理的。
(1)全局搜索WebMvcAutoConfiguration
,可以发现:该类内部有一个EnableWebMvcConfiguration
静态类。
(2)点击进入EnableWebMvcConfiguration
类,可以发现其中有一个welcomePageHandlerMapping
(欢迎页处理器映射)方法。
WebMvcAutoConfiguration.java
文件:
1 |
|
分析welcomePageHandlerMapping
(欢迎页处理器映射)方法,可以发现:其中调用了getWelcomePage
方法用于获取欢迎页面。
(3)点击进入getWelcomePage
方法。
WebMvcAutoConfiguration.java
文件:
1 | //获取欢迎页面 |
可以发现:Spring Boot
启动时默认会从默认的静态资源存放目录下搜索index.html
页面作为欢迎页面。
11.3.2、具体实现
(1)在静态资源的任一默认存放目录下,新建一个index.html
文件。
index.html
文件:
1 | <h1>Welcome to Spring Boot!</h1> |
(2)启动主启动类中的main
函数,在浏览器中输入http://localhost:8080/
,欢迎页面访问成功。访问结果如下图所示:
12、Thymeleaf模板引擎
12.1、模板引擎及其工作原理
前端交给我们的是html
页面。在以前的项目开发中,我们需要把它们转成jsp
页面,jsp
的好处就是我们可以把查出一些数据转发到jsp
页面,我们可以用jsp
轻松实现数据的显示和交互等。
jsp
的功能非常强大,包括能写Java
代码等。但是由于SpringBoot
项目是以jar
包的方式进行打包(不是war
包),且默认使用的是嵌入式的Tomcat
,所以:SpringBoot
默认是不支持jsp
的。
既然SpringBoot
不支持jsp
,如果我们直接用纯静态页面的方式,那么会给我们的开发会带来很大的麻烦,那怎么办呢?
SpringBoot
推荐我们使用模板引擎。
**注:**其实jsp
就是一个模板引擎。
模板引擎有非常多,如:SpringBoot
给我们推荐的Thymeleaf
,还有用的比较多的freemarker
等。但再多的模板引擎,它们的思想都是一样的,其工作原理如下图所示:
模板引擎的工作原理就是:将后端封装好的数据填充到前端写好的页面模板的表达式中,最终生成一个我们想要的前端页面。
- 不管是
jsp
,还是其他模板引擎,都是这个思想。 - 不同的模板引擎之间,只是在语法上有所不同。
12.2、Thymeleaf简介
Thymeleaf
是一个面向web
和非web
环境的现代服务器端Java
模板引擎。它是一个开源的Java
库,能够处理html
、xml
、text
、javascript
、css
、raw
等模型。
Thymeleaf
提供了一个用于整合Spring MVC
的可选模块,在项目开发中,我们可以使用Thymeleaf
来完全代替jsp
,或其他模板引擎,如Velocity
、FreeMarker
等。
Thymeleaf
官网:https://www.thymeleaf.org/Thymeleaf
在Github
上的主页:https://github.com/thymeleaf/thymeleaf
12.3、Thymeleaf自动配置规则
12.3.1、源码分析
根据Spring Boot
的自动配置原理,我们可以:
-
在自动配置的核心文件中找到
Thymeleaf
的自动配置类(org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration
)。 -
全局搜索
ThymeleafAutoConfiguration
自动配置类。ThymeleafAutoConfiguration.java
文件:1
2
3
4
5
6
7
8
9
10
11//表示这是一个自动配置类,和以前Spring中编写的xml配置文件一样,也可以向IOC容器中添加组件
//启动指定类的属性配置功能(参数:xxxProperties类为属性配置类)
//自动配置类生效的条件
public class ThymeleafAutoConfiguration {
……
} -
点击进入
Thymeleaf
的属性配置类(ThymeleafProperties
),我们可以在其中查看Spring Boot
中Thymeleaf
默认的自动配置规则。ThymeleafProperties.java
文件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8;
//默认前缀
public static final String DEFAULT_PREFIX = "classpath:/templates/";
//默认后缀
public static final String DEFAULT_SUFFIX = ".html";
private boolean checkTemplate = true;
private boolean checkTemplateLocation = true;
private String prefix = DEFAULT_PREFIX;
private String suffix = DEFAULT_SUFFIX;
private String mode = "HTML";
private Charset encoding = DEFAULT_ENCODING;
……
}
12.3.1、结论
通过分析上述源码,我们可以在发现Spring Boot
中Thymeleaf
默认的前缀为:"classpath:/templates/"
,默认的后缀为:".html"
。
因此,**使用Thymeleaf
我们什么都不需要配置,只需要把我们的html
页面存放在类路径下的templates
目录下即可。**这样,Thymeleaf
就可以帮助我们自动渲染前端页面了。
12.4、Thymeleaf的使用步骤
(1)添加Thymeleaf启动器依赖
在Spring
官方文档中:找到Thymeleaf
启动器,并将其依赖添加到项目的pom.xml
文件中。
pom.xml
文件:
1 | <!--thymeleaf依赖--> |
此时,Maven
会自动下载相应的jar
包,如下图所示:
(2)新建html页面并导入约束
在项目的templates
目录下新建一个test.html
测试页面。
test.html
文件:
1 |
|
注:
-
templates
目录下的所有页面,只能通过Controller
来跳转! -
我们要使用
Thymeleaf
,需要在html
文件中导入命名空间的约束,方便提示。1
xmlns:th="http://www.thymeleaf.org"
-
如果
html
页面中的表达式变量名爆红,那么我们可以在设置中取消Thymeleaf
的表达式变量验证。
(3)编写控制器
在项目的Controller
目录下新建一个TestController
类。
TestController.java
文件:
1 | package com.atangbiji.controller; |
(4)启动测试
启动主启动类中的main
函数,在浏览器中输入http://localhost:8080/thymeleaf/t1
,页面访问成功。访问结果如下图所示:
12.5、Thymeleaf语法
12.5.1、属性优先级
我们可以使用任意的th:xxx
来替换html
中原生属性的值。Thymeleaf
中可以使用的(全部)属性及优先级如下表所示:
12.5.2、表达式语法
(1)简单表达式
表达式名字 | 语法格式 | 用途 |
---|---|---|
变量表达式(Variable Expressions ) |
${…} | 获取变量的值 |
选择变量表达式(Selection Variable Expressions ) |
*{…} | 获取上下文变量的值,与${} 功能类似 |
消息表达式(Message Expressions ) |
#{…} | 获取国际化信息 |
链接表达式(Link URL Expressions ) |
@{…} | 定义URL |
代码块表达式(Fragment Expressions ) |
~{…} | 引用公共页面代码块 |
(2)字面常量
- 文本值(单引号):
'one text'
、'Another one!'
、… - 数字:
0
、34
、3.0
、12.3
、… - 布尔值:
true
,false
- 空值:
null
- 变量:
one
、sometext
、main
、…
(3)文本操作
- 字符串拼接:
+
- 文本替换:
|The name is ${name}|
(4)数学运算
+
、-
、*
、/
、%
(5)布尔运算
and
、or
、!
(not
)
(6)比较运算
>
、<
、>=
、<=
、==
、!=
(7)条件运算
-
If-then:
(if) ? (then)
-
If-then-else:
(if) ? (then) : (else)
-
Default:
(value) ?: (defaultvalue)
(8)无操作:_
注:
- 上述表达式中的所有功能都可以进行组合和嵌套。
Thymeleaf
中有很多样式,实际项目中需要使用什么,能够根据官方文档来查询才是最重要的,要熟练使用官方文档!
13、Spring MVC自动配置原理
13.1、Spring Boot MVC的默认配置
Spring Boot
为Spring MVC
提供了自动配置,它可以很好地与大多数应用程序一起工作。Spring Boot
中自动配置的Spring MVC
主要是在Spring
默认设置的基础上添加了以下功能:(详见Spring Boot官方文档)
(1)包含视图解析器( ContentNegotiatingViewResolver
和 BeanNameViewResolver
)。
-
我们之前学习
SpringMVC
时需要手动配置视图解析器,而Spring Boot
为我们自动配置了自动配置了视图解析器(ContentNegotiatingViewResolver
和BeanNameViewResolver
)。 -
ContentNegotiatingViewResolver
(内容协商视图解析器)主要用来组合所有的视图解析器,它能够根据Web
请求帮我们从候选视图解析器中选择最佳的视图解析器。 -
视图解析器根据方法的返回值取得视图对象(
View
),然后由视图对象决定如何渲染(转发、重定向)。
(2)支持静态资源处理,以及webjars
。(详见第11节《静态资源处理》)
(3)自动注册了很多转换器(Converter
)、通用转换器(GenericConverter
)和格式化器(Formatter
)。
-
转换器(
Converter
):主要用于把前端提交的数据自动转换成后台封装的对象。如:- 把
"1"
字符串自动转换为int
类型; - 把前端提交的用户信息(字段)转换为
User
实体类。
- 把
-
格式化器(
Formatter
):可以对日期格式的数据进行格式化,并封装成Date
对象。
**(4)支持 HttpMessageConverters
。**即支持Http
请求和响应的转换,如:把一个User
对象转换为JSON
字符串。
(5)自动注册了错误消息解析器(MessageCodesResolver
)。
(6)支持自定义首页(index.html
)。
(7)自动使用初始化数据绑定器(ConfigurableWebBindingInitializer
)。帮助我们把请求数据绑定到JavaBean
。
注:Spring Boot
中这么多的自动配置,原理都是一样的,我们要不断提升自己通过分析源码得出结论的能力。
13.2、增强Spring Boot MVC的默认配置
如果我们要在上述Spring Boot MVC
默认功能的基础上增加其它MVC
配置(拦截器、格式化程序、视图控制器以及其它功能),那么我们可以自定义一个类型为WebMvcConfigurer
的配置类(即WebMvcConfigurer
接口实现类),然后在该类上添加@configuration
注解,并且不能再该类上添加@EnableWebMvc
注解。
13.2.1、实现步骤
在上述项目的基础上:
(1)在程序的主启动类的同级目录下,新建一个config
包,用于存放自定义配置文件。
(2)在config
包下新建一个名称为MyMvcConfig
的WebMvcConfigurer
接口实现类,并为它添加@configuration
注解,将其定义成一个配置类。并在其中重写addInterceptors
方法以实现视图跳转功能。
MyMvcConfig.java
文件:
1 | package com.atangbiji.config; |
(3)运行主启动类中的main
函数,在浏览器中输入http://localhost:8080/test
,页面跳转成功。访问结果如下图所示:
13.2.2、源码分析
WebMvcAutoConfiguration
是SpringMVC
的自动配置类。
(1)全局搜索WebMvcAutoConfiguration
自动配置类。可以发现其内部有一个WebMvcAutoConfigurationAdapter
静态内部类,该类在做其它自动配置时会导入通过@Import
注解导入EnableWebMvcConfiguration
类。
WebMvcAutoConfiguration.java
文件:
1 |
|
(2)点击进入EnableWebMvcConfiguration
类,可以发现它继承了一个DelegatingWebMvcConfiguration
父类。
(3)点击进入DelegatingWebMvcConfiguration
类,可以发现它会从容器中获取所有的webMvcConfigurer
。
DelegatingWebMvcConfiguration.java
文件:
1 |
|
(4)我们可以在该类中去寻找一个我们刚才设置的viewController
作为参考,发现它调用了一个addViewControllers
方法。
DelegatingWebMvcConfiguration.java
文件:
1 |
|
(5)点击进入addViewControllers
方法。可以发现:它将所有与WebMvcConfigurer
相关的配置一起调用!包括我们自己配置的和Spring给我们配置的。
WebMvcConfigurerComposite.java
文件:
1 |
|
因此,我们可以得出**结论:**所有的WebMvcConfiguration
都会被作用,不止Spring
自己的配置类,我们自定义的配置类也会被调用。
注:
-
在
Spring Boot
中会有非常多的增强配置类,我们应该多留心注意。 -
如果我们希望在
Spring Boot MVC
默认功能的基础上使用自定义的RequestMappingHandlerMapping
、RequestMappingHandlerAdapter
或ExceptionHandlerExceptionResolver
的组件,那么我们可以声明一个WebMvcRegistrationAdapter
实例来提供这些组件的自定义实例。
13.3、全面接管Spring MVC(了解)
如果我们要全面接管Spring MVC
,那么只需在上述自定义的MVC
配置类中添加一个@EnableWebMvc
注解即可。
此时,Spring Boot
中所有的Spring MVC
自动配置都会失效!因此,实际开发中,我们不推荐全面接管SpringMVC
。
13.3.1、对比测试
在上述项目的基础上:
(1)不加@EnableWebMvc
注解之前
运行主启动类中的main
函数,在浏览器中输入http://localhost:8080/
,访问首页成功。访问结果如下图所示:
(2)添加@EnableWebMvc
注解之后
MyMvcConfig.java
文件:
1 | package com.atangbiji.config; |
重新运行主启动类中的main
函数,在浏览器中输入http://localhost:8080/
,访问首页失败。因为,自定义的WebMvcConfigurer
配置类全面接管Spring MVC
后,SpringBoot
默认给我们配置的静态资源映射会全部无效。访问结果如下图所示:
13.3.2、源码分析
(1)点击进入@EnableWebMvc
注解,可以发现:它通过@Import
注解导入了一个DelegatingWebMvcConfiguration
类。
EnableWebMvc.java
文件:
1 |
|
(2)点击进入DelegatingWebMvcConfiguration
类,发现它继承了一个WebMvcConfigurationSupport
父类。
DelegatingWebMvcConfiguration.java
文件:
1 |
|
(3)查看WebMvcAutoConfiguration
自动配置类。可以发现:当容器中没有WebMvcConfigurationSupport
这个组件(Bean
)时,这个自动配置类才生效。
WebMvcAutoConfiguration.java
文件:
1 |
|
因此,当我们在上述自定义的MVC
配置类中添加了@EnableWebMvc
注解后,Spring Boot
中所有的Spring MVC
自动配置都会失效!
14、使用JDBC操作数据库
14.1、Spring Data简介
Spring Data
也是Spring
中与Spring Boot
、Spring Cloud
等齐名的知名项目。对于数据访问层,无论是SQL
(关系型数据库)还是NOSQL
(非关系型数据库),Spring Boot
底层都是采用Spring Data
的方式进行统一处理。
-
Spring Data
官网:https://spring.io/projects/spring-data -
数据库相关的启动器为:
spring-boot-starter-data-xxx
,具体参见官方文档:https://docs.spring.io/spring-boot/docs/2.7.7/reference/htmlsingle/#using.build-systems.starters
14.2、搭建测试环境
(1)新建一个项目名称为:springboot-03-data
的Spring Initializr
项目。参见《使用IDEA创建项目》
(2)选择初始化的组件(此处勾选JDBC API
、MySQL Driver
即可)和Spring Boot
的版本(我们这里选择2.7.8版)。
(3)填写项目路径,等待项目构建成功。项目构建成功后,它会默认为我们导入JDBC
启动器和MySQL
驱动相关的依赖。
pom.xml
文件:
1 | <!-- JDBC启动器 --> |
(4)先删除IDEA
自动生成的.mvn
文件夹、.gitignore
、HELP.md
、mvnw
、mvnw.cmd
文件。
(5)然后,在Settings
中手动配置Maven
的安装目录、配置文件和本地仓库。
**注:**若Maven
未识别到该子项目,则右键为其添加Maven
支持。
(6)在程序的主启动类(Springboot03DataApplication
)的同级目录下:
- 新建一个
controller
包,用于存放控制器代码; - 新建一个
service
包,用于存放业务层代码; - 新建一个
dao
包,用于存放持久层代码(映射器接口及其对应的映射器配置文件); - 新建一个
pojo
包,用于存放实体类; - 新建一个
utils
包,用于存放我们封装的各种工具; - 新建一个
config
包,用于存放自定义配置文件。
**注:**程序的主启动类一定要与controller
、service
、dao
、pojo
、utils
、config
包在同级目录下,否则识别不到【约定大于配置】。
(7)在resources
目录下,新建一个application.yaml
配置文件,并在其中配置数据库连接信息。
application.yaml
文件:
1 | spring: |
**注:**我们这里连接的是在学习MyBatis
时创建的mybatis
数据库。其中的user
表如下图所示:
14.3、查看Spring Boot默认配置的数据源
按上述步骤完成测试环境搭建后,Spring Boot
默认会帮我们完成JDBC
相关的自动配置,我们直接去使用即可。
接下来,我们在测试类中对使用的数据源进行测试。
(1)编写测试函数。
Springboot03DataApplicationTests.java
文件:
1 | package com.atangbiji; |
(2)启动测试类(Springboot03DataApplicationTests
),输出结果如下图所示:
结论:Spring Boot
默认给我们配置的数据源为 : Hikari
数据源(class com.zaxxer.hikari.HikariDataSource
)。
注:
HikariDataSource
号称是Java WEB
当前速度最快的数据源,相比于传统的C3P0
、DBCP
、Tomcat jdbc
等连接池更加优秀。Spring Boot 2.0
以上版本默认使用的是Hikari
数据源。- 而以前版本(如
Spring Boot 1.5
)默认使用org.apache.tomcat.jdbc.pool.DataSource
作为数据源。 - 我们可以通过配置
spring.datasource.type
属性的值来指定其它的数据源,该属性的值为将要使用的数据源(数据库连接池)的完全限定名。
附:源码分析
Spring Boot
中,JDBC
数据源的自动配置是在org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
这个自动配置类中完成的,与之对应的属性配置类是DataSourceProperties
。具体分析过程参见《Spring Boot自动配置原理》
14.4、JDBCTemplate模板类
-
有了数据源(
com.zaxxer.hikari.HikariDataSource
),然后我们就可以拿到数据库连接(java.sql.Connection
);有了数据库连接,然后我们就可以使用原生的JDBC
语句来操作数据库(CRUD
)了。 -
即使不使用第三方第数据库操作框架(如:
MyBatis
等),Spring
本身也对原生的JDBC
做了轻量级的封装,即JdbcTemplate
类。
**注:**在Spring Boot
中有很多的XxxTemplate
类。XxxTemplate
类是Spring Boot
已经为我们封装好的模板类(Bean
),我们只需要拿来使用即可。
-
JDBC
操作数据库的所有CRUD
方法都被封装在JdbcTemplate
这一模板类中。 -
Spring Boot
默认已经将配置好的JdbcTemplate
放在了容器中,我们只需自己注入即可使用。 -
JdbcTemplate
的自动配置是依赖org.springframework.boot.autoconfigure.jdbc
包下的JdbcTemplateConfiguration
这一自动配置类完成的。
JdbcTemplate
类主要提供以下几类方法:
execute
方法:可以用于执行任何SQL
语句,一般用于执行DDL
语句。update
方法及batchUpdate
方法:update
方法:用于执行新增、修改、删除等语句。batchUpdate
方法:用于执行批处理相关语句。
query
方法及queryForXXX
方法:用于执行查询相关语句。call
方法:用于执行存储过程、函数相关语句。
附:源码分析
Spring Boot
中,JdbcTemplate
的自动配置是在org.springframework.boot.autoconfigure.jdbc
包下的JdbcTemplateAutoConfiguration
这一自动配置类完成的,与之对应的属性配置类是JdbcProperties
。具体分析过程参见《Spring Boot自动配置原理》
(1)全局搜索JdbcTemplateAutoConfiguration
类。
JdbcTemplateAutoConfiguration.java
文件:
1 |
|
(2)点击进入JdbcTemplateConfiguration
类,可以发现:在其中配置了JdbcTemplate
类。
1 |
|
14.5、CRUD测试
(1)在pom.xml
文件中导入web
场景启动器。
pom.xml
文件:
1 | <!-- web场景启动器 --> |
(2)在controller
包下,新建一个JdbcController
类,用于测试使用JDBC
操作数据库。
JdbcController
文件:
1 | package com.atangbiji.controller; |
(3)启动主启动类(Springboot03DataApplication
)中的main
函数。
- 在浏览器中输入
http://localhost:8080/jdbc/list
,数据库查询成功。访问结果如下图所示:
- 在浏览器中输入
http://localhost:8080/jdbc/add
,数据增加成功。此时,数据库中的user
表如下图所示:
- 在浏览器中输入
http://localhost:8080/jdbc/update/4
,数据修改成功。此时,数据库中的user
表如下图所示:
- 在浏览器中输入
http://localhost:8080/jdbc/delete/4
,数据删除成功。此时,数据库中的user
表如下图所示:
至此,在Spring Boot
中使用JDBC
就搞定了数据库的CRUD
。
15、整合Druid数据源
15.1、Druid简介
为了提高Java
程序操作数据库时候的性能,我们不得不使用数据库连接池。
Druid
是阿里巴巴开源平台上的一个数据库连接池实现。它结合了C3P0
、DBCP
等DB
连接池的优点,同时加入了日志监控。
Druid
可以很好的监控DB
池连接和SQL
的执行情况,它天生就是针对监控而生的DB
连接池。
Druid
已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。
Spring Boot 2.0
以上版本默认使用的是Hikari
数据源。可以说Hikari
与Driud
都是当前Java Web
开发中最优秀的数据源。我们这里重点介绍Spring Boot
如何集成Druid
数据源,如何实现数据库监控。
Github
地址:https://github.com/alibaba/druid/
15.2、DruidDataSource基本配置参数
com.alibaba.druid.pool.DruidDataSource
可以设置的基本配置参数如下:
15.3、配置DruidDataSource
在上述项目的基础上:
(1)在项目的pom.xml
文件中添加上Druid
数据源的依赖。
pom.xml
文件:
1 | <!-- Druid数据源依赖 --> |
(2)在配置文件中切换数据源。Spring Boot 2.0
以上版本默认使用com.zaxxer.hikari.HikariDataSource
数据源,如果我们不想使用默认的数据源,想切换数据源,那么只需要通过配置spring.datasource.type
属性的值来指定其它的数据源即可。
application.yaml
文件:
1 | spring: |
(3)数据源切换之后,在测试类中注入DataSource
,然后获取到它。输出当前使用的数据源便知是否成功切换。
Springboot03DataApplicationTests.java
文件:
1 | package com.atangbiji; |
(4)启动测试类(Springboot03DataApplicationTests
),发现当前使用的数据源已经切换成DruidDataSource
。输出结果如下图所示:
(5)数据源切换成功后,就可以设置druid
数据源的专有属性了。如:数据源连接初始化大小、最大连接数、等待时间、最小连接数等。
application.yaml
文件:
1 | spring: |
(6)导入Log4j
的依赖。
pom.xml
文件:
1 | <!-- log4j依赖 --> |
(7)在程序的主启动类(Springboot03DataApplication
)的同级目录下,新建一个config
包,用于存放自定义配置文件。
(8)在config
包下新建一个DruidConfig
配置类,用于配置Druid
数据源。并在其中将自定义的Druid
数据源添加到容器中,不再使用Spring Boot
自动创建的数据源,即:将全局配置文件(application.yaml
)中的Druid
数据源属性与com.alibaba.druid.pool.DruidDataSource
绑定,进而让全局配置文件中的Druid
数据源属性生效。
DruidConfig.java
文件:
1 | package com.atangbiji.config; |
其中:@ConfigurationProperties(prefix = "spring.datasource")
的作用就是:将全局配置文件中前缀为spring.datasource
的属性值注入到com.alibaba.druid.pool.DruidDataSource
的同名参数中去。
(9)在测试类中测试Druid
数据源的属性是否设置成功。
Springboot03DataApplicationTests.java
文件:
1 | package com.atangbiji; |
(10)启动测试类(Springboot03DataApplicationTests
),可见发现配置参数已经生效!输出结果如下图所示:
15.4、配置Druid数据源监控
Druid
数据源具有监控的功能,并提供了一个web
界面方便用户查看。类似安装路由器时,厂家提供了一个默认的web
页面。具体使用步骤如下:
(1)在Druid
数据源的配置类中设置Druid
的后台管理页面,如:登录账号、密码等。
DruidConfig.java
文件:
1 | /** |
(2)配置完毕后,重新启动主启动类(Springboot03DataApplication
)中的main
函数。在浏览器中输入http://localhost:8080/druid/
,系统会自动跳转到登录页面。如下图所示:
(3)在Druid
数据源监控登录界面输入自定义的用户名和密码,即可成功登录Druid
监控管理后台。访问结果如下图所示:
15.5、配置Druid web监控过滤器
我们还可以在Druid
数据源的配置类中配置web
监控的过滤器(filter
)。具体实现方法如下:
DruidConfig.java
文件:
1 | /** |
在工作中,我们按需求进行配置即可!
16、整合MyBatis框架
16.1、mybatis-spring-boot-starter
- 官方文档:http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
Maven
仓库地址:https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter
16.2、搭建测试环境
(1)新建一个项目名称为:springboot-04-mybatis
的Spring Initializr
项目。参见《使用IDEA创建项目》
(2)选择初始化的组件(此处勾选Spring Web
、JDBC API
、MySQL Driver
即可)和Spring Boot
的版本(我们这里选择2.7.8版)。
(3)填写项目路径,等待项目构建成功。项目构建成功后,它会默认为我们导入web
启动器、JDBC
启动器和MySQL
驱动相关的依赖。
pom.xml
文件:
1 | <!-- web启动器 --> |
(4)先删除IDEA
自动生成的.mvn
文件夹、.gitignore
、HELP.md
、mvnw
、mvnw.cmd
文件。
(5)然后,在Settings
中手动配置Maven
的安装目录、配置文件和本地仓库。
**注:**若Maven
未识别到该子项目,则右键为其添加Maven
支持。
(6)在程序的主启动类(Springboot03DataApplication
)的同级目录下:
- 新建一个
controller
包,用于存放控制器代码; - 新建一个
service
包,用于存放业务层代码; - 新建一个
dao
包,用于存放持久层代码(映射器接口及其对应的映射器配置文件); - 新建一个
pojo
包,用于存放实体类; - 新建一个
utils
包,用于存放我们封装的各种工具; - 新建一个
config
包,用于存放自定义配置文件。
**注:**程序的主启动类一定要与controller
、service
、dao
、pojo
、utils
、config
包在同级目录下,否则识别不到【约定大于配置】。
16.3、整合步骤
16.3.1、导入MyBatis启动器
(1)在项目的pom.xml
文件中导入MyBatis
启动器。
pom.xml
文件:
1 | <!-- mybatis启动器 --> |
16.3.2、配置数据源
(2)在resources
目录下,新建一个application.yaml
配置文件,并在其中配置数据库连接信息。
application.yaml
文件:
1 | #配置数据源 |
注:
-
我们这里使用的是Spring Boot默认的
Hikari
数据源。 -
我们这里连接的是在学习
MyBatis
时创建的mybatis
数据库。其中的user
表如下图所示:
(3)在测试类中测试数据库是否连接成功。
Springboot04MybatisApplicationTests.java
文件:
1 | package com.atangbiji; |
(4)启动测试类(Springboot04MybatisApplicationTests
),数据库连接成功。输出结果如下图所示:
16.3.3、创建实体类
(5)在项目的pom.xml
文件中导入Lombok
依赖。
pom.xml
文件:
1 | <!--lombok依赖--> |
(6)在项目的pojo
包下新建一个User
类,用于实现关系型数据库和业务实体间的映射。
User.java
文件:
1 | package com.atangbiji.pojo; |
16.3.4、创建映射器接口
(7)在项目的dao
包下新建一个UserMapper
映射器接口类,然后再向其中添加映射器接口函数。
UserMapper.java
文件:
1 | package com.atangbiji.dao; |
注:
- 映射器接口中的接口函数用于映射
XML
映射器配置文件中对应标签中的SQL
语句。 @Mapper
注解表示该类是一个MyBatis
的映射器接口类。@Repository
注解是@Component
注解的衍生注解,用于将dao
层的实体类对应的bean
对象装配到Spring IOC
容器中,交由Spring
管理。
16.3.5、创建XML映射器配置文件
(8)在项目的resources
目录下新建一个mybatis.mapper
目录,用于存放XML
映射器配置文件。然后,在该目录下新建一个映射器配置文件UserMapper.xml
,并在其中使用标签实现SQL
语句与映射器接口函数的映射。
UserMapper.xml
文件:
1 |
|
16.3.6、配置MyBatis(重点)
(9)在全局配置文件(application.properties
或application.yaml
)中配置MyBatis
的属性。(重点)
application.yaml
文件:
1 | #整合MyBatis |
注:Spring Boot
中导入MyBatis
启动器后,MyBatis
的相应配置会在自动配置类(MybatisAutoConfiguration
)中自动配置,其对应的属性配置类为MybatisProperties
类。因此,Spring Boot
中我们一般不再使用MyBatis
核心配置文件,而是将以前MyBatis
核心配置文件中的所有配置改在Spring Boot
的全局配置文件(application.properties
或application.yaml
)中配置了。
16.3.7、CRUD测试
(10)在controller
包下新建一个UserController
类,用于测试Spring Boot
整合MyBatis
后的增删改查功能测试。
UserController.java
文件:
1 | package com.atangbiji.controller; |
**注:**实际项目中建议在Service
层调用Dao
层。
(11)启动主启动类(Springboot04MybatisApplication
)中的main
函数。
- 在浏览器中输入
http://localhost:8080/user/queryAll
,数据库查询成功。访问结果如下图所示:
- 在浏览器中输入
http://localhost:8080/user/queryById/1
,数据库查询成功。访问结果如下图所示:
- 在浏览器中输入
http://localhost:8080/user/add
,数据增加成功。此时,数据库中的user
表如下图所示:
- 在浏览器中输入
http://localhost:8080/user/update
,数据修改成功。此时,数据库中的user
表如下图所示:
- 在浏览器中输入
http://localhost:8080/user/delete/4
,数据删除成功。此时,数据库中的user
表如下图所示:
17、项目实战
学完上述知识点后,我们就可以使用Spring Boot
进行基本的Web
项目开发了!这里不再赘述,多练习才是王道!
(持续更新中…… )
关注**“阿汤笔迹”** 微信公众号,获取更多学习笔记。
原文地址:http://www.atangbiji.com/2023/02/12/SpringBootInDetail02WebDev
博主最新文章在个人博客 http://www.atangbiji.com/ 发布。