框架之SpringBoot基础(二)
框架之SpringBoot基础(二)
- 一、SpringBoot 整合Mybatis Plus
- 1.1 Mybatis-Plus简介
- 1.2 快速使用
- 二、SpringBoot 整合Redis
- 2.1 快速使用
- 三、Spring Boot自动装配原理
- 四、自定义起步依赖
- 4.1 分析MybatisPlus起步依赖
- 4.2 代码实现
- 4.2.1 导入依赖
- 4.2.2 编写OssProperties
- 4.2.3 编写OssTemplate
- 4.2.4 编写OssAutoConfiguration
- 4.2.5 编写自动装配文件
- 五、SpringBoot项目部署方式
- 5.1 jar包发布(官方推荐)
- 5.2 war包发布
- 六、SpringBoot项目监控
- 6.1 Actuator监控
- 6.2 SpringBoot Admin
一、SpringBoot 整合Mybatis Plus
1.1 Mybatis-Plus简介
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MP已经封装了一些常用的crud方法,只需要调用这些方法就可以完成简单的数据库操作,不需要程序员在写xml文件。
官网:https://mybatis.plus/
1.2 快速使用
- 创建java模块,导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--mybatisPlus 起步依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
</dependencies>
- User实体
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tb_user")
public class User {
private Long id;
private String username;
private String password;
private String nickName;
private Integer age;
private String email;
}
- UserMapper接口
public interface UserMapper extends BaseMapper<User> {
}
- application.yml配置
# 数据源配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot_db?useSSL=false
username: root
password: root
# 日志
logging:
level:
com.itheima: debug
- UserService
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> findAll() {
return userMapper.selectList(null);
}
}
- UserController
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/findAll")
public List<User> findAll() {
return userService.findAll();
}
}
- 启动类
@SpringBootApplication
@MapperScan("com.baidu.mapper")
public class MPApplication {
public static void main(String[] args) {
SpringApplication.run(MPApplication.class, args);
}
}
-
实体跟表名映射关系
-
CRUD接口
@RunWith(SpringRunner.class)
@SpringBootTest
public class MPTest {
@Autowired
private UserMapper userMapper;
// 新增
@Test
public void test01() throws Exception {
// 模拟实体数据
User user = new User();
user.setUsername("wangyi");
user.setPassword("123456");
user.setNickName("王一一");
user.setAge(27);
user.setEmail("wy@itcast.cn");
// 新增
userMapper.insert(user);
// 返回主键
System.out.println(user.getId());
}
// 修改
@Test
public void test02() throws Exception {
// 模拟实体数据
User user = new User();
user.setId(1411856627543339010L);
user.setNickName("王一");
// 修改
userMapper.updateById(user);
}
// 根据id删除
@Test
public void test03() throws Exception {
userMapper.deleteById(1411856627543339010L);
}
// 根据id查询
@Test
public void test04() throws Exception {
User user = userMapper.selectById(1411856627543339009L);
System.out.println(user);
}
// 查询所有
@Test
public void test05()throws Exception{
List<User> list = userMapper.selectList(null);
for (User user : list) {
System.out.println(user);
}
}
}
- 条件查询
官网提供了QueryWrapper
对象,用于生成 sql 的 where 条件
查询方法 | 说明 |
---|---|
eq | 等于(=) |
ne | 不等于(!=) |
gt | 大于(>) |
ge | 大于等于(>=) |
lt | 小于(<) |
le | 小于等于(<=) |
like | 模糊查询 LIKE |
notLike | 模糊查询 NOT LIKE |
in | IN查询 |
notIn | NOT IN查询 |
isNull | NULL值查询 |
isNotNull | IS NOT NULL 值查询 |
// 条件查询
@Test
public void test06() throws Exception {
// 创建条件对象
QueryWrapper<User> qw = new QueryWrapper<>(); // where
qw.like("nick_name", "王"); // nick_name like '%王%'
qw.gt("age", 23); // age > 23
qw.orderByDesc("age"); // ORDER BY age DESC
// 查询
List<User> list = userMapper.selectList(qw);
for (User user : list) {
System.out.println(user);
}
}
- 自定义SQL
public interface UserMapper extends BaseMapper<User> {
// 自定义分组查询sql语句
@Select("SELECT age ,COUNT(age) FROM tb_user GROUP BY age")
public List<Map> findAgeCount();
}
- 分页查询
– 开启分页插件
//Spring boot方式
@Configuration
public class MybatisPlusConfig {
// 最新版分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
}
–使用api
// 分页查询
@Test
public void test08() throws Exception {
// 1.开启分页
Page<User> page = new Page<>(1, 5);
// 2.查询分页
page = userMapper.selectPage(page, null);
// 3.获得结果
System.out.println(page.getTotal());// 总记录数
System.out.println(page.getPages()); // 总页数
System.out.println(page.getCurrent()); // 当前页
System.out.println(page.getSize()); // 每页格式
System.out.println(page.getRecords()); // 分页list集合
}
二、SpringBoot 整合Redis
2.1 快速使用
- 启动redis
- 导入依赖
<!--redis 起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- application.yml配置
- User
–实体类需要实现序列化接口
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tb_user")
public class User implements Serializable {
private Long id;
private String username;
private String password;
private String nickName;
private Integer age;
private String email;
}
- UserService
@Service
@Slf4j
public class UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
public List<User> findAll() {
// 声明list
List<User> list = null;
if (redisTemplate.hasKey("user_list")) { // 1.先查缓存
list = (List<User>) redisTemplate.opsForValue().get("user_list");
log.info("查询缓存");
} else { // 2.再查mysql
list = userMapper.selectList(null);
redisTemplate.opsForValue().set("user_list", list);
log.info("查询数据库");
}
return list;
}
}
- API
//操作string类型
redisTemplate.opsForValue();
//操作hash类型
redisTemplate.opsForHash();
//操作list类型
redisTemplate.opsForList();
//操作set类型
redisTemplate.opsForSet();
//操作有序set类型
redisTemplate.opsForZSet();
三、Spring Boot自动装配原理
为什么加载了redis的starter(起步依赖)之后,RedisTemplate对象会自动被new出来,并可以@Autowired了呢?这涉及到Spring Boot自动装配原理。
@EnableAutoConfiguration
注解内部使用 @Import(AutoConfigurationImportSelector.class)
读取META-INF/spring.factories
,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean
并不是读取META-INF/spring.factories
所有的Bean都会被初始化,在配置类中使用@Condition
来加载满足条件的Bean
- ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
- ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
- ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean
总结:
四、自定义起步依赖
4.1 分析MybatisPlus起步依赖
步骤分析:
创建oss-spring-boot-starter
模块
4.2 代码实现
4.2.1 导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--阿里云oss-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
</dependencies>
4.2.2 编写OssProperties
@Data
@ConfigurationProperties("oss")
public class OssProperties {
//区域
private String endpoint;
//访问id
private String accessKeyId;
//访问秘钥
private String accessKeySecret;
//桶名称
private String bucketName;
//访问URL
private String url;
}
4.2.3 编写OssTemplate
public class OssTemplate {
//区域
private String endpoint;
//访问id
private String accessKeyId;
//访问秘钥
private String accessKeySecret;
//桶名称
private String bucketName;
//访问URL
private String url;
public OssTemplate(OssProperties ossProperties) {
this.endpoint = ossProperties.getEndpoint();
this.accessKeyId = ossProperties.getAccessKeyId();
this.accessKeySecret = ossProperties.getAccessKeySecret();
this.bucketName = ossProperties.getBucketName();
this.url = ossProperties.getUrl();
}
//文件上传
public String upload(String fileName, InputStream inputStream) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流。
// <yourObjectName>表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如 images/2020/11/11/asdf.jpg。
String objectName = "images/" + new SimpleDateFormat("yyyy/MM/dd").format(new Date())
+ "/" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));
// meta设置请求头,解决访问图片地址直接下载
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));
ossClient.putObject(bucketName, objectName, inputStream, meta);
// 关闭OSSClient。
ossClient.shutdown();
return url + "/" + objectName;
}
public String getContentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpg";
}
return "image/jpg";
}
}
4.2.4 编写OssAutoConfiguration
@Configuration // 配置类
@EnableConfigurationProperties(OssProperties.class) // 读取配置文件属性对象
@ConditionalOnClass(OSS.class) // 满足项目导入阿里云坐标才能触发自动装配
public class OssAutoConfiguration {
@Bean
public OssTemplate ossTemplate(OssProperties ossProperties) {
return new OssTemplate(ossProperties);
}
}
4.2.5 编写自动装配文件
目录:/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
oss.autoconfiguration.OssAutoConfiguration
五、SpringBoot项目部署方式
5.1 jar包发布(官方推荐)
- 配置打包插件
<build>
<finalName>springboot-mp</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 执行java命令
– 通过maven命令package完成项目打包;找到jar包位置,以命令行窗口执行
java -jar springboot-mp.jar
5.2 war包发布
- 找到项目的pom.xml文件修改默认打包方式为war
- 配置启动类
@SpringBootApplication
@MapperScan("com.baidu.mapper")
public class MPApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(MPApplication.class, args);
}
// war包用的
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MPApplication.class);
}
}
- 部署到Tomcat
执行maven的package命令,将打好的war包放入Tomcat中运行
六、SpringBoot项目监控
6.1 Actuator监控
SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等。
- 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 配置展示详细信息
management:
# 配置展示详细信息
endpoint:
health:
show-details: always
# 配置展示所有检查信息
web:
exposure:
include: "*"
- 效果展示
- 路径&描述
路径 | 描述 |
---|---|
/actuator/beans | 描述应用程序上下文里全部的Bean,以及它们的关系 |
/actuator/env | 获取全部环境属性 |
/actuator/env/{name} | 根据名称获取特定的环境属性值 |
/actuator/health | 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供 |
/actuator/info | 获取应用程序的定制信息,这些信息由info开头的属性提供 |
/actuator/mappings | 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系 |
/actuator/metrics | 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 |
/actuator/metrics/{name} | 报告指定名称的应用程序度量值 |
/actuator/trace | 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等) |
6.2 SpringBoot Admin
SpringBoot Admin能够将 Actuator 中的信息进行界面化的展示,也可以监控所有 SpringBoot 应用的健康状况,提供实时警报功能。
- 搭建server端
– 导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
– 配置启动类
@SpringBootApplication
@EnableAdminServer //开启adminserver端的支持
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class,args);
}
}
– application.yml
server:
port: 9999
- 配置client端
– 导入依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.2.2</version>
</dependency>
– application.yml
spring:
boot:
admin:
client:
url: http://localhost:9999/