目录

1.对SpringBoot的认识

1.1.什么是SpringBoot

1.2.SpringBoot解决了哪些痛点

1.3.SpringBoot有哪些特性

2. 入门案例

2.1.新建module

2.2.pom.xml添加相关依赖

2.2.1.添加父工程坐标

2.2.2.添加web启动器

2.2.3.管理jdk版本

2.3.启动类

2.4.编写controller

2.5.启动测试

3. Spring全注解配置和属性注入

3.1.spring全注解配置

3.1.1.连接池在spring全注解配置中是如何配置的

3.2.SpringBoot的属性注入\读取配置完文件

3.3.springboot更优雅的注入

4. 自动配置原理

4.1.@SpringBootApplication

4.2.@SpringBootConfiguration

4.3.@ComponentScan

4.4.@EnableAutoConfiguration

4.5.默认配置原理

4.6.总结

5.SpringBoot整合其它框架

5.1.整合SpringMVC

5.1.1.修改端口

5.1.2.访问静态资源

5.2.整合jdbc

5.2.1.引入依赖

5.2.2.配置连接池

5.3.整合mybatis

mybatis中生成mapper接口代理对象有两种方式

springboot中mapper的加载接口代理对象有两种方法

5.4.通用mapper  tk mybatis

6.Thymeleaf  [taim li:f]

6.1.什么是Thymeleaf

6.2.springBoot整合Thymeleaf

6.2.1.引入Thymeleaf启动器

6.2.2.模板缓存

6.3.thymeleaf详解

6.3.1.thymeleaf表达式

6.3.2.表达式常见用法

6.3.3.常用th标签

6.3.4.th标签基本用法

6.3.5.thymeleaf布局

7. Mybatis Plus

7.1.创建工程,引入依赖

7.2.配置文件application.yml

7.3.springboot启动类

7.4.实体类

7.5.mapper接口

7.6.注解解决表与实体类不一致问题

7.7.内置增删改查

7.8.分页

7.8.1.内置分页

7.8.2.自定义xml分页

7.8.3.pageHelper分页

1.对SpringBoot的认识

1.1.什么是SpringBoot

springboot是spring快速开发脚手架,通过约定大于配置的方式,快速构建和启动spring项目.
springboot根据我们项目中所引入的依赖,比如引入了springmvc构件,就会判断出是要进行springmvc的web开发,就会把springmvc的相关基本配置自动配置好了,不需要我们在xml中配置。 比如配置前端控制器DispatcherServlet、配置视图解析器、配置静态资源访问、处理器映射器、处理器适配器等一系列组件,

1.2.SpringBoot解决了哪些痛点

spring的缺点:
1.复杂的配置
项目各种配置是开发时的损耗, 写配置挤占了写应用程序逻辑的时间。
2.混乱的依赖管理
项目的依赖管理非常的繁琐。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这是一个棘手的问题。并且,一旦选错了依赖的版本,随之而来的就是各种的不兼容的bug
spring boot 可以解决上面2个问题

1.3.SpringBoot有哪些特性

快速开发spring应用的框架
内嵌tomcat和jetty容器,不需要单独安装容器,使用main方法就可以直接启动发布一个web应用
简化maven配置,通过继承parent构件,一站式引入需要的各种依赖(启动器),简化依赖管理
通过约定大约配置的方式可以实现基于注解的零配置思想
和各种流行框架,spring web mvc,mybatis,spring cloud无缝整合
官网
总结
spring boot 是spring快速开发脚手架,通过约定大于配置,优化了混乱的依赖管理,和复杂的配置,让我们用java -jar方式,运行启动java web项目

2. 入门案例

2.1.新建module

需求:创建HelloController,在页面中打印hello spring boot...
先新建一个空的工程:
设置jdk版本:
新建一个module:
使用maven来构建
然后填写项目坐标
项目结构:

2.2.pom.xml添加相关依赖

2.2.1.添加父工程坐标

SpringBoot提供了一个名为spring-boot-starter-parent的构件,里面已经对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可!

2.2.2.添加web启动器

为了让SpringBoot帮我们完成各种自动配置,我们必须引入SpringBoot提供的自动配置依赖,我们称为启动器 。因为我们是web项目,这里我们引入web启动器

2.2.3.管理jdk版本

默认情况下,maven工程的jdk版本是1.5,而开发使用的是11,因此这里我们需要修改jdk版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.bowei.springboot</groupId><artifactId>springbootdemo</artifactId><version>1.0-SNAPSHOT</version><!--管理jdk版本--><properties><java.version>11</java.version></properties><!--添加父工程坐标  我们的项目继承父工程项目,这样我们就不用操心依赖的版本冲突问题了由parent统一管理版本号,不需要再写版本号--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version></parent><!--添加web启动器为了让SpringBoot帮我们完成各种自动配置,我们必须引入SpringBoot提供的自动配置依赖,我们称为启动器 。因为是web项目,这里我们引入web启动器--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>
注意的是,我们并没有在这里指定版本信息。因为SpringBoot的父工程已经对版本进行了管理了。

2.3.启动类

Spring Boot项目通过main函数来启动的,我们需要创建一个启动类,编写main函数,这个启动类是固定的,后面会通过工具自动生成。

下面,就可以像以前那样开发SpringMVC的项目

2.4.编写controller

2.5.启动测试

运行main函数,查看控制台,可以看到监听的端口信息
1)监听的端口是8080
2)SpringMVC的映射路径是:/
3) /hello 路径已经映射到了 HelloController 中的 hello() 方法
打开页面访问:http://localhost:8080/hello

3. Spring全注解配置和属性注入

上面demo没有任何的配置,就可以实现一个SpringMVC的项目了,快速、高效。

但是没有任何的xml,那么如果要配置一个Bean该怎么办?比如我们要配置一个数据库连接池,
以前xml中需要这样配置

在Spring3.0开始,Spring官方就已经开始推荐使用java配置来代替传统的xml配置了

3.1.spring全注解配置

spring全注解配置主要靠java类和一些注解,比较常用的注解有

@Configuration :声明一个类作为配置类,代替xml文件

@Bean :声明在方法上,将方法的返回值作为对象反转到Spring容器中管理,代替 <bean> 标签
@value :属性注入
@PropertySource :指定外部属性文件,

3.1.1.连接池在spring全注解配置中是如何配置的

下面测试spring全注解配置是如何读取到属性文件

首先引入Druid连接池依赖
创建一个jdbc.properties文件,编写jdbc属性
java配置来实现连接池配置

在 HelloController 中测试

Debug运行并查看  属性注入成功了

这是spring的全注解配置实现的一个bean对象的创建和属性的注入,下面看下spring boot提供的属性注入方式。

3.2.SpringBoot的属性注入\读取配置完文件

上述通过java配置方式实现了连接池的配置。不过属性注入使用的是@Value注解。这种方式它只能注入基本类型值。
在SpringBoot中,提供了一种新的属性注入方式,支持各种java基本数据类型及复杂类型的注入

1)新建一个属性读取类,用来进行属性注入:
新建属性读取类JdbcProperties,通过添加注解@ConfigurationProperties(prefix = "jdbc")读取application.properties中属性值,将来在其他地方就可以注入JdbcProperties这个对象,从中获取属性值。


将jdbc.properties改成application.properties

2)在JdbcConfig2中注入JdbcProperties对象,获取属性值给数据源,最后Bean注解将数据源反转给spring容器,将来在其他地方可以通过注入方式使用dataSource数据源。

通过 @EnableConfigurationProperties(JdbcProperties.class) 来声明要使用 JdbcProperties 这个类的对象

三种方式注入JdbcProperties

@Autowired注入
构造函数注入
声明有@Bean的方法参数注入
上述采用的是第三种属性注入方式

debug

觉得这种方式似乎更麻烦了,事实上这种方式有更强大的功能,也是SpringBoot推荐的注入方式。两者对比关系

上述分别通过两种@Value和@ConfigurationProperties注解来读取properties文件,给Properties类中对应的属性赋值

@ConfigurationProperties 优势:

Relaxed binding:松散绑定

不严格要求属性文件中的属性名与成员变量名一致。支持驼峰,中划线,下划线等等转换,甚至支持对象引导。比如:user.friend.name:代表的是user对象中的friend属性中的name属性,显然friend也是对象。@value注解就难以完成这样的注入方式。
meta-data support:元数据支持,帮助IDE生成属性提示(写开源框架会用到)。

3.3.springboot更优雅的注入

如果一段属性只有一个Bean需要使用,我们无需将其注入到一个类(JdbcProperties)中。而是直接在需要的地方声明即可。

不再需要属性读取类,@ConfigurationProperties 这个注解是放在需要的方法上,SpringBoot会自动把相关属性通过set方法注入到bean对象中。

我们直接把 @ConfigurationProperties(prefix = "jdbc") 声明在需要使用的 @Bean 的方法上,然后SpringBoot 就会自动调用这个Bean(此处是DataSource)的set方法,然后完成注入。使用的前提是:该类必须有对应属性的set方法!

application.properties

将properties中属性值注入到dataSource

4. 自动配置原理

上述一个整合了SpringMVC的WEB工程开发,变的无比简单,那些繁杂的配置都消失不见了,这
是如何做到的?
这些都是从springboot启动器开始的

重点关注@SpringBootApplication注解

4.1.@SpringBootApplication

点击进入,查看源码,这里重点的注解有3个:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

4.2.@SpringBootConfiguration

继续点击查看源码:
通过这段我们可以看出,在这个注解上面,又有一个 @Configuration 注解。这个注解的作用就是声明当前类是一 个配置类,然后Spring会自动扫描到添加了@Configuration 的类,并且读取其中的配置信息。

4.3.@ComponentScan

继续点击查看源码:并没有看到什么特殊的地方。我们查看注释:
配置组件扫描的指令。提供了类似与 <context:component-scan> 标签的作用
通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包
而我们的@SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。因此,一般启动类会放在一个比较前的包目录中。

4.4.@EnableAutoConfiguration

关于这个注解,官网上有一段说明
The second class-level annotation is @EnableAutoConfiguration . This annotation tells Spring Boot to “guess” how you want to confifigure Spring, based on the jar dependencies that you have added. Since spring-boot-starter-web added Tomcat and Spring MVC, the auto-confifiguration assumes that you are developing a web application and sets up Spring accordingly
第二级的注解 @EnableAutoConfiguration ,告诉SpringBoot基于你所添加的依赖,去“猜测”你想要如何配置 Spring。比如我们引入了 spring-boot-starter-web ,而这个启动器中帮我们添加了 tomcat 、 SpringMVC 的 依赖。此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!
总结,SpringBoot内部对大量的第三方库进行了默认配置,我们引入对应库所需的依赖,那么默认配置就会生效。默认配置是如何生效的?

4.5.默认配置原理

@EnableAutoConfiguration会开启SpringBoot的自动配置,并且根据你引入的依赖来生效对应的默认配置, springboot如何做到的?
引入了一个依赖:spring-boot-autoconfigure,其中定义了大量自动配置类:

非常多,几乎涵盖了现在主流的开源框架,例如:

redis
jms
amqp
jdbc
jackson
mongodb
jpa
solr
elasticsearch
例如SpringMVC,查看mvc 的自动配置类:
打开WebMvcAutoConfifiguration:
这个类上的4个注解
@Configuration :声明这个类是一个配置类
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
这里的条件是OnClass,也就是满足以下类存在:Servlet、DispatcherServlet、WebMvcConfigurer,其中 Servlet只要引入了tomcat依赖自然会有,后两个需要引入SpringMVC才会有。这里就是判断你是否引入了相关依赖,引入依赖后该条件成立,当前类的配置才会生效!
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
这个条件与上面不同,OnMissingBean,是说环境中没有指定的Bean这个才生效。其实这就是自定义配置的入口,也就是说,如果我们自己配置了一个WebMVCConfigurationSupport的类,那么这个默认配置就会失效!
接着,我们查看该类中定义了什么:
视图解析器:
处理器适配器(HandlerAdapter):
等等

4.6.总结

SpringBoot为我们提供了默认配置,而默认配置生效的条件一般有两个:

引入了相关依赖
没有自定义配置类

5.SpringBoot整合其它框架

5.1.整合SpringMVC

上述已经实现mvc自动配置(在pom中添加了启动器),另外还需解决以下3个问题

5.1.1.修改端口

在SpringBoot的全局属性文件中,端口通过以下方式配置:server.port=80

5.1.2.访问静态资源

我们使用springmvc需要对静态资源如下处理
springboot对静态资源做了如下处理,只要在以下路径下的静态资源都能被访问到,一般都是放在resources下的static中
ResourceProperties的类,里面就定义了静态资源的默认查找路径:
默认的静态资源路径为:

classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public
只要静态资源放在这些目录中任何一个,SpringMVC都会帮我们处理。

5.1.3.添加拦截器
springmvc中的拦截器配置
springmvc中的拦截器在springboot中是如何配置的
首先我们定义一个拦截器:
package com.cbw.interceptor;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginInterceptor implements HandlerInterceptor {private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {logger.debug("处理器执行前执行!");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {logger.debug("处理器执行后执行!");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {logger.debug("跳转后执行!");}
}
通过实现 WebMvcConfigurer 并添加 @Configuration 注解来实现自定义部分SpringMvc配置:

ant path路径匹配通配符
‘?’ 匹配任何单字符
‘*’ 匹配0或者任意数量的字符
‘/**’ 匹配0或者更多的目录
目录结构
运行并查看日志
发现日志什么都没有,因为我们记录的log级别是debug,默认显示info以上,我们需要进行配置。
SpringBoot通过 logging.level.*=debug 来配置日志级别,*填写包名
测试

5.2.整合jdbc

5.2.1.引入依赖

springboot根据依赖自动的帮我们配置jdbc,不要忘了数据库驱动,SpringBoot并不知道我们用的什么数据库,这里我们选择MySQL。

5.2.2.配置连接池

springboot整合jdbc就不需要引入连接池依赖,因为引入jdbc启动器的时候,SpringBoot已经自动帮我们引入了一个连接池
HikariCP应该是目前速度最快的连接池了,它与c3p0的对比
只需要指定连接池参数
# 连接四大参数
spring.datasource.url = jdbc:mysql://localhost:3306/tb_userserverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123
# 可省略,SpringBoot自动推断
spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10
实体类

持久层 这里使用的是原始的dao

测试

数据库

5.3.整合mybatis

SpringBoot官方并没有提供Mybatis的启动器,不过Mybatis官网自己实现了
pom添加Mybatis启动器
配置,基本没有需要配置的
数据表和实体类还是上面的

mapper接口

mapper接口映射文件

mybatis中生成mapper接口代理对象有两种方式

1.sqlSession.getMapper(UserMapper.class)

2.mybatis反向生成

springboot中mapper的加载接口代理对象有两种方法

1.使用@Mapper注解(不推荐)

需要注意,这里没有配置mapper接口扫描包,因此我们需要给每一个Mapper接口添加 @Mapper 注解,才能被识别。
@Mapper
public interface UserMapper {
}

2.设置MapperScan注解扫描包(推荐)

启动类上设置@MapperScan("mapper所在的包"),自动搜索包中的接口,产生mapper的代理对象
测试

5.4.通用mapper  tk mybatis

概念

使用Mybatis时,最大的问题是,要写大量的重复SQL语句在xml文件中,除了特殊的业务逻辑SQL语句之外,还有大量结构类似的增删改查SQL。而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改。这大量增加了程序员的负担。
使用tk mybatis ,优化了表与实体类之间的映射,表的改动不影响实体类属性(通过注解纠正),不需要写mapper映射文件,只需要写mapper接口继承tk mybatis给我们提供的Mapper接口,我们就可以使用tk mybatis提供的内置方法完成增删改查操作。
避免重复书写CRUD映射的框架有两个
1.通用mybatis(tk mybatis)
2.mybatis plus,功能更加强大,后面实战项目中讲解

通用Mapper的作者也为自己的插件编写了启动器,我们直接引入即可:

实体类

tk mybatis 实体类使用的注解是jpa注解

注意事项:

1. 默认表名=类名,字段名=属性名

2. 表名可以使用 @Table(name = "tableName") 进行指定

3. @Column(name = "fieldName") 指定

4. 使用 @Transient 注解标识的字段不进行映射
不需要做任何配置就可以使用,不需要写mapper映射文件,只需要写mapper接口继承tk mybatis给我们提供的Mapper接口,我们就可以使用tk mybatis提供的内置方法完成增删改查操作。
mapper接口

一旦继承了Mapper,继承的Mapper就拥有了Mapper所有的通用方法:

当然,我们也可以自定义sql映射,那么上面的mapper接口中就需要写接口方法了,而且自定义的sql映射是不支持字段下划线user_name转驼峰userName的,而且字段名和属性名不一致时需要在sql中通过起别名,变成一致,而tk mybatis提供的内置方法是支持下划线转驼峰的,另外如果字段和属性不一致,只需要在属性上userName添加一个注解Column(name = "user_name")即可。

Select

Insert
Update
Delete
 
Example

注意要把MapperScan类改成tk-mybatis构件的类
测试

上述只有第一个方法使用的是自定义的sql,要是没有自定义sql,那么映射文件就不需要了,而且mapper接口只需要实现tk mybatis的mapper接口就可以,也不需要写接口方法了。

6.Thymeleaf  [taim li:f]

6.1.什么是Thymeleaf

Thymeleaf 是一个跟 FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下特点:
动静结合
Thymeleaf 在有网络和无网络的环境下皆可运行,无网络显示静态内容,有网络用后台得到数据替换静态内容
springboot默认整合thymeleaf

6.2.springBoot整合Thymeleaf

编写接口
编写UserService,调用UserMapper的查询所有方法

编写一个controller,返回一些用户数据,放入模型中,等会再页面渲染

6.2.1.引入Thymeleaf启动器

直接引入启动器:

SpringBoot会自动为Thymeleaf注册一个视图解析器:

与解析JSP的InternalViewResolver类似,Thymeleaf也会根据前缀和后缀来确定模板文件的位置:

默认前缀: classpath:/templates/
默认后缀: .html
所以如果我们返回视图: users ,会指向到 classpath:/templates/users.html

一般我们无需进行修改,默认即可

静态页面
模板默认放在classpath下的templates文件夹,我们新建一个html文件放入其中

编写html模板,渲染模型中的数据:

语法

${} :这个类似与el表达式,但其实是ognl的语法,比el表达式更加强大

th- 指令: th- 是利用了Html5中的自定义属性来实现的。如果不支持H5,可以用 data-th- 来代替

th:each :类似于 c:foreach 遍历集合,但是语法更加简洁

th:text :声明标签中的文本 例如 <td th-text='${user.id}'>1</td> ,如果user.id有值,会覆盖默认的1 如果没有值,则会显示td中默认的1。这正是thymeleaf能够动静结合的原因,模板解析失败不影响 页面的显示效果,因为会显示默认值!

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title><style type="text/css">table {border-collapse: collapse; font-size: 14px; width: 80%; margin: auto}table, th, td {border: 1px solid darkslategray;padding: 10px} </style>
</head>
<body><div style="text-align: center"><span style="color: darkslategray; font-size: 30px">欢迎光临!</span> <hr/><table class="list"><tr><th>id</th><th>姓名</th><th>用户名</th><th>年龄</th><th>性别</th><th>生日</th><th>备注</th><th>操作</th></tr><tr th:each="user, status : ${users}" th:object="${user}"><td th:text="${user.id}">1</td><td th:text="*{name}">张三</td><td th:text="*{userName}"></td><td th:text="${user.age}">zhangsan</td><td th:text="${user.sex} == 1 ? '男': '女'">男</td><td th:text="${#dates.format(user.birthday, 'yyyy-MM-dd')}">2021-02-30</td><td th:text="${user.note}">1</td><td><a th:href="@{/delete(id=${user.id}, userName=*{userName})}">删除</a><a th:href="|/update/${user.id}|">修改</a><a th:href="'/approve/' + ${user.id}">审核</a></td></tr></table></div>
</body>
</html>

6.2.2.模板缓存

Thymeleaf会在第一次对模板解析之后进行缓存,极大的提高了并发处理能力。但是这给我们开发带来了不便,修 改页面后并不会立刻看到效果,我们开发阶段可以关掉缓存使用

6.3.thymeleaf详解

6.3.1.thymeleaf表达式

1. 变量表达式
2. 选择或星号表达式
3. URL表达式
6.3.1.1.变量表达式
变量表达式即OGNL表达式或Spring EL表达式(在Spring中用来获取model attribute的数据)。如下所示:
以HTML标签的一个属性来表示
${session.user.name}
<span>${text}</span>
<span th:text="${text}">你好 thymleaf</span>
6.3.1.2.选择(星号)表达式
th:object中定义星号表达式上下文,这样可以简化变量表达式的语法,不需要通过对象打点获取属性,直接通过星号表达式的上下文中获取对应的属性的值。
6.3.1.3.URL表达式
URL表达式指的是把一个有用的上下文或回话信息添加到URL,这个过程经常被叫做URL重写。
@{/order/list}  没有参数
URL还可以设置参数:
@{/order/details(id=${orderId}, name=*{name})}
相对路径: @{../documents/report}
<form th:action="@{/createOrder}">
<a  th:href="@{/main}">
三种不同的使用形式
url表达式
<a th:href="@{/delete(id=${user.id}, userName=*{userName})}">删除</a>
文本替换
<a th:href="|/update/${user.id}|">修改</a>
字符串拼接

<a th:href="'/approve/' + ${user.id}">审核</a>

6.3.2.表达式常见用法

字面(Literals)

文本文字(Text literals): 'one text', 'Another one!',…

数字文本(Number literals): 0, 34, 3.0, 12.3,…

布尔文本(Boolean literals): true, false

空(Null literal): null

文字标记(Literal tokens): one, sometext, main,…

文本操作(Text operations)

字符串连接(String concatenation):

文本替换(Literal substitutions): |The name is ${name}|

算术运算(Arithmetic operations)

二元运算符(Binary operators): +, -, *, /, %

减号(单目运算符)Minus sign (unary operator): -

布尔操作(Boolean operations)

二元运算符(Binary operators): and, or

布尔否定(一元运算符)Boolean negation (unary operator): !, not

比较和等价(Comparisons and equality)

比较(Comparators): >, <, >=, <= (gt, lt, ge, le)

等值运算符(Equality operators): ==, != (eq, ne)

条件运算符(Conditional operators)

If-then: (if) ? (then)

If-then-else: (if) ? (then) : (else)

Default: (value) ?: (defaultvalue)

6.3.3.常用th标签

6.3.4.th标签基本用法

1. 赋值、字符串拼接

字符串拼接还有另外一种简洁的写法

<a th:href="|/update/${user.id}|">修改</a>

<a th:href="'/approve/' + ${user.id}">审核</a>

2. 条件判断 If/Unless

Thymeleaf中使用th:if和th:unless属性进行条件判断

th:unless于th:if恰好相反,只有表达式中的条件不成立,才会显示其内容

也可以使用 (if) ? (then) : (else) 这种语法来判断显示的内容

<h5>if指令</h5>

<a th:if="${users.size() > 0}">查询结果存在</a><br>

<a th:if="${users.size() <= 0}">查询结果不存在</a><br>

<a th:unless="${session.user != null}" href="#">登录</a><br>

3. for 循环

status称作状态变量,属性有

index:当前迭代对象的index(从0开始计算)

count: 当前迭代对象的index(从1开始计算)

size:被迭代对象的大小

current:当前迭代变量

even/odd:布尔值,当前循环是否是偶数/奇数(从0开始计算)

first:布尔值,当前循环是否是第一个

last:布尔值,当前循环是否是最后一个

4. 内联文本

内联文本:[[…]]内联文本的表示方式,使用时,必须先用th:inline=”text/javascript/none”激活

th:inline="text" 内联文本

th:inline="javascript" 内联js

th:inline="none" 关闭内联

th:inline可以在 父级标签内使用,甚至作为body的标签

内联文本尽管比th:text的代码少,不利于原型显示

在thymeleaf指令中显示

<h6 th:text="${text}">静态内容</h6>

使用内联文本显示model attribute

5. 内联js

6. 内嵌变量

为了模板更加易用,T

hymeleaf还提供一系列Utility对象(内置Context中),可以通过#直接访问:

dates : java.util.Date**的功能方法类。

calendars : 类似#dates,面向java.util.Calendar

numbers : 格式化数字的功能方法类

strings : 字符串对象的功能类,

contains,startWiths,prepending/appending等等。

objects: 对objects的功能类操作。

bools: 对布尔值求值的功能方法。

arrays:对数组的功能类方法。

lists: 对lists功能类方法

sets

maps …

比如

6.3.5.thymeleaf布局

在/resources/templates/目录下创建footer.html,内容如下

编写一个片段,在其他页面引用

在页面任何地方引入:

th:insert :保留自己的主标签,保留th:fragment的主标签。

th:replace :不要自己的主标签,保留th:fragment的主标签。

th:include :保留自己的主标签,不要th:fragment的主标签。(官方3.0后不推荐)

这几个标签的区别,查看源码

7. Mybatis Plus

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,避免了我 们重复CRUD语句。

7.1.创建工程,引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>spring-boot-mybatis-plus</artifactId><version>1.0-SNAPSHOT</version><!--父工程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath/></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>11</java.version><mybatisplus.version>3.3.2</mybatisplus.version><skipTests>true</skipTests></properties><!--springboot启动器--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--数据库--><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!--mp启动器--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatisplus.version}</version></dependency><!--测试--><dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><scope>test</scope></dependency><!--简化实体类开发,不需要set get方法--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><!--测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

7.2.配置文件application.yml

在Springboot中,推荐使用properties或者YAML文件来完成配置,但是对于较复杂的数据结构来说,YAML又远远 优于properties。

看一个Springboot中的properties文件和对应YAML文件的对比

可以明显的看到,在处理层级关系的时候,properties需要使用大量的路径来描述层级(或者属性),比如 environments.dev.url和environments.dev.name。其次,对于较为复杂的结构,比如数组(my.servers),写起 来更为复杂。而对应的YAML格式文件就简单很多:

数据库脚本文件/db/data-h2.sql和/db/schema-h2.sql

h2数据库是一个基于内存的数据库,在jvm启动时,自动执行脚本加载相应的数据,常用于开发时测试使用。

springboot 中使用h2数据库直接按照上面配置,配置schema表结构脚本和data数据脚本即可

这里用户名密码可以省略不写,或者随意设定

7.3.springboot启动类

7.4.实体类

7.5.mapper接口

测试

7.6.spring-boot-mp注解

注解解决表与实体类不一致问题

MyBatisPlus提供了一些注解供我们在实体类和表信息出现不对应的时候使用。通过使用注解完成逻辑上匹 配

mybatis plus注解策略配置

1.如果mysql自增主键注解策略设置如下

@TableId(type = IdType.AUTO)

private Long id;

2.默认主键策略

ASSIGN_ID(3),  //采用雪花算法生成全局唯一主键

3.排除实体类中非表字段

使用 @TableField(exist = false) 注解

7.7.spring-boot-mp内置CRUD

7.7.1.查询所有 根据id/条件查询

7.7.2.插入

7.7.3.删除&批量删除

7.7.4.更新&批量更新

7.8.spring-boot-mp分页

7.8.0.分页原理

通过分页拦截器拦截查询语句的执行,使用count语句解析器对left join这种一对一关联的sql进行优化,当分页查询的时候,将count查询和left join查询拆开,先select count查询总数,然后再查询当页数据

7.8.1.内置分页

优化left join count场景

在一对一join操作时,也存在优化可能,下面是用户-账号一对一关系的left join查询

当对这条sql查询结果进行分页查询,执行的sql语句是这样的

加入count语句解析器后进行分页查询,最终执行的sql语句是

先配置分页 生成PaginationInterceptor分页拦截器

测试

7.8.2.自定义xml分页

生成分页拦截器

UserMapper.xml文件

UserMapper接口

application.yml

测试

7.8.3.pageHelper插件分页

引入pageHelper依赖

mybatis plus 整合pageHelper的配置类

映射文件

接口方法

测试

SpringBoot知识点整理相关推荐

  1. springboot知识点整理(2021)

    springboot知识点整理 参考网址 https://mp.weixin.qq.com/s/GjjxJt8OauumW_J2ps7tow Demo 脚手架项目地址: https://github. ...

  2. Java进阶3 - 易错知识点整理(待更新)

    Java进阶3 - 易错知识点整理(待更新) 该章节是Java进阶2- 易错知识点整理的续篇: 在前一章节中介绍了 ORM框架,中间件相关的面试题,而在该章节中主要记录关于项目部署中间件,监控与性能优 ...

  3. C语言考研复试知识点整理

    C语言考研复试知识点整理 1.由float x=3e-6,y=3e-6;不能得到x= =y的逻辑值为真. 解析:float类型的变量只能进行>或<运算,不能进行==运算 2.自增和自减运算 ...

  4. 【Android 面试基础知识点整理】

    针对Android面试中常见的一些知识点整理,Max 仅仅是个搬运工.感谢本文中引用文章的各位作者,给大家分享了这么多优秀文章.对于当中的解析,是原作者个人见解,有错误和不准确的地方,也请大家积极指正 ...

  5. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  6. mysql 全面知识点_Mysql知识点整理

    1.存储引擎区别 MyISAM:不支持事物.仅支持表级锁.支持B+树索引 MEMORY:不支持事物.仅支持表级锁.支持B+树和HASH索引 InnoDB:支持事物.支持行级锁.支持B+树索引 2.锁机 ...

  7. 04741计算机网络原理知识点,04741计算机网络原理知识点整理.doc

    04741计算机网络原理知识点整理 1.计算机网络大发展 计算机网络从20世纪70年代开始发展,他的演变可以概括为 面向终端的计算机网络.计算机-计算机网络.开放式标准化网络以及因特网广泛应用和高速网 ...

  8. python基础知识整理-python入门基础知识点整理-20171214

    一.知识点整理 1.python2与python3的区别: (1)宏观比对 python2 源码不标准,较为混乱,并且重复的代码很多. python3 源码统一了标准,同时也去除了重复代码. (2)编 ...

  9. python基础知识整理-python爬虫基础知识点整理

    首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫 ...

最新文章

  1. R语言使用ggplot2包使用geom_density()函数绘制基础密度图实战(density plot)
  2. 判断一个显示对象是否移除
  3. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?...
  4. LTE各场景下的密钥处理
  5. IDEA中常用快捷键整理及重置快捷键
  6. 中国牙膏产业深陷 “氟中毒”?
  7. 手把手教你做用户画像
  8. html浮动标签调整位置,HTML 获取当前标签在页面的位置,并且把其他的浮动窗口显示过来...
  9. GISAXS和GIWAXS的分析
  10. 计算机测试英语词汇,英语听说测试-计算机专业英语词汇.pdf
  11. 解决龙芯2F使用oprofile-0.9.7无法采样应用程序函数的问题
  12. 为什么说暴雪必须“手游化”?
  13. 计算机培训日志范文30篇,班主任工作日志20篇.docx
  14. 解决1KB文件夹快捷方式病毒
  15. Unity实战篇 | unity接入QQ登录 详细过程——Android篇
  16. Python中MNE库的事件相关特定频段分析(MEG数据)
  17. 联通假4G欺骗消费者!
  18. UICC 之 USIM 详解全系列
  19. 【论文笔记】SlowFast Networks for Video Recognition
  20. mel编程相较于c语言怎么样,MEL语言

热门文章

  1. 基于JAVA黑白图片和上色处理系统(Springboot框架+AI人工智能) 开题报告
  2. SQL查询语句练习(一)
  3. compileflow流程引擎使用
  4. Django+sqlite开发简易记账本
  5. 修改安卓默认的系统button样式,以及其它系统控件的默认样式
  6. C++ 数学与算法系列之认识格雷码
  7. 甘特图制定项目计划,提高项目管理效率
  8. 网盾极风云:五分钟搞懂HTTP和HTTPS
  9. Win7组策略编辑器怎么打开?
  10. Visual Studio 2022调节字体大小