当前位置: 首页 > news >正文

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接

  • 背景
  • 目标
  • 依赖
  • 配置文件如下
  • 项目结构如下
  • 相关配置如下
  • 启动代码如下
  • Controller如下
  • 启动成功
  • 接口调用成功

背景

工作做了一段时间,回忆起之前有个公司有线下笔试,要求考生做一个什么功能,我为了省事就直接使用了自己以前魔改的项目框架,阉割了很多功能,但是整个项目结构还是保持原样。后面功能完成的还行被喊去面试了,结果被人嘲讽怎么不自己搭框架,要用别人的框架。~~(PS:你面个试重点不讲考题,你管框架干什么,搞得别人题目做出来了,框架不会搭似的)~~工作之余,来重温一下SpringBoot最基础框架搭建,在此全部分享给大家,让这些面试官无话可说。

目标

jdk1.8环境下搭建一个SpringBoot-2.3.4.RELEASE项目,包含最基础的接口功能、数据库查询功能

工具依赖
启动器spring-boot-starter
Web容器spring-boot-starter-web
数据库dynamic-datasource-spring-boot-starter-3.6.1、mybatis-plus-boot-starter-3.4.2
其他lombok-1.18.8、commons-io-2.11.0、javax.servlet-api-4.0.1
打包spring-boot-maven-plugin-2.1.1.RELEASE

依赖

整体以来如下

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>test-dds</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- SpringBoot 核心包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- SpringBoot Web容器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 动态数据源 --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1</version></dependency><!-- mysql连接 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.17</version></dependency><!-- Mybatis-Plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><!--简化实体类,用@Data代替getset方法--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency><!-- io常用工具类 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><!-- Java Servlet --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.1.1.RELEASE</version></plugin></plugins><finalName>${project.artifactId}</finalName></build>
</project>

配置文件如下

server:port: 8765servlet:# 应用的访问路径context-path: /tomcat:# tomcat的URI编码uri-encoding: UTF-8threads:# tomcat最大线程数,默认为200max: 800# Tomcat启动初始化的线程数,默认值25min-spare: 30
spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8datasource:dynamic:datasource:master:username: rootpassword: rooturl: jdbc:mysql://127.0.0.1:3307/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=truedriver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:global-config:db-config:id-type: autoinsert-strategy: not_nullupdate-strategy: not_null# 搜索指定包别名type-aliases-package: com.dds.test.**.domain# 配置mapper的扫描,找到所有的mapper.xml映射文件mapper-locations: classpath*:mybatis/**/*Mapper.xml# 加载全局的配置文件#  config-location: classpath:mybatis/mybatis-config.xmlconfiguration:cache-enabled: trueuse-generated-keys: truedefault-executor-type: reuselog-impl: org.apache.ibatis.logging.slf4j.Slf4jImplmap-underscore-to-camel-case: true

项目结构如下

在这里插入图片描述

相关配置如下

本文只加了一个数据库时间类型字段转json的配置,需要搭配@JsonFormat使用,不需要的可以简化

package com.dds.test.config;import java.util.TimeZone;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;/*** 程序注解配置** @author framework*/
@Configuration
// 表示通过aop框架暴露该代理对象,AopContext能够访问
@EnableAspectJAutoProxy(exposeProxy = true)
// 指定要扫描的Mapper类的包的路径
@MapperScan("com.dds.test.**.mapper")
public class ApplicationConfig
{/*** 时区配置*/@Beanpublic Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization(){return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());}
}

启动代码如下

package com.dds.test;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class TestDdsApplication {public static void main(String[] args) {SpringApplication.run(TestDdsApplication.class, args);}
}

Controller如下

这里有些小伙伴可能会遇到@RestController和@Controller混淆的问题,或者写好了还是访问不成功的问题,尤其是用@Controller配置好后,接口能进入后台但是还是报404问题,我会在另外一篇文章进行解答
在这里插入图片描述

启动成功

在这里插入图片描述

接口调用成功

在这里插入图片描述

相关文章:

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接

SpringMVC基于SpringBoot的最基础框架搭建——包含数据库连接 背景目标依赖配置文件如下项目结构如下相关配置如下启动代码如下Controller如下启动成功接口调用成功 背景 工作做了一段时间&#xff0c;回忆起之前有个公司有线下笔试&#xff0c;要求考生做一个什么功能&#x…...

deepspeed zero3

zero3。它是纵向切分权重&#xff08;intra-layer&#xff0c;每一层的权重切成n块&#xff09;。但是这样会增加通讯时间。你可以根据自己的模型&#xff0c;估算下切分后的通讯量和通讯时间。其次&#xff0c;pipeline并行一般指横向切分权重&#xff08;inter-layer&#xf…...

代驾小程序怎么做

代驾小程序是一款专门为用户提供代驾服务的手机应用程序。它具有以下功能&#xff1a; 1. 预约代驾&#xff1a;代驾小程序允许用户在需要代驾服务时提前进行预约。用户可以选择出发地点、目的地以及预计用车时间&#xff0c;系统会自动匹配最合适的代驾司机&#xff0c;并确保…...

探索 AJAX 技术:实现动态数据交互的前端利器

简介&#xff1a; AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;技术在 Web 前端开发中扮演着重要的角色&#xff0c;它通过异步通信和动态内容更新&#xff0c;为用户带来更好的交互体验。本篇笔记将详细探索 AJAX 技术&#xff0c;并通过生动的代码演示来展示…...

深度学习Redis(3):主从复制

前言 在前面的两篇文章中&#xff0c;分别介绍Redis内存模型和Redis持久化 在Redis的持久化中曾提到&#xff0c;Redis高可用的方案包括持久化、主从复制&#xff08;及读写分离&#xff09;、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题&#xff08;从内存到…...

php笔记1

php环境 PHP作为一种服务器端脚本语言&#xff0c;可以在各种操作系统上运行。搭建PHP网站的环境&#xff0c;你需要以下几个要素&#xff1a; Web服务器&#xff1a;常见的选择有Apache、Nginx和IIS。你需要安装和配置其中一个服务器软件。PHP解释器&#xff1a;PHP是一种解…...

2023 ChinaJoy 圆满闭幕,FairGuard游戏加固亮相 BTOB 展区

提振行业 产业复苏 2023年7月28日至7月31日&#xff0c;第二十届中国国际数码互动娱乐展览会( ChinaJoy)于上海新国际博览中心圆满举办。本届ChinaJoy作为疫情结束后的第一个国际性数字娱乐领域的重要产业盛会&#xff0c;对于提振行业信心、加快产业复苏、增进国际间的交流与…...

数据规约策略

有很多概念平时一直在说&#xff0c;但是具体的应用场景却一直不明确&#xff0c;这会导致我们在实际应用过程中对应该使用的方法不够明确&#xff0c;在此对常用的几种数据挖掘方法使用场景进行分类和整合。 数据降维 为什么要降维 数据稀疏&#xff0c;维度高高维数据采用…...

服务器带宽独享跟共享有什么区别103.36.166.x

独享带宽 独享带宽针对对带宽有较高的要求&#xff0c;其业务的内容和性质决定只有使用独立的带宽资源才能满足品质的需求&#xff0c;而这种只给单独客户使用的带宽资源称为独享带宽. 使用独享带宽&#xff0c;整个带宽资源归属于一个客户 独享带宽的优点是可自由使用带宽量…...

【cluster_block_exception】写操作elasticsearch索引报错

【cluster_block_exception】操作elasticsearch索引b报错 背景导致原因&#xff1a;解决方法&#xff1a; 背景 今天线上elk的数据太多&#xff0c;服务器的空间不足了。所以打算删除一些没用用的数据。我是用下面的request&#xff1a; POST /{index_name}/_delete_by_query…...

chaitin-Nginx+Docker

Nginx实战 任务一 1、源码包安装NGINX A&#xff0c;搭建Web Server&#xff0c;任意HTML页面&#xff0c;其8080端口提供Web访问服务&#xff0c;截图成功访问http(s)&#x1f615;/[Server1]:8080并且回显Web页面 官网地址&#xff1a;http://nginx.org/en/download.html 步骤…...

具体面试题

具体面试题 Java 基础 JDK 和 JRE 有什么区别&#xff1f; 和 equals 的区别是什么&#xff1f; 两个对象的 hashCode() 相同&#xff0c;则 equals() 也一定为 true&#xff0c;对吗&#xff1f; final 在 java 中有什么作用&#xff1f; java 中的 Math.round(-1.5) 等…...

Logback ThresholdFilter LevelFilter

当我们需要对日志的打印要做一些范围的控制的时候&#xff0c;通常都是通过为各个Appender设置不同的Filter配置来实现。在Logback中自带了两个过滤器实现&#xff1a; ch.qos.logback.classic.filter.LevelFilter和 ch.qos.logback.classic.filter.ThresholdFilter&#xff0c…...

python+django+mysql项目实践二(前端及数据库)

python项目实践 环境说明&#xff1a; Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 前端模板 添加模板 在templates下创建 views文件中添加 创建数据库 连接数据库 在setting文件中进行配置 创建表...

Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…...

拦截器对接口细粒度权限校验

文章目录 一、逻辑分析二、校验规则1.规则类型2.规则划分3.规则配置信息4.规则案例说明5.规则加载 三、拦截器定义1.自定义拦截器2.注册拦截器 四、获取请求参数1.获取get提交方式参数2.获取post提交方式参数&#xff08;1&#xff09;定义RequestWrapper类&#xff08;2&#…...

计算机科技历史纵横:8月6日的十大里程碑

计算机科技历史纵横&#xff1a;8月6日的十大里程碑 目录 引言1951年&#xff1a;EDSAC电脑完成第一个实际计算任务1964年&#xff1a;IBM发布System/360系列1973年&#xff1a;Xerox PARC开发出第一台个人电脑Xerox Alto1976年&#xff1a;Apple发布Apple I电脑1981年&#…...

知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例,Neo4j图算法是一套在Neo4j图数据库上运行的算法集合。这些算法专门针对图数据结构进行设计,用于分析、查询和处理图数据。图算法可以帮助我们发现图中的模…...

C++ 头文件函数大全

<cstdio>头文件&#xff1a; scanf("%d",&a); cin>>a; scanf("%d%d",&a,&b); cin>>a>>b; for(i1;i<n;i) scanf("&d,&alil); cin>>a[i]; printf("%d",a); cout&l…...

智慧物流园区整体架构方案【46页PPT】

导读&#xff1a;原文《智慧物流园区整体架构方案【46页PPT】》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...