在当今软件开发领域,SpringBoot作为一个高效的Java开发框架,以其简洁、快速的特性受到了广泛关注。本文将深入探讨SpringBoot的一些高级特性,包括与持久层框架MyBatis、分页工具PageHelper以及数据库连接池Druid的集成。通过深入的学习和实践,你将更好地理解如何在实际项目中应用这些技术,提高开发效率和代码质量。
众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是Spring Boot。
只是为了提升Spring开发者的工具,特点:敏捷式、快速开发。
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 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
SpringBoot的出现是为了简化Spring应用的搭建过程,通过默认配置和约定俗成的方式,减少开发人员在配置文件上的投入,从而提高开发效率。
简化配置:通过约定大于配置的原则,SpringBoot极大地简化了应用的配置过程。
内嵌服务器:SpringBoot支持多种内嵌服务器,如Tomcat、Jetty等,使得应用可以独立运行,无需外部Web服务器。
自动化:通过自动配置和自动装配,SpringBoot可以根据项目的依赖自动配置很多功能。
起步依赖:通过Maven或Gradle引入特定功能的依赖,简化了项目的依赖管理。
自动配置:SpringBoot根据项目的依赖自动配置应用上下文,简化了配置文件。
注解驱动:采用注解驱动的方式进行开发,减少了样板代码的编写。
Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java–jar xx.jar” 即可运行。
Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。
Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。
Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。
Spring Boot 可以对正在运行的项目提供监控。
Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。
点击创建文件
版本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>
然后运行启动项目就好了
配置映射
# 服务运行的端口
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所在的包必须在启动类中开启扫描
这时候运行项目就可以运行成功了
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.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,它们的集成和使用都是提高开发效率、优化数据库操作和保障系统稳定性的关键。