SpringBoot2.x基础
# SpringBoot基础
# 1. SpringBoot简介 (opens new window)
# 1.1 Features
- Create stand-alone Spring applications 创建独立的Spring应用程序
- Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files) 直接嵌入Tomcat、Jetty或Undertow(不需要部署WAR文件)
- Provide opinionated 'starter' dependencies to simplify your build configuration 提供自以为是的“启动器”依赖关系来简化构建配置
- Automatically configure Spring and 3rd party libraries whenever possible 在可能的情况下自动配置Spring和第三方库
- Provide production-ready features such as metrics, health checks, and externalized configuration 提供可用于生产的特性,如度量、运行状况检查和外部化配置
- Absolutely no code generation and no requirement for XML configuration 绝对不需要代码生成,也不需要XML配置
# 1.2 Reactive (opens new window)
①. Reactive系统具有某些特性,使其非常适合低延迟、高吞吐量的工作负载。Project Reactor和Spring组合一起工作,使开发人员能够构建响应性、弹性、弹性和消息驱动的企业级反应性系统。
②. Spring投资组合提供了两个并行的堆栈。一种是基于带有Spring MVC和Spring数据结构的Servlet API。另一个是完全被动的堆栈,它利用了Spring WebFlux和Spring Data的被动存储库。在这两种情况下,Spring Security都为您提供了对这两个栈的本机支持。
③. reactor 核反应堆, 让基于 Spring 的项目发生核聚变。
# 2. SpringBoot快速入门
- 使用
IntelliJ IDEA
创建项目
# 2.1 创建项目
- 同官网 (opens new window).使用使用
IntelliJ IDEA
快速构建springboot项目
# 2.2 项目结构
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.chggx.springboot</groupId>
<artifactId>i-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>i-boot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- <exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>-->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
本次使用springboot版本2.3.1,对应spring版本5.2.7
- 非web环境启动器,启动项目
<!--非web环境启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
2
3
4
5
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.1.RELEASE)
2020-06-25 08:01:21.213 INFO 8440 --- [ main] com.chggx.springboot.IBootApplication : Starting IBootApplication on HP-EliteBook-745-G5 with PID 8440 (D:\java-code\kuangjia\springboot\i-boot\target\classes started by HP in D:\java-code\kuangjia\springboot)
2020-06-25 08:01:21.217 INFO 8440 --- [ main] com.chggx.springboot.IBootApplication : No active profile set, falling back to default profiles: default
2020-06-25 08:01:21.928 INFO 8440 --- [ main] com.chggx.springboot.IBootApplication : Started IBootApplication in 1.26 seconds (JVM running for 3.006)
Process finished with exit code 0
2
3
4
5
6
7
8
9
10
11
12
13
- web环境启动器,启动项目
<!--web环境启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2
3
4
5
Boot
内嵌了 Tomcat
,启动应该的时候已经启动了 Tomcat
并且将我们的应用部署到了 Tomcat
容
器。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.1.RELEASE)
2020-06-25 08:06:25.689 INFO 16224 --- [ main] com.chggx.springboot.IBootApplication : Starting IBootApplication on HP-EliteBook-745-G5 with PID 16224 (D:\java-code\kuangjia\springboot\i-boot\target\classes started by HP in D:\java-code\kuangjia\springboot)
2020-06-25 08:06:25.695 INFO 16224 --- [ main] com.chggx.springboot.IBootApplication : No active profile set, falling back to default profiles: default
2020-06-25 08:06:26.912 INFO 16224 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2020-06-25 08:06:26.926 INFO 16224 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-06-25 08:06:26.926 INFO 16224 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.36]
2020-06-25 08:06:27.049 INFO 16224 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-06-25 08:06:27.050 INFO 16224 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1257 ms
2020-06-25 08:06:27.294 INFO 16224 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-06-25 08:06:27.520 INFO 16224 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-06-25 08:06:27.533 INFO 16224 --- [ main] com.chggx.springboot.IBootApplication : Started IBootApplication in 2.365 seconds (JVM running for 3.607)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
浏览器预览
# 2.3 响应数据
/**
* @Author: CHGGX
* @Description: <h1> 业务响应对象 </h1>
*/
public class R extends ConcurrentHashMap<String, Object> {
public R() {
this.put("code", HttpStatus.OK.value());
this.put("msg", "success !!!");
}
public static R ok() {
return new R();
}
public static R ok(String msg) {
return R.ok().put("msg", msg);
}
public static R ok(Object data) {
return R.ok().put("data", data);
}
public static R ok(String msg, Object data) {
return R.ok(msg).put("data", data);
}
public static R error(HttpStatus status, String error) {
return R.ok().put("code", status).put("error", error).put("msg", "");
}
public static R error(HttpStatus status, String error, String msg) {
return R.ok().put("code", status).put("error", error).put("msg", msg);
}
@Override
public R put(String key, Object value) {
super.put(key, value);
return this;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 2.4 编写服务
/**
* @Author: CHGGX
* @Date: 2020/06/25 8:25
* @Description: <h1> </h1>
*/
@Controller
public class HelloBootController {
@GetMapping("/hello")
@ResponseBody
public R hello() {
return R.ok("hello SpringBoot !");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController相当于: @Controller和@ResponseBody不返回页面.返回相应数据结果
# 2.5 启动应用
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.1.RELEASE)
2020-06-25 08:29:13.612 INFO 5040 --- [ main] com.chggx.springboot.IBootApplication : Starting IBootApplication on HP-EliteBook-745-G5 with PID 5040 (D:\java-code\kuangjia\springboot\i-boot\target\classes started by HP in D:\java-code\kuangjia\springboot)
2020-06-25 08:29:13.618 INFO 5040 --- [ main] com.chggx.springboot.IBootApplication : No active profile set, falling back to default profiles: default
2020-06-25 08:29:14.697 INFO 5040 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2020-06-25 08:29:14.710 INFO 5040 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-06-25 08:29:14.710 INFO 5040 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.36]
2020-06-25 08:29:14.824 INFO 5040 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-06-25 08:29:14.825 INFO 5040 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1140 ms
2020-06-25 08:29:15.009 INFO 5040 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-06-25 08:29:15.233 INFO 5040 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-06-25 08:29:15.249 INFO 5040 --- [ main] com.chggx.springboot.IBootApplication : Started IBootApplication in 2.13 seconds (JVM running for 3.573)
2020-06-25 08:29:21.549 INFO 5040 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-06-25 08:29:21.550 INFO 5040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-06-25 08:29:21.558 INFO 5040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 3. 日志配置
- 此处使用
log4j2: log4j-api + log4j-core
- 还可以使用
logback
# 3.1 引入依赖
springboot
中默认的日志依赖
需要在项目中引入 log4j2
的启动器
<!-- log4j2 日志 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2
3
4
5
# 3.2 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration> <!--先定义所有的appender-->
<appenders> <!--输出控制台的配置-->
<console name="Console" target="SYSTEM_OUT"> <!--输出日志的格式-->
<!--<patternlayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%p] %c %m %n"/>-->
<patternlayout pattern="[%p] %m %n"/>
</console>
</appenders>
<loggers>
<root level="DEBUG"> <!--输出到控制台-->
<appender-ref ref="Console"/>
</root>
<logger name="org.springframework" level="ERROR"/>
<logger name="com.baomidou" level="ERROR"/>
<logger name="org.hibernate" level="ERROR"/>
<logger name="com.alibaba.druid" level="ERROR"/>
<logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
</loggers>
</configuration>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
启动服务.报错
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/develop/webapp/maven/maven_repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/develop/webapp/maven/maven_repository/org/apache/logging/log4j/log4j-slf4j-impl/2.13.3/log4j-slf4j-impl-2.13.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
2
3
4
5
# 3.3 解决依赖冲突
spring-boot-starter-web
和 spring-boot-starter-test
两个启动器依赖了 spring-boot- starter
启动器
spring-boot-starter
是 Spring boot 非 WEB 环境的启动器。
spring-boot-starter
启动器依赖了spring-boot-starter-logging
启动器
1.
spring-boot-starter-logging
启动器为 Spring boot 项目提供日志支持默认集成了如下日志类库:
① slf4j 日志门面系统
② logback Spring boot 默认使用的日志框架
③ log4j2
④ .....
2.
logback
和log4j2
两个日志类库同时存在会导致 log4j2 不起作用,需要排除logback 的依赖。因为已经引入了 spring-boot-starter-log4j2 ,所以将 Spring 默认的日志启动器的依赖排除
就可以了。
排除的依赖
<!--web环境启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--排除web启动器的logging依赖-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--测试启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!--排除test启动器的logging依赖-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 3.4 测试效果
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.1.RELEASE)
[INFO] Starting IBootApplication on HP-EliteBook-745-G5 with PID 20204 (D:\java-code\kuangjia\springboot\i-boot\target\classes started by HP in D:\java-code\kuangjia\springboot)
[DEBUG] Running with Spring Boot v2.3.1.RELEASE, Spring v5.2.7.RELEASE
[INFO] No active profile set, falling back to default profiles: default
[INFO] Initializing ProtocolHandler ["http-nio-8080"]
[INFO] Starting service [Tomcat]
[INFO] Starting Servlet engine: [Apache Tomcat/9.0.36]
[INFO] Initializing Spring embedded WebApplicationContext
[INFO] Starting ProtocolHandler ["http-nio-8080"]
[INFO] Started IBootApplication in 2.927 seconds (JVM running for 4.391)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 4. WEB应用开发
# 4.1 访问静态资源
Spring Boot
默认提供静态资源目录位置需置于 classpath
下,目录名需符合如下规则:
/static
/public
/resources
/META-INF/resources
此处以/static
为例;
访问路径
- http://localhost:8080/image/01.jpg
- http://localhost:8080/image/02.jpg
注意: 此处访问路径不包含
/static
,/public
,resources
,/META-INF/resources
# 4.2 模板引擎
模板的诞生是为了将显示与数据分离,其本质是将模板文件和数据通过模板引擎生成最终的视图代码。
以 HTML
为例
不使用模板
后端语言 将数据渲染到HTML标签里, 输出 HTML 文档给客户端,比如 JSP 技术。
使用模板
后端语言 将数据交给模板引擎,模板引擎将模板文件和数据进行渲染,输出 HTML 文档给客户
端。
浏览完最后将 HTML 文档的内容渲染成可视化的网页。
Spring Boot
建议使用模板引擎处理动态网页,不建议使用 JSP 。
Spring Boot
提供了默认配置的模板引擎主要有以下几种:
Thymeleaf
[推荐]
FreeMarker
Velocity
Groovy
Mustache
模板文件的默认路径为:
src/main/resources/templates
。
# 4.3 Thymeleaf
Thymeleaf
是一个服务器端的 Java 模板引擎
,可用于 Web 与非 Web 环境中
的应用开发。
Thymeleaf
的主要目标是提供一种可被浏览器正确显示、格式良好的模板创建方式。
Thymeleaf
是现代 WEB
程序的理想选择。
# 4.3.1 添加依赖
<!-- Thymeleaf: 服务器端的Java模板引擎 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2
3
4
5
# 4.3.2 编写模板文件
在 templates
中编写模板文件
- index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello Thymeleaf</title></head>
<body><h1 th:text="${hello}">Hello Thymeleaf</h1></body>
</html>
2
3
4
5
6
7
xmlns:th="http://www.thymeleaf.org"
: HTML中引入
th:text
: thymeleaf文本标签
${}
: 后台取值#{}
: 国际化
# 4.3.3 生成模板数据
@Controller
public class HelloBootController {
@GetMapping("/thymeleaf")
public String thymeleaf(Model model){
model.addAttribute("hello","hello Thymeleaf !");
return "index";
}
}
2
3
4
5
6
7
8
9
10
- 浏览器访问
# 4.3.4 Thymeleaf默认配置
Spring Boot
为 Thymeleaf
模板引擎提供了如下默认配置,要修改默认配置可以在 Spring Boot配置文件
application.properties
中覆盖对应配置。
# Thymeleaf默认配置
# Enable template caching. 是否缓存(默认缓存true)
spring.thymeleaf.cache=true
# 是否检查模板位置
spring.thymeleaf.check-template=true
# 检查模板位置是否存在
spring.thymeleaf.check-template-location = true
# 设置请求类型 (Content-Type值) spring.thymeleaf.content-type = text/html
spring.thymeleaf.servlet.content-type=text/html
# 是否启用thymeleaf模板引擎(默认true)
spring.thymeleaf.enabled=true
# 模板编码 Template encoding.
spring.thymeleaf.encoding=UTF-8
# 应该从解决方案中排除的视图名称的逗号分隔列表。
spring.thymeleaf.excluded-view-names =
# 应用于模板的模板模式。另请参见StandardTemplateModeHandlers。 Template mode to be applied to templates. See also StandardTemplateModeHandlers.
spring.thymeleaf.mode=HTML5
# 构建URL时预先查看名称的前缀 Prefix that gets prepended to view names when building a URL.
spring.thymeleaf.prefix=classpath:/templates/
# 构建URL时附加到查看名称的后缀 Suffix that gets appended to view names when building a URL.
spring.thymeleaf.suffix=.html
# 链中模板解析器的顺序。
spring.thymeleaf.template-resolver-order =
# 可以解析的视图名称的逗号分隔列表
spring.thymeleaf.view-names =
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 4.4 项目热加载(页面)
<!--devtools热加载-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
2
3
4
5
6
7
问题
解决
pom 文件中添加
<plugins>
<!--springboot编译运行打包部署.构建插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--解决引入热部署依赖后,出现"x"的问题-->
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
2
3
4
5
6
7
8
9
10
11
# 5. 数据访问
# 5.1 数据源配置
添加依赖
引入 MySQL
JDBC
驱动和 Druid
数据库连接池依赖。
<!--JDBC驱动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
<!-- Druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在src/main/resources/application.properties
中配置数据源信息。
# 5.2 事务配置
在应用程序入口类添加 @EnableTransactionManagement
启用事务管理支持。
@SpringBootApplication
@EnableTransactionManagement
public class IBootApplication {
public static void main(String[] args) {
SpringApplication.run(IBootApplication.class, args);
}
}
2
3
4
5
6
7
8
9
# 5.3 SpringBoot整合Mybatis
- 此处使用
Mybatis-Plus
# 5.3.1 依赖
<!--mybatis 和 mybatis-plus驱动-->
<dependency>
<groupId>com.baomidou</groupId>WW
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
2
3
4
5
6
引入上面依赖不需要:
spring-boot-starter-jdbc
和mybatis-spring-boot-starter
两个驱动
# 5.3.2 Mapper 接口扫描配置
- 启动类上添加
@MapperScan
注解
@SpringBootApplication
@EnableTransactionManagement
@MapperScan("com.chggx.springboot.*.mapper")
public class IBootApplication {
public static void main(String[] args) {
SpringApplication.run(IBootApplication.class, args);
}
}
2
3
4
5
6
7
8
9
10
@MapperScan: Mybatis注解
# 5.3.3 Mapper 映射文件配置
在 src/main/resources/application.properties
中配置Mapper映射文件位置。
# 5.3.4 分页插件
/**
* @Author: CHGGX
* @Description: <h1> MybatisPlus配置类 </h1>
*/
@Configuration
@EnableTransactionManagement
@MapperScan("com.chggx.springboot.*.mapper")
public class MyBatisConfig {
/*** MyBatis-puls 分页插件配置 * @return */
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(-1);
return paginationInterceptor;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@EnableTransactionManagement
,@MapperScan("com.chggx.springboot.*.mapper")
: 可以配置在MybatisPlus配置类中.
# 5.3.5 代码生成器
- 方案一
/**
* @Author: CHGGX
* @Description: <h1> MybatisPlus代码生成 </h1>
*/
public class MyBatisGenerator {
/**
* 读取控制台内容
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
// gc.setOutputDir(projectPath + "/src/main/java");
gc.setOutputDir("C:\\Users\\HP\\Desktop\\新建文件夹\\i-boot" + "/src/main/java");
gc.setAuthor("CHGGX");
gc.setOpen(false);
// gc.setSwagger2(true); // 实体属性Swagger2注解
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/i-auth?useSSL=false");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(scanner("模块名"));
pc.setParent("com.chggx.springboot");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
List<FileOutConfig> focList = new ArrayList<>();
focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输入文件名称
/* return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;*/
return "C:\\Users\\HP\\Desktop\\新建文件夹\\i-boot" + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
mpg.setTemplate(new TemplateConfig().setXml(null));
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
// 使用Lombok插件
strategy.setEntityLombokModel(true);
strategy.setInclude(scanner("表名"));
strategy.setSuperServiceClass("com.chggx.springboot.common.service.IService");
strategy.setSuperServiceImplClass("com.chggx.springboot.common.service.impl.ServiceImpl");
// Controller配置
strategy.setSkipView(false);
strategy.setControllerMappingHyphenStyle(true);
// @Controller @RestController
strategy.setRestControllerStyle(false);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
// 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
测试生成
测出使用lombok,添加下面依赖
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
2
3
4
5
6
7
- 方案二
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
</dependency>
2
3
4
5
# 5.3.6 MybatisPlus配置文件
# Mybatis Plus 配置
mybatis-plus:
# mybatis plus日志 使用logback
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 实体扫描
typeAliasesPackage: com.chggx.blog.sys.entity
# Mybatis-plus xml路径配置
mapper-locations: classpath:/mapper/*Mapper.xml
configuration:
cache‐enabled: false
map‐underscore‐to‐camel‐case: true
global-config:
db-config:
# 逻辑删除
logic-delete-value: 1
logic-not-delete-value: 0
# 刷新mapper, 调试神器
refresh: true
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
此处是
yml
格式配置
MybatisPlus的测试此处省略...
# 5.4 SpringBoot整合Redis
# 5.4.1 添加依赖
Jedis 在实现上是直接连接 Redis 服务器,在多个线程间共享一个 Jedis 实例时是线程不
安全的,如果想要在多线程场景下使用 Jedis ,需要使用连接池,每个线程都使用自己的
Jedis 实例,当连接数量增多时,会消耗较多的物理资源。
与 Jedis 相比, Lettuce 则完全克服了其线程不安全的缺点: Lettuce 是一个可伸缩的线
程安全的 Redis 客户端,支持同步、异步和响应式模式。多个线程可以共享一个连接实例,而
不必担心多线程并发问题。它基于优秀 Netty NIO 框架构建,支持 Redis 的更多高级功能。
2
3
4
5
6
综上使用
Lettuce
客户端
<!--redis 访问启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--redis客户端Lettuce 数据库连接池依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2
3
4
5
6
7
8
9
10
11
# 5.4.2 数据源配置
# Redis配置
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址 (默认localhost)
spring.redis.host=localhost
# Redis服务器连接端口 (默认6379)
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接超时时间
spring.redis.timeout=10000ms
# 最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
# 最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 最大阻塞等待时间(使用负值表示没有限制) 默认 -1ms
spring.redis.lettuce.pool.max-wait=-1ms
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 5.4.3 配置类
/**
* @Author: CHGGX
* @Description: <h1> redis配置类 </h1>
*/
@Configuration
public class RedisConfig {
/**
* 连接工厂
*/
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public StringRedisSerializer stringRedisSerializer() {
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
return stringRedisSerializer;
}
@Bean
public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
return jackson2JsonRedisSerializer;
}
/**
* StringRedisTemplate
* @return StringRedisTemplate
*/
@Bean
public StringRedisTemplate stringRedisTemplate() {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
// 注入数据库连接工厂
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
// 开启事务支持
stringRedisTemplate.setEnableTransactionSupport(true);
return stringRedisTemplate;
}
/**
* RedisTemplate
* @return RedisTemplate
*/
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(stringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(stringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());
// 开启事务支持
redisTemplate.setEnableTransactionSupport(true);
return redisTemplate;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 5.4.4 测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void test(){
redisTemplate.opsForValue().set("kq","Hello Redis !");
}
}
2
3
4
5
6
7
8
9
10
11
12
13