当前位置: 首页 > news >正文

框架之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 快速使用

在这里插入图片描述

  1. 创建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>
  1. 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;
}
  1. UserMapper接口
public interface UserMapper extends BaseMapper<User> {

}
  1. 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
  1. UserService
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> findAll() {
        return userMapper.selectList(null);
    }
}
  1. UserController
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }
}
  1. 启动类
@SpringBootApplication
@MapperScan("com.baidu.mapper")
public class MPApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(MPApplication.class, args);
    }
}
  1. 实体跟表名映射关系
    在这里插入图片描述

  2. 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);
        }
    }
}
  1. 条件查询

官网提供了QueryWrapper对象,用于生成 sql 的 where 条件

查询方法说明
eq等于(=)
ne不等于(!=)
gt大于(>)
ge大于等于(>=)
lt小于(<)
le小于等于(<=)
like模糊查询 LIKE
notLike模糊查询 NOT LIKE
inIN查询
notInNOT IN查询
isNullNULL值查询
isNotNullIS 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);
    }
}
  1. 自定义SQL
public interface UserMapper extends BaseMapper<User> {

    // 自定义分组查询sql语句
    @Select("SELECT age ,COUNT(age) FROM tb_user GROUP BY age")
    public List<Map> findAgeCount();
}
  1. 分页查询
    – 开启分页插件
//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 快速使用

  1. 启动redis
    在这里插入图片描述
  2. 导入依赖
<!--redis 起步依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. application.yml配置
    在这里插入图片描述
  2. 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;
}
  1. 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;
    }
}
  1. 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包发布(官方推荐)

  1. 配置打包插件
<build>
    <finalName>springboot-mp</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  1. 执行java命令
    – 通过maven命令package完成项目打包;找到jar包位置,以命令行窗口执行
java -jar springboot-mp.jar

在这里插入图片描述

5.2 war包发布

  1. 找到项目的pom.xml文件修改默认打包方式为war
    在这里插入图片描述
  2. 配置启动类
@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);
    }
}
  1. 部署到Tomcat
    执行maven的package命令,将打好的war包放入Tomcat中运行

六、SpringBoot项目监控

6.1 Actuator监控

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等。

  1. 导入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. 配置展示详细信息
management:
 # 配置展示详细信息
 endpoint:
   health:
   	 show-details: always
 # 配置展示所有检查信息
 web:
   exposure:
     include: "*"
  1. 效果展示
    在这里插入图片描述
  2. 路径&描述
路径描述
/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 应用的健康状况,提供实时警报功能。

在这里插入图片描述

  1. 搭建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
  1. 配置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/

相关文章:

  • 【小程序】中WXS的语法详解
  • Spring Cloud Gateway - GatewayFilter路由过滤器
  • 猿创征文|大数据之Kafka简介+基操
  • Shiro授权--注解式开发
  • CREO:CREO软件之零件【编辑】之修饰、用户定义特征的简介及其使用方法(图文教程)之详细攻略
  • Java并发 | 12.[方法] interrupt( )打断
  • SpringBoot 事务开发代码及注意事项
  • onnx: step = 1 is currently not supported
  • webpack原理篇(六十五):实战开发一个压缩构建资源为zip包的插件
  • 数学建模学习(97):花授粉算法(FPA)寻优
  • 鲈鱼的面试题库+答案
  • CREO:CREO软件之零件【工具(调查/模型意图/实用工具)】、【视图(可见性/方向/模型显示/显示/窗口)】的简介及其使用方法(图文教程)之详细攻略
  • 【单细胞高级绘图】09.细胞通讯_两组比较_连线图
  • Tensorflow笔记——基于Mnist数据集图片分类的神经网络
  • 情侣积分微信小程序零基础开发教程(附代码及开发指南)
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS 7 防火墙操作
  • CSS魔法堂:Absolute Positioning就这个样
  • eclipse(luna)创建web工程
  • go语言学习初探(一)
  • JavaScript函数式编程(一)
  • Java面向对象及其三大特征
  • k个最大的数及变种小结
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Tornado学习笔记(1)
  • Vue 重置组件到初始状态
  • 简单数学运算程序(不定期更新)
  • 前端_面试
  • 前端面试总结(at, md)
  • 如何在 Tornado 中实现 Middleware
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用 Docker 部署 Spring Boot项目
  • 微信公众号开发小记——5.python微信红包
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 怎么将电脑中的声音录制成WAV格式
  • 自动记录MySQL慢查询快照脚本
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #Z0458. 树的中心2
  • $.ajax()方法详解
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (+4)2.2UML建模图
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (4)Elastix图像配准:3D图像
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (十)T检验-第一部分
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (循环依赖问题)学习spring的第九天
  • (一)Dubbo快速入门、介绍、使用