目录
众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是Spring Boot。
SpringBoot是一个用于构建基于Spring框架的快速应用程序的开源框架。它简化了Spring应用程序的配置和部署过程,提供了一种快速构建生产级别的应用程序的方式。SpringBoot基于约定优于配置的原则,通过自动配置和起步依赖简化了Spring应用程序的开发过程。
SpringBoot提供了一系列的特性,包括:
1. 自动配置:SpringBoot根据应用程序的依赖和配置自动配置应用程序的环境,大大减少了开发人员的配置工作。
2. 起步依赖:SpringBoot提供了一系列的起步依赖,可以快速地集成各种常用的框架和库,如Web开发、数据访问、安全等。
3. 嵌入式容器:SpringBoot集成了常用的嵌入式容器,如Tomcat、Jetty等,可以方便地将应用程序打包成可执行的JAR文件,直接运行。
4. Actuator:SpringBoot提供了Actuator模块,可以监控和管理应用程序的运行状态,包括健康状况、运行指标等。
5. 外部化配置:SpringBoot支持将应用程序的配置外部化,可以通过属性文件、环境变量等方式灵活配置应用程序。
独立运行的 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 的所有配置。
总的来说,SpringBoot通过简化配置、提供起步依赖、集成嵌入式容器等特性,大大简化了Spring应用程序的开发和部署过程,使开发人员可以更加专注于业务逻辑的实现。因此,SpringBoot已经成为了构建Java应用程序的首选框架之一。
需要将IDEA转换为中文,下载图中的插件即可,在重启IDEA。
在我们的IDEA中创建SpringBoot项目,如图操作:
之后就是选择依赖,选择的依赖在创建项目是会自动配置好。
根据图中所示,选择5项,当然,如果还需要可以进行选择增加
以下是所有选择的依赖 :?
之后就是一个版本的选择,我这里选择的是如图 :
参考选择版本如图 :?
注意:创建完成之后,就直接修改maven设置,将maven引进项目中。?
?
包和类不能乱改,只能在com.CloudJun.boot01(自己创建的项目包中)建子包,因为程序只加载Application.java所在包及其子包下的内容。
src/main/java:主程序入口 Application,可以通过直接运行该类来启动SpringBoot应用
src/main/resources:配置目录,该目录用来存放应用的一些配置信息,比如应用名、服务端口、数据库配置等。由于我们应用了Web模块,因此产生了 static目录与templates目录,前者用于存放静态资源,如图片、CSS、JavaScript等;后者用于存放Web页面的模板文件。
src/test:单元测试目录,生成的 ApplicationTests 通过 JUnit4实现,可以直接用运行 SpringBoot应用的测试。
application.properties/application.yml:? 用于存放程序的各种依赖模块的配置信息,比如:服务端口,数据库连接配置等。
application.properties,这个后缀的模块的配置,不推荐使用,所有我们需要将这个文件转换会application.yml后缀的。
在插件中下载如图的插件 :?
下载完成之后,选中项目中application.properties的文件,右键点击如图中的选项,将会自动换成.yml后缀的,并且格式也会自动修改为.yml后缀的格式
将application.yml文件中的配置修改为以下 :?
#mybatis:
# mapper-locations: classpath:mappers/*xml
# type-aliases-package: org.example.boot01.mybatis.entity
#服务器运行的端口
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
在pom.xml文件中手动配置一个aop
<dependency> ? <groupId>org.springframework.boot</groupId> ? ?<artifactId>spring-boot-starter-aop</artifactId> </dependency>?
pom.xml?配置文件
<?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>org.example</groupId>
<artifactId>boot01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot01</name>
<description>boot01</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-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.mybatis.spring.boot</groupId>-->
<!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!-- <version>2.3.0</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.mysql</groupId>-->
<!-- <artifactId>mysql-connector-j</artifactId>-->
<!-- <scope>runtime</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.15</version>
</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>
</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.CloudJun.boot01.Boot01Application</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
数据库连接,在右侧会有一个数据库的增加连接,如图 :
选中连接数据库中的数据表,右键点击
如图输入填写 :
如图选中
注意 : template选择中可以选择default-all,这个会生成增删改查的SQL及方法,这里只演示查询,我这里就选择了default-empty,这个不会生成增删改查的SQL及方法
再将对象打上两个注释
@AllArgsConstructor? @NoArgsConstructor
将实体中设置set/get方法
增加分页依赖
<!-- 分页插件的依赖--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.6</version> </dependency>
pom.xml 配置
<?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>org.example</groupId>
<artifactId>boot01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot01</name>
<description>boot01</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-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- 分页插件的依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.15</version>
</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>
</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.CloudJun.boot01.Boot01Application</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
application.yml 文件
#mybatis:
# mapper-locations: classpath:mappers/*xml
# type-aliases-package: org.example.boot01.mybatis.entity
#服务器运行的端口
server:
port: 8080
spring:
#数据源的配置
datasource:
url: jdbc:mysql://localhost:3306/bookshop
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
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
#mybatis配置
mybatis:
# mapper.xml 所在位置
mapper-locations: classpath*:mapper/*xml
#实体类所在位置
type-aliases-package: com.CloudJun.boot01.domain
logging:
level:
com.CloudJun.boot01.mapper: debug
# 分页插件的配置
pagehelper:
# 数据库方言
helperDialect: mysql
# 是否启用 reasonable
reasonable: true
# mapper是否支持方法参数
supportMethodsArguments: true
# 参数
params: count=countSql
TBookMapper.xml 动态SQL的编写
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.CloudJun.boot01.mapper.TBookMapper">
<resultMap id="BaseResultMap" type="com.CloudJun.boot01.domain.TBook">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="bookname" column="bookname" jdbcType="VARCHAR"/>
<result property="price" column="price" jdbcType="FLOAT"/>
<result property="booktype" column="booktype" jdbcType="VARCHAR"/>
</resultMap>
<select id="bookList" resultType="com.CloudJun.boot01.domain.TBook">
select * from t_book
</select>
<sql id="Base_Column_List">
id,bookname,price,
booktype
</sql>
</mapper>
TBookMapper? 编写
package com.CloudJun.boot01.mapper;
import com.CloudJun.boot01.domain.TBook;
import com.CloudJun.boot01.utils.PageBean;
import java.util.List;
/**
* @Entity com.CloudJun.boot01.domain.TBook
*/
public interface TBookMapper {
List<TBook> bookList(PageBean pageBean);
}
?BookService
package com.CloudJun.boot01.service;
import com.CloudJun.boot01.domain.TBook;
import com.CloudJun.boot01.utils.PageBean;
import java.util.List;
/**
* @author CloudJun
* @create? 2023-12-12 15:49
*/
public interface BookService {
List<TBook> bookList(PageBean pageBean);
}
BookServiceImpl
package com.CloudJun.boot01.service.Impl;
import com.CloudJun.boot01.domain.TBook;
import com.CloudJun.boot01.mapper.TBookMapper;
import com.CloudJun.boot01.service.BookService;
import com.CloudJun.boot01.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author CloudJun
* @create? 2023-12-12 15:51
*/
@Service
public class BookServiceImpl implements BookService {
@Autowired
private TBookMapper bookMapper;
@Override
public List<TBook> bookList(PageBean pageBean) {
return bookMapper.bookList(pageBean);
}
}
?PageBean 分页工具类
package com.CloudJun.boot01.utils; 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)); } }
BookController?
package com.CloudJun.boot01.controller;
import com.CloudJun.boot01.service.BookService;
import com.CloudJun.boot01.utils.PageBean;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @author CloudJun
* @create? 2023-12-12 15:16
*/
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping("/list")
public Map List(PageBean pageBean){
Map map = new HashMap();
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
map.put("data",bookService.bookList(pageBean));
map.put("code",200);
return map;
}
}
在项目中找到Boot01Application启动类,这个是根据项目的命名来的并且拼接一个Application,如图操作进行启动:
访问路径 :?localhost:8080/book/list
? (不带参数自动分页到第已页) 访问路径根据自己在BookController 中配置的
?访问路径 :?localhost:8080/book/list?page=2
? (带参数会根据参数分页到第参数页)
基础学习可以带来以下收获:
1. 快速搭建项目:SpringBoot提供了快速搭建项目的能力,可以减少项目搭建的时间和精力,让开发者更专注于业务逻辑的实现。
2. 简化配置:SpringBoot通过自动配置和约定大于配置的原则,简化了项目的配置过程,减少了繁琐的配置代码,提高了开发效率。
3. 内嵌服务器:SpringBoot内置了Tomcat、Jetty等服务器,可以方便地将应用程序打包成可执行的JAR文件,简化了部署和运行的流程。
4. 微服务开发:SpringBoot与SpringCloud结合可以快速搭建微服务架构,实现服务注册、服务发现、负载均衡等功能,为微服务架构的开发提供了便利。
5. 生态丰富:SpringBoot拥有丰富的生态系统,包括各种插件、第三方库和开发工具,可以满足不同需求的开发。
总之,学习SpringBoot基础可以让开发者更快速、更高效地开发和部署应用程序,提高了开发效率和质量。