SpringBoot--入门使用

目录

SpringBoot简介

什么是SpringBoot

相比Spring,SpringBoot的有哪些特点

SpringBoot入门使用

创建SpringBoot项目

配置项目名称

启动SpringBoot

SpringBoot整合依赖,配置开发环境

SpringBoot整合jdbc

SpringBoot整合mybatis

配置开启log日志

SpringBoot配置分页插件

整合druid数据库连接池


SpringBoot简介

  Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。Spring Boot通过自动配置功能,降低了复杂性,同时支持基于JVM的多种开源框架,可以缩短开发时间,使开发更加简单和高效。

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

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

什么是SpringBoot

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

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

相比Spring,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入门使用

创建SpringBoot项目

目录介绍,这里有一个忘记标记了,springboot启动成功后,默认访问static种的index.html文件

 在springboot之中,默认的总配置文件是properties文件,但是properties文件的格式并不美观,所以我们可以将其修改成yml文件

如下图

配置项目名称

首先springboot访问后端请求是不需要添加项目名称的,但是如果非要添加的话也可以,只需要在yml文件种添加以下代码

#spring启动项目访问后台请求是不需要加上项目名字的,如果需要加上项目名字也可以
#项目名
#  servlet:
#    context-path: 项目名
#    集成数据库配置文件

启动SpringBoot

SpringBoot内嵌入了一个tomcat如果想要启动项目,需要找到我们的SpringBoot启动类,直接启动即可

出现以下效果代表启动成功了

SpringBoot整合依赖,配置开发环境

SpringBoot整合jdbc

导入所需依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>

配置.yml总配置文件

spring:datasource:url: jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=UTF-8&SSL=falseusername: rootpassword: 123456#    配置驱动driver-class-name: com.mysql.jdbc.Driver

此时我们已经能够连接mysql了,但是没有配置好我们的mybatis持久层框架

SpringBoot整合mybatis

导入依赖

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version>
</dependency>

配置SpringBoot总配置文件

#mybatis配置
mybatis:
#配置SQL映射文件路径
mapper-locations: classpath:mapper/*.xml
#配置别名
type-aliases-package: com.wenhao.boot_1.pojo

当我们配置好这一步之后,就可以连接数据库,生成对应的实体类以及对应的mapper文件了

在idea最右侧有一个火药桶样式的图标,点击它

写好配置信息后连接数据库

连接成功后,右键表格,点击图中的按钮,生成文件

然后就会出现这个界面

完成之后,我们对应的左侧目录就会在启动类所处的同级目录下生成相应的mapper文件和实体类,mapper类的映射文件则会生成在rescouce目录下

此时我们可以启动一下项目试试看看会不会报错

这个错误告诉我们在控制层的类中,需要一个mapper类,但是找不到那个mapper类,为什么呢,因为我们并没有配置扫描器呀,所以我们需要在启动类中配置mapper扫描器

这个扫描器会自动扫描mapper包中,标注了@Repository注解的类,将其注入到其中,然后启动就不会报错了

配置开启log日志

在.yml文件中配置以下代码即可

#log日志配置
logging:level:#指定项目目录输入日志信息com.wenhao.boot_1.mapper: debug

测试,我自己写了一个查询方法,访问看看能不能拿到想要的数据

 在这里可以提一个小玩意

这个别名是从哪里来的呢?

就是这里,指定了在哪个包下面的类会生成一个别名 

SpringBoot配置分页插件

导入切面,以及分页依赖

<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>

在.yml文件中配置分页参数

pagehelper:
#  指定sql方言helperDialect: mysql
#  指定是否合理化查询reasonable: true
#  表示是否支持通过方法参数来传递分页查询的参数,例如直接在方法中传入 pageNum 和 pageSize 参数。supportMethodsArguments: true
#指定用于查询总数的 SQL 语句,通常是使用 count(*) 的方式来统计记录总数,但也可以自定义统计总数的 SQL 语句。params: count=countSql

配置完成后,我们可以结合aop来使用,这样减少代码的重复

首先我们可以定义一个自定义的注解类

package com.wenhao.boot_1.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 com.wenhao.boot_1.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 {/*** 切入点定义,指定使用 @PageAnnotation 注解的方法为切入点*/@Pointcut("@annotation(PageAnnotation)")public void cut() {}/*** 环绕通知,在切入点方法执行前后进行处理* @param point 切入点信息* @return 切入点方法的返回值* @throws Throwable 异常*/@Around("cut()")public Object aroundHandler(ProceedingJoinPoint point) throws Throwable {// 获取切入点方法的参数Object[] args = point.getArgs();// 默认的分页信息对象PageBean pageBean = new PageBean().setOpen(false);// 遍历参数,找到类型为 PageBean 的参数for (Object arg : args) {if (arg instanceof PageBean) pageBean = (PageBean) arg;}// 使用 PageHelper 进行分页设置PageHelper.startPage(pageBean.getPage(), pageBean.getRows(), pageBean.isOpen());// 执行切入点方法Object val = point.proceed();// 如果开启了分页功能,则设置总记录数到 PageBean 对象中if (pageBean.isOpen()) {Page<?> page = (Page<?>) val;pageBean.setTotal(page.getTotal());}// 返回切入点方法的返回值return val;}}

最后还有一个pagebean实体类

package com.wenhao.boot_1.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));}}

接下来我们可以在控制层测试一下

package com.wenhao.boot_1.controller;import com.wenhao.boot_1.mapper.TBookMapper;
import com.wenhao.boot_1.page.PageAnnotation;
import com.wenhao.boot_1.page.PageBean;
import com.wenhao.boot_1.pojo.TBook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @ 用户  liwen* @当前日期 2023/12/12* @当前项目名称 boot_1*/
@RestController
@RequestMapping("/book")
public class BookController  {@Autowiredprivate  TBookMapper bookMapper;@PageAnnotation@RequestMapping("/query")public List<TBook> list(PageBean pageBean){List<TBook> selectbook = bookMapper.selectbook();return selectbook;};}

往后台发送请求

可以看到此时我拿到的是第2页的数据,分页成功了

整合druid数据库连接池

各大数据库连接池对比,我只能说,阿里云开发值得信任

功能

dbcp

druid

c3p0

tomcat-jdbc

HikariCP

是否支持PSCache

监控

jmx

jmx/log/http

jmx,log

jmx

jmx

扩展性

sql拦截及解析

支持

代码

简单

中等

复杂

简单

简单

更新时间

2019.02

2019.05

2019.03

2019.02

最新版本

2.60

1.1.17

0.9.5.4

3.3.1

特点

依赖于common-pool

阿里开源,功能全面

历史久远,代码逻辑复杂,且不易维护

优化力度大,功能简单,起源于boneCP

连接池管理

LinkedBlockingDeque

数组

FairBlockingQueue

threadlocal+CopyOnWriteArrayList

导入依赖

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

在.yml文件中配置

spring:datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/bookshop?useUnicode=true&characterEncoding=UTF-8&SSL=falseusername: rootpassword: 123456#    配置驱动driver-class-name: com.mysql.jdbc.Driverdruid:#2.连接池配置#初始化连接池的连接数量 大小,最小,最大initial-size: 5min-idle: 5max-active: 20#配置获取连接等待超时的时间max-wait: 60000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒time-between-eviction-runs-millis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒min-evictable-idle-time-millis: 30000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: truetest-on-return: false# 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filter:stat:merge-sql: trueslow-sql-millis: 5000#3.基础监控配置web-stat-filter:enabled: trueurl-pattern: /*#设置不统计哪些URLexclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"session-stat-enable: truesession-stat-max-count: 100stat-view-servlet:enabled: trueurl-pattern: /druid/*reset-enable: true#设置监控页面的登录名和密码login-username: adminlogin-password: adminallow: 127.0.0.1#deny: 192.168.1.100#pagehelper分页插件配置

 Ok,大功告成,

启动SpringBoot项目访问Druid,访问地址:http://localhost:端口号/项目名称/druid/

 在这里我们可以进行整个项目的监控,不得不感叹阿里云的强大

值得一提的是,在SpringBoot项目中,和springmvc相关的包都要处在和启动类同级的目录下,否则springBoot无法进行识别,如下图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隔离电源与非隔离式电源

开关电源 文章目录 开关电源前言一、它们之间的区别是什么&#xff1f;二、如何区分它们呢&#xff1f;三、隔离电源与非隔离电源的优缺点四、隔离电源与非隔离电源的选择总结 前言 在产品设计时&#xff0c;倘若没有考虑应用环境对电源隔离的要求&#xff0c;产品到了应用时就…

Linux服务器安装vim命令

1、查看是否安装vim命令 vim /etc/hosts2、检查系统中是否存在安装包 rpm -qa|grep vim2、 安装vim yum -y install vim*4、测试是否安装成功 vim /etc/hosts

linux交换分区管理SWAP

概念查看当前的交换分区&#xff1a;free 6.2.5 交换分区管理SWAP 6.2.5.1 概念 作用&#xff1a; ”提升“内存容量&#xff0c;防止OOM&#xff08;out of memory&#xff0c;内存溢出&#xff09;。 ​ 对应windows中的虚拟内存。 ​ 从功能上讲&#xff0c;交换分区主要是…

Java进阶 1-1 枚举

目录 枚举的基本特性 枚举类型中的自定义方法 switch语句中的枚举 编译器创建的values()方法 使用实现代替继承 构建工具&#xff1a;生成随机的枚举 组织枚举 EnumSet EnumMap 本笔记参考自&#xff1a; 《On Java 中文版》 枚举类型通过enum关键字定义&#xff0c;其…

【从零开始学习JVM | 第六篇】快速了解 直接内存

前言&#xff1a; 当谈及Java虚拟机&#xff08;JVM&#xff09;的内存管理时&#xff0c;我们通常会想到堆内存和栈内存。然而&#xff0c;还有一种被称为"直接内存"的特殊内存区域&#xff0c;它在Java应用程序中起着重要的作用。直接内存提供了一种与Java堆内存和…

三天搞定jmeter入门到入职全套教程之使用Jmeter录制脚本

相对于LoadRunner跟SilkPerformer来说&#xff0c;Jmeter确实有差距&#xff0c;但毕竟前两者太贵&#xff0c;Jmeter胜在免费开源。 先看下LoadRunner录制的脚本如下&#xff0c;美如画&#xff0c;结构清晰&#xff0c;易于修改编辑&#xff0c;比如做关联等。当然目前LoadR…

Java项目-瑞吉外卖Day2

完善登录功能&#xff1a; 完善未登录不能访问/backend/index.html。使用拦截器或过滤器。 创建过滤器。 重写doFilter方法。 查看是否过滤成功。 处理流程如下&#xff1a; 添加员工功能&#xff1a; 点击保存&#xff0c;可以看到请求信息。 再看前端代码&a…

C++学习笔记—— C++内存管理方式:new和delete操作符进行动态内存管理

系列文章目录 http://t.csdnimg.cn/d0MZH 目录 系列文章目录http://t.csdnimg.cn/d0MZH 比喻和理解a.比喻C语言开空间C开空间 b.理解a、C语言的内存管理的缺点1、开发效率低&#xff08;信息传递繁琐&#xff09;2、可读性低&#xff08;信息展示混乱&#xff09;3、稳定性差&…

中间件系列 - Redis入门到实战(基础篇)

前言 1.学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 2. 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 3. 本章学习目标&#xff1a; 初始Redis 认识NoSQL认识Redi…

C++STL库的 deque、stack、queue、list、set/multiset、map/multimap

deque 容器 Vector 容器是单向开口的连续内存空间&#xff0c; deque 则是一种双向开口的连续线性空 间。所谓的双向开口&#xff0c;意思是可以在头尾两端分别做元素的插入和删除操作&#xff0c;当然&#xff0c; vector 容器也可以在头尾两端插入元素&#xff0c;但是在其…

【LeetCode刷题-树】-- 116.填充每个节点的下一个右侧节点指针

116.填充每个节点的下一个右侧节点指针 方法&#xff1a;层次遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, N…

利用anaconda中的Conda创建虚拟环境

目录 1. Anaconda 环境变量手动设置(详细)2. Conda 创建虚拟环境参考文献 1. Anaconda 环境变量手动设置(详细) 问题 Win键r打开运行对话框&#xff0c;输入cmd回车 输入conda&#xff0c;显示&#xff1a;‘conda’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处…

gamit一(虚拟机启动不了)

Intel VT-x处于禁用状态怎么办-百度经验 1重新启动电脑 2找到电脑对应的品牌&#xff0c;联想G510是F2, 3进去BIOS&#xff0c;configure里面修改virtual为enable&#xff0c;回车 4F10保存&#xff0c;退出

【教3妹学编程-算法题】需要添加的硬币的最小数量

3妹&#xff1a;2哥2哥&#xff0c;你有没有看到新闻&#xff0c; 有人中了2.2亿彩票大奖&#xff01; 2哥 : 看到了&#xff0c;2.2亿啊&#xff0c; 一生一世也花不完。 3妹&#xff1a;为啥我就中不了呢&#xff0c;不开心呀不开心。 2哥 : 得了吧&#xff0c;你又不买彩票&…

HTML实现页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>工商银行电子汇款单</title> </head> &…

Ubuntu22.04 LTS + CUDA12.3 + CUDNN8.9.7 + PyTorch2.1.1

简介 本文记录Ubuntu22.04长期支持版系统下的CUDA驱动和cuDNN神经网络加速库的安装&#xff0c;并安装PyTorch2.1.1来测试是否安装成功。 安装Ubuntu系统 如果是旧的不支持UEFI启动的主板&#xff0c;请参考本人博客U盘系统盘制作与系统安装&#xff08;详细图解&#xff09…

1839_emacs中org-mode的代码结构

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_org: my learning trip for org-mode 1839_emacs中org-mode的代码结构 org-mode的代码结构主要是简单介绍一下如何让插入的代码片段具备源代码的处理属性&#xff0c;比如说以一定的语法进行显示、执行、被某些程序…

【探讨】bp神经网络是前馈还是后馈

目录 一、BP神经网络简介 1.1 什么是BP神经网络 1.2 BP神经网络的结构 二、BP神经网络的前馈与后馈 2.1 什么是BP神经网络的前馈 2.2 什么是BP神经网络的后馈 三、BP神经网络前馈与后馈的关系 3.1 BP神经网络前馈与后馈的区别 3.2 BP神经网络前馈与后馈的意义 四、BP…

php实现个性化域名(短网址)和个性化登录模版的解决方案

在PHP中&#xff0c;个性化域名通常指的是根据用户或业务需求动态生成具有特定规律的子域名。实现个性化域名的方法主要依赖于服务器配置和路由规则。下面是一些基本的步骤和考虑因素&#xff0c;以帮助你了解如何个性化域名&#xff0c;并了解这样做的好处。 如何实现个性化域…

注意力机制和自注意力机制

有很多自己的理解&#xff0c;仅供参考 Attention注意力机制 对于一张图片&#xff0c;我们第一眼看上去&#xff0c;眼睛会首先注意到一些重点的区域&#xff0c;因为这些区域可能包含更多或更重要的信息&#xff0c;这就是注意力机制&#xff0c;我们会把我们的焦点聚焦在比…