框架之SpringBoot基础(二)

一、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/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值