SpringBoot应用开发指南(01)


在这里插入图片描述

引言

在当今软件开发领域,SpringBoot作为一个高效的Java开发框架,以其简洁、快速的特性受到了广泛关注。本文将深入探讨SpringBoot的一些高级特性,包括与持久层框架MyBatis、分页工具PageHelper以及数据库连接池Druid的集成。通过深入的学习和实践,你将更好地理解如何在实际项目中应用这些技术,提高开发效率和代码质量。

1. SpringBoot简介

众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是Spring Boot。

只是为了提升Spring开发者的工具,特点:敏捷式、快速开发。

1.1 什么是SpringBoot

Spring Boot 是由 Pivotal 团队提供的全新框架,2014 年 4 月发布 Spring Boot 1.0 2018 年 3 月 Spring Boot 2.0发布。它是对spring的进一步封装,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。怎么简化的呢?就是通过封装、抽象、提供默认配置等方式让我们更容易使用。

SpringBoot 基于 Spring 开发。SpringBoot 本身并不提供 Spring 框架的核心特性以及扩展功能,也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具

关于 SpringBoot 有一句很出名的话就是约定大于配置。采用 Spring Boot 可以大大的简化开发模式,它集成了大量常用的第三方库配置,所有你想集成的常用框架,它都有对应的组件支持,例如 Redis、MongoDB、Jpa、kafka,Hakira 等等。SpringBoot 应用中这些第三方库几乎可以零配置开箱即用,大部分的 SpringBoot 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

1.1.1 背景

SpringBoot的出现是为了简化Spring应用的搭建过程,通过默认配置和约定俗成的方式,减少开发人员在配置文件上的投入,从而提高开发效率。

1.1.2 优势

简化配置:通过约定大于配置的原则,SpringBoot极大地简化了应用的配置过程。
内嵌服务器:SpringBoot支持多种内嵌服务器,如Tomcat、Jetty等,使得应用可以独立运行,无需外部Web服务器。
自动化:通过自动配置和自动装配,SpringBoot可以根据项目的依赖自动配置很多功能。

1.1.3 核心概念

起步依赖:通过Maven或Gradle引入特定功能的依赖,简化了项目的依赖管理。
自动配置:SpringBoot根据项目的依赖自动配置应用上下文,简化了配置文件。
注解驱动:采用注解驱动的方式进行开发,减少了样板代码的编写。

1.1.3 特点

  • 独立运行的 Spring 项目

Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java–jar xx.jar” 即可运行。

  • 内嵌 Servlet 容器

Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。

  • 提供 starter 简化 Maven 配置

Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。

  • 提供了大量的自动配置

Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。

  • 自带应用监控

Spring Boot 可以对正在运行的项目提供监控。

  • 无代码生成和 xml 配置

Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。

2. SpringBoot入门

点击创建文件

在这里插入图片描述

在这里插入图片描述

版本2.7.6,jdk1.8,图片选不到我的解决方法是在生成好之后更改pom文件
在这里插入图片描述

然后把application.properties改为application.yml,先下载插件
在这里插入图片描述
右击绿色的,然后左击第二个箭头,就会更改为yml
在这里插入图片描述
pom.xml
暂时先把MyBatis和MySQL注释掉,因为yml还没配置

<?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>
    <groupId>com.zking</groupId>
    <artifactId>boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>boot</name>
    <description>boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
    </properties>

    <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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>mysql</groupId>-->
<!--            <artifactId>mysql-connector-java</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>2.3.0</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.zking.core.BootApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

然后运行启动项目就好了

2. SpringBoot集成MyBatis

配置映射


 #  服务运行的端口
 server:
     port: 8080
spring:
  #数据源配置
    datasource:
        url: jdbc:mysql://localhost:3306/bookshop
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
 #mybatis配置

mybatis:
    #mapper.xml所在的位置
    mapper-locations: classpath*:mapper/*xml

然后添加数据库
在这里插入图片描述

  • 输入完成,进行测试的时候出现时差问题,下面的网址可以解决
    在这里插入图片描述

  • 解决方法网址:
    https://blog.csdn.net/liuqiker/article/details/102455077?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-102455077-blog-106429131.235%5Ev39%5Epc_relevant_anti_t3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-102455077-blog-106429131.235%5Ev39%5Epc_relevant_anti_t3&utm_relevant_index=6

  • 然后对表进行代码生成
    在这里插入图片描述

在这里插入图片描述
然后Finish完成
此时代码就生成完成了

mapper所在的包必须在启动类中开启扫描
在这里插入图片描述
这时候运行项目就可以运行成功了
在这里插入图片描述

3. SpringBoot集成PageHelper

3.1 什么是PageHelper

PageHelper是一个用于MyBatis的分页插件,可以帮助我们方便地进行分页查询。在这一小节中,我们将深入了解PageHelper的基本用法和高级特性。

集成:
pom文件配置

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.6</version>
        </dependency>

配置yml

pagehelper:
    #使用的方言
    helperDialect: mysql
    #开启分页合理化
    reasonable: true
    #mapper方法上的分页参数
    supportMethodsArguments: true
    #查询数量
    params: count=countSql

再创建好pageben

package page;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PageBean {

    private Integer page = 1;
    private Integer rows = 5;
    private Long total = 0L;
    private boolean open = true;

    public int start() {
        return (page - 1) * rows;
    }

    public int previous() {
        return Math.max(this.page - 1, 1);
    }

    public int next() {
        return Math.min(this.page + 1, maxPage());
    }

    public int maxPage() {
        return (int) Math.ceil(this.total.intValue() / (this.rows * 1.0));
    }

}

BootController

package com.yuan.springbook20231212.controller;

import com.github.pagehelper.PageHelper;
import com.yuan.springbook20231212.mapper.TBookMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import page.PageBean;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-12-12 17:09
 */
@RestController
@RequestMapping("/book")
public class BookController {
    @Autowired
    private TBookMapper tBookMapper;

    @RequestMapping("/list")
    public Object list(PageBean pageBean){
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        return tBookMapper.selectlist();
    }

}

分页成功
在这里插入图片描述

通过切面实现分页

需要用到两个类PageAspect,PageAnnotation

package page;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PageAnnotation {
}

package page;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class PageAspect {

    @Pointcut("@annotation(PageAnnotation)")
    public void cut() {
    }

    @Around("cut()")
    public Object aroundHandler(ProceedingJoinPoint point) throws Throwable {
        Object[] args = point.getArgs();
        PageBean pageBean = new PageBean().setOpen(false);
        for (Object arg : args) {
            if (arg instanceof PageBean) pageBean = (PageBean) arg;
        }
        PageHelper.startPage(pageBean.getPage(), pageBean.getRows(), pageBean.isOpen());
        Object val = point.proceed();
        if (pageBean.isOpen()) {
            Page<?> page = (Page<?>) val;
            pageBean.setTotal(page.getTotal());
        }
        return val;
    }

}

Service层通过@PageAnnotation切入方法

package com.yuan.springbook20231212.Service.impl;

import com.yuan.springbook20231212.Service.BookService;
import com.yuan.springbook20231212.mapper.TBookMapper;
import com.yuan.springbook20231212.pojo.TBook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import page.PageAnnotation;
import page.PageBean;

import java.util.List;

/**
 * @author 叶秋
 * @site
 * @company 卓京公司
 * @create 2023-12-12 20:51
 */
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private TBookMapper tBookMapper;
    @Override
    @PageAnnotation
    public List<TBook> selectlist(PageBean pageBean) {
        return tBookMapper.selectlist();
    }
}

Controller层

@RequestMapping("/list")
    public Object list(PageBean pageBean){
        PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        return bookService.selectlist(pageBean);
    }

这样就可以进行一个切面分页了

4. SpringBoot集成Druid

4.1 什么是Druid
Druid是一个高性能的数据库连接池,支持监控和扩展
pom配置

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>

yml配置

druid:
      # 初始化时建立物理连接的个数
      initial-size: 5
      # 最小连接池数量
      min-idle: 5
      # 最大连接池数量
      max-active: 20
      #配置获取连接等待超时的时间
      max-wait: 60000
      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      # 一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 30000
      # 用来检测连接是否有效的 sql,要求是一个查询语句
      validation-query: SELECT 1 FROM DUAL
      # 建议配置为 true,不影响性能,并且保证安全性
      test-while-idle: true
      # 申请连接时执行 validationQuery 检测连接是否有效
      test-on-borrow: true
      # 归还连接时执行 validationQuery 检测连接是否有效
      test-on-return: false
      # 是否缓存 preparedStatement,PsCache
      # PSCache 对支持游标的数据库性能提升巨大,比如说 oracle,而 mysql 则建议关闭
      pool-prepared-statements: true
      # 要启用 PSCache,必须配置大于0
      max-pool-prepared-statement-per-connection-size: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计
      filter:
        stat:
          merge-sql: true
          slow-sql-millis: 5000
      # 基础监控配置
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: true
        session-stat-max-count: 100
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: true
        login-username: admin #设置监控页面的登录名和密码
        login-password: admin
        allow: 127.0.0.1 #deny: 192.168.1.100

数据库配置那里再加一个
type: com.alibaba.druid.pool.DruidDataSource
在这里插入图片描述
然后启动项目,输入下面网址
http://127.0.0.1:8080/druid/login.html,admin-admin
在这里插入图片描述

集成日志
yml

logging:
    level:
      com.yuan.springbook20231212.mapper: dubug

总结

通过本文的深入学习,无论是简化配置的SpringBoot,还是强大的MyBatis、PageHelper和Druid,它们的集成和使用都是提高开发效率、优化数据库操作和保障系统稳定性的关键。

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值