一、SpringBoot简介
1.1 Spring Boot是什么
SpringBoot是一个基于Spring框架的可以快速开发Web应用的轻量型框架
Spring:春天
Boot:启动
-
可以创建独立的Spring应用程序
-
嵌入了tomcat、jetty等应用服务器程序,可以不需要发布部署即可直接启动项目
-
提供了很多准备好的启动器,简化项目配置
-
自动配置Spring以及第三方依赖
-
绝对无代码生成,也完全不需要任何xml配置
1.2 如何学习SpringBoot
SpringBoot官方文档
https://docs.spring.io/spring-boot/docs/2.7.14/reference/html/
二、SpringBoot快速入门
2.1项目创建
1)创建一个maven结构java项目
2)引入SpringBoot的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<!-- SpringBoot的web启动器:SpringMVC -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
SpringBoot里面提供了很多个starter(启动器),其本质就是一个项目包,在这个项目包中依赖了其他包,项目中只需要依赖这个starter包,maven就会自动去依赖这个starter包所有依赖的其他包了(变成简介依赖)
starter-web:就是对SpringMVC所需的所有jar包进行了封装,导入starter-web包,就相当于导入了SpringMVC所需的所有jar包。
3)编写启动类,写一个main方法+注解
@SpringBootApplication
2 public class Application {
3 public static void main(String[] args) {
4 SpringApplication.run(Application.class, args);
5 }
6 }
@SpringBootApplication注解
是Spring Boot的核心注解,它其实是一个组合注解
@Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Inherited
5 @SpringBootConfiguration
6 @EnableAutoConfiguration
7 @ComponentScan(excludeFilters = {
8 @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
9 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
10 public @interface SpringBootApplication {
11 ...
12 }
- @SpringBootConfiguration:
@Configuration:表示当前启动类可以作为一个配置类,里面可以写@Bean来配置bean(等同于xml中的一个bean标签)
- @EnableAutoConfiguration:
@AutoConfigurationPackage:@Import(AutoConfigurationPackages.Registrar.class):自动递归扫描启动类所在的包
@Import(AutoConfigurationImportSelector.class):手动配置除自动扫描的bean以外的其他bean
- @ComponentScan:
扫描启动类所在包以外的其他包
4)在子模块中编写一个Controller类
package com.cqgcxy.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/hello")
public String hello(){
System.out.println("噜啦噜啦嘞");
return "Hello SpringBoot";
}
}
2.2 打包启动
1)添加打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2)执行打包命令
切换到当前项目pom.xml所在的目录,执行命令 mvn clean package
3)切换到target目录下执行命令启动项目 java -jar jar包文件的相对路径
2.3热部署
项目在开发过程中,可以不需要每次都重启,等待一段时间后会自动更新编译运行
使用
添加依赖,可以在创建的项目的时候选择,也可以中途添加
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.7.8</version>
</dependency>
开启热部署
2.4Lombok
用于简化实体类中模板代码的工具
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
2.5 SpringBoot测试(整合Junit和Mybatis)
1)添加测试启动器依赖
<!-- SpringBoot的测试启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
2)编写单元测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootTest {
@Autowired
private TestController controller;
@Test
public void hello() {
String hello = controller.hello();
System.out.println(hello);
}
}
在JUnit 4中,@RunWith
注解用于指定测试运行器,而SpringRunner.class
是Spring框架提供的测试运行器,用于在测试时创建Spring应用程序上下文。如果你的测试类中需要使用Spring的依赖注入、自动装配等特性,就需要添加@RunWith(SpringRunner.class)
来指定使用Spring提供的测试运行器。
有些情况下,不需要显式添加@RunWith(SpringRunner.class)
也能执行测试,这可能是因为项目中已经配置了默认的测试运行器,或者是因为测试类本身没有涉及到Spring的相关功能,不需要SpringRunner来创建Spring上下文。
在JUnit 5中,测试运行器的概念已经被弃用,取而代之的是扩展(Extension)机制,Spring框架也提供了对JUnit 5的扩展支持,可以通过@ExtendWith(SpringExtension.class)
来实现相同的功能。
2.5.1集成Mybatis
1)添加starter-mybatis启动器的依赖
<!-- SpringBoot的测试启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- mysql 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--
SpringBoot的mybatis启动器
这个启动器是Mybatis官方开发的,不在SpringBoot的dependenciesManagement管理范围之内
所以这里必须写版本号
-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
2)配置数据库连接信息
3)配置mybatis的别名和映射文件
# 数据库连接池配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///gcxy_teach
username: root
password: 123456
# mybatis的别名和映射文件路径
mybatis:
type-aliases-package: com.cqgcxy.entity
mapper-locations: classpath:com/cqgcxy/mapper/*Mapper.xml
config-location: classpath:mybatis-config.xml
# 日志信息
# OFF:这是最高的日志级别,用于关闭所有日志记录。
# FATAL:这个级别指出每个严重的错误事件将会导致应用程序的退出。
# ERROR:这个级别指出虽然发生错误事件,但仍然不影响系统的继续运行。
# WARN:这个级别表明会出现潜在错误的情形。
# INFO:这个级别表明消息在粗粒度级别上突出强调应用程序的运行过程。
# DEBUG:这个级别指出细粒度信息事件对调试应用程序是非常有帮助的,就是输出debug的信息。
# TRACE:这个级别指示比DEBUG更细粒度的信息事件。
logging:
level:
com.cqgcxy: trace
4)编写mapper接口和xml
5)启动类+@MapperScan注解
/**
* @MapperScan("com.cqgcxy.mapper")
* 代替了xml配置里面的MapperScannerConfigurer的bean标签配置,里面写了一个mapper层接口的包名称
* 底层使用了动态代理技术自动生成实现类,通过Spring创建对象,并且注册到Spring容器中
*/
@MapperScan("com.cqgcxy.mapper")
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
6)单元测试
三、MybatisPlus学习
MybatisPlus中文官网:简介 | MyBatis-Plus
3.1Mybatis-plus代码生成器
<properties>
<mybatis-plus-generator.version>3.4.1</mybatis-plus-generator.version>
<velocity-engine-core.version>2.3</velocity-engine-core.version>
</properties>
<!-- 逆向工程代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus-generator.version}</version>
</dependency>
<!-- 生成器默认模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity-engine-core.version}</version>
</dependency>
3.2在启动引导类同包下创建代码生成器类CodeGenerator
package cn.edu.cqie;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class CodeGenerator {
/**
* <p>
* 读取控制台内容
* </p>
*/
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.setAuthor("Pep7Chiao");
gc.setOpen(false);
// 设置名字
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
// 设置 resultMap
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/gcxy_teach?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 包配置
PackageConfig pc = new PackageConfig();
// pc.setModuleName(scanner("模块名"));
pc.setParent("com.cqgcxy");
mpg.setPackageInfo(pc);
// 如果模板引擎是 velocity
String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 写于父类中的公共字段
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new VelocityTemplateEngine());
mpg.execute();
}
}