SpringBoot框架

1.SpringBoot簡介

1.1 原有Spring優(yōu)缺點(diǎn)分析

1.1.1 Spring的優(yōu)點(diǎn)分析

Spring是Java企業(yè)版(Java Enterprise Edition,javeEE)的輕量級代替品。無需開發(fā)重量級的Enterprise JavaBean(EJB),Spring為企業(yè)級Java開發(fā)提供了一種相對簡單的方法,通過依賴注入和面向切面編程,用簡單的Java對象(Plain Old Java Object,POJO)實(shí)現(xiàn)了EJB的功能。

1.1.2 Spring的缺點(diǎn)分析

雖然Spring的組件代碼是輕量級的,但它的配置卻是重量級的。
不論是一開始的基于XML的配置,還是Spring2.5引入的基于注解的組件掃描,還是Spring 3.0引入的基于Java的配置,這些都代表了開發(fā)時(shí)的額外損耗。
因?yàn)樵谒伎糞pring配置和解決業(yè)務(wù)問題之間需要進(jìn)行思維切換,甚至還帶來了何種方式配置更好的無謂爭論,所以編寫配置擠占了編寫應(yīng)用程序邏輯的時(shí)間。和所有框架一樣,Spring實(shí)用,但與此同時(shí)它要求的回報(bào)也不少。
除此之外,項(xiàng)目的依賴管理也是一件耗時(shí)耗力的事情。在環(huán)境搭建時(shí),需要分析要導(dǎo)入哪些庫的坐標(biāo),而且還需要分析導(dǎo)入與之有依賴關(guān)系的其他庫的坐標(biāo),一旦選錯(cuò)了依賴的版本,隨之而來的不兼容問題就會嚴(yán)重阻礙項(xiàng)目的開發(fā)進(jìn)度。

1.2. SpringBoot的概述

SpringBoot對上述Spring的缺點(diǎn)進(jìn)行的改善和優(yōu)化,基于約定優(yōu)于配置的思想,可以讓開發(fā)人員不必在配置與邏輯業(yè)務(wù)之間進(jìn)行思維的切換,全身心的投入到邏輯業(yè)務(wù)的代碼編寫中,從而大大提高了開發(fā)的效率,一定程度上縮短了項(xiàng)目周期。

1.2.1. SpringBoot的特點(diǎn)

● SpringBoot不是對Spring功能上的增強(qiáng),而是提供了一種快速構(gòu)建Spring的方式
● 開箱即用,沒有代碼生成,也無需XML配置。同時(shí)也可以修改默認(rèn)值來滿足特定的需求
● 提供了一些大型項(xiàng)目中常見的非功能性特性,如嵌入式服務(wù)器(嵌入Tomcat,無需部署WAR文件)、安全、指標(biāo),健康檢測、外部配置等

1.2.2. SpringBoot的核心功能

● 起步依賴
起步依賴本質(zhì)上是一個(gè)Maven項(xiàng)目對象模型(Project Object Model,POM),定義了對其他庫的傳遞依賴,這些東西加在一起即支持某項(xiàng)功能。
簡單的說,起步依賴就是將具備某種功能的坐標(biāo)打包到一起,并提供一些默認(rèn)的功能。
● 自動配置
Spring Boot的自動配置是一個(gè)運(yùn)行時(shí)(更準(zhǔn)確地說,是應(yīng)用程序啟動時(shí))的過程,考慮了眾多因素,才決定Spring配置應(yīng)該用哪個(gè),不該用哪個(gè)。該過程是Spring自動完成的。
后面會詳細(xì)說明起步依賴與自動配置的原理解析。

2.SpringBoot實(shí)例

2.1.創(chuàng)建SpringBoot簡單實(shí)例

2.1.1.創(chuàng)建工程

項(xiàng)目類型: Spring Boot
名稱: springboot
SpringBoot版本: 3.5.5
選擇依賴: Spring Web,Lombok,Spring Boot DevTools

2.1.2.工程主啟動類

@SpringBootApplication
public class SpringbootApplication {
    public static void main(String[] args) {  
        SpringApplication.run(SpringbootApplication.class, args);
    }
}

注意:

  1. @SpringBootApplication注解指定該類為SpringBoot的程序入口類。
  2. SpringBoot項(xiàng)目的Bean默認(rèn)掃描規(guī)則是:根據(jù)啟動類所在包位置從上往下掃描。
    例如:如果啟動類所在的包為:com.neuedu.springboot;那么就會自動掃描com.neuedu.springboot 包及其所有子包,否則不會被掃描!
    所以,mapper、service、controller所在包是啟動類所在包的子包。
  3. SpringApplication類中的run方法會對當(dāng)前SpringBoot工程進(jìn)行啟動。

2.1.3.創(chuàng)建Controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
    public class HelloController {
        @GetMapping("/hello")
        public String say(){          //可以直接返回對象或集合,客戶端將接收到j(luò)son數(shù)據(jù)
            return "hello...";
        }
    }

2.1.4.測試

執(zhí)行啟動類中的run方法就會啟動當(dāng)前的SpringBoot工程。

Tomcat started on port(s): 8080 (http) with context path ''
Started SpringbootApplication in 2.44 seconds (process running for 3.598)

發(fā)送請求測試 url

http://localhost:8080/hello

注意:SpringBoot內(nèi)嵌了Tomcat,所以只需要運(yùn)行SpringBoot工程的主啟動類即可。

2.2.SpringBoot的跨域處理

SpringBoot還給我們提供了兩種跨域處理方式:
1.使用 @CrossOrigin 注解配置某一個(gè) Controller 允許跨域AJAX請求。

//只要在此Controller上使用@CrossOrigin注解就可實(shí)現(xiàn)跨域訪問,并可配置允許跨域的url
@CrossOrigin("*") 
@RestController
public class DeptController { }

2.定義MVC配置類實(shí)現(xiàn) WebMvcConfigurer 接口中的 addCorsMappings 方法,在此方法中配置全局跨域處理。

import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

@Configuration
@EnableWebMvc
public class WeMvcConfig implements WebMvcConfigurer {
    /**
     * 跨域訪問設(shè)置
     */
    public void addCorsMappings(CorsRegistry registry) {
        /*
         * addMapping:配置可以被跨域的路徑,可以任意配置,可以具體到直接請求路徑。
         * allowedOrigins:允許訪問的url,可以固定單條或者多條內(nèi)容
         * allowedMethods:允許的請求方式,如:POST、GET、PUT、DELETE等。
         * allowedHeaders:允許的請求header,可以自定義設(shè)置任意請求頭信息。
         */
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        StringHttpMessageConverter converter = new StringHttpMessageConverter();
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        List<MediaType> list = new ArrayList<MediaType>();
        list.add( MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(list);
        converters.add(converter);
        converters.add( new MappingJackson2HttpMessageConverter() );
    }
}

2.3.SpringBoot熱部署

配置 IDEA 自動編譯(IDE 基礎(chǔ)設(shè)置)
即使添加了 DevTools,IDEA 默認(rèn)也不會自動編譯修改后的代碼,需要手動開啟自動編譯:
步驟 1:開啟“自動構(gòu)建項(xiàng)目”
打開 IDEA 配置:文件 → 設(shè)置 → 構(gòu)建, 執(zhí)行, 部署 → 編譯器
勾選-自動構(gòu)建項(xiàng)目
點(diǎn)擊 應(yīng)用 保存設(shè)置
步驟 2:允許運(yùn)行時(shí)自動編譯
這一步是讓 IDEA 在應(yīng)用運(yùn)行時(shí)也能自動編譯,避免“應(yīng)用啟動后[修改代碼]
打開 IDEA 配置:文件 → 設(shè)置 → 高級設(shè)置
搜索: 自動 make
勾選 即使開發(fā)的應(yīng)用程序當(dāng)前正在運(yùn)行,也允許自動 make 啟動
點(diǎn)擊 應(yīng)用 保存設(shè)置
步驟 3:調(diào)試模式運(yùn)行項(xiàng)目

3.SpringBoot原理分析

一、核心設(shè)計(jì)思想:約定優(yōu)于配置 (Convention over Configuration)
這是 Spring Boot 的靈魂。它意味著:
傳統(tǒng)Spring的痛苦: 開發(fā)人員需要花費(fèi)大量時(shí)間配置 XML 或 JavaConfig 來定義 Bean、數(shù)據(jù)源、MVC 等,雖然靈活但繁瑣。
SpringBoot的解決方案: Spring Boot 預(yù)先定義好了一套“約定俗成”的默認(rèn)配置。例如:

  • 默認(rèn)內(nèi)嵌 Tomcat 服務(wù)器。
  • 默認(rèn)的配置文件名為 application.properties 或 application.yml。
  • 默認(rèn)的日志配置(使用 Logback)。

好處: 開發(fā)者如果遵循這些約定,就可以用極少的配置(甚至零配置)快速啟動和運(yùn)行項(xiàng)目。如果你不想用約定,也可以通過自定義配置輕松覆蓋它們。
二、核心原理:四大核心
Spring Boot 的魔法主要源于以下四個(gè)核心特性:

  1. 自動配置 (Auto-Configuration)
    這是 Spring Boot 最神奇、最核心的功能。
    Spring Boot 會在啟動時(shí)自動掃描項(xiàng)目的 Classpath,根據(jù)你引入的依賴(JAR 包),自動為你配置 Spring 應(yīng)用程序的 Bean。
  • 例子當(dāng)你引入了 spring-boot-starter-web 依賴,Spring Boot 會判斷:“用戶想要開發(fā)一個(gè)Web應(yīng)用”,于是它自動配置內(nèi)嵌的 Servlet 容器、DispatcherServlet、CharacterEncodingFilter 等 Web 開發(fā)必需的 Bean。
  • 如何實(shí)現(xiàn):
    @SpringBootApplication 注解中的 @EnableAutoConfiguration 是關(guān)鍵。
    Spring Boot 在 spring-boot-autoconfigure Jar 包下預(yù)先定義了大量自動配置類(如 ServletWebServerFactoryAutoConfiguratio)。
    流程: 應(yīng)用啟動 -> 檢查 Classpath -> 如果存在 DataSource.class 且沒有用戶自己配置的 DataSource Bean -> 則執(zhí)行 DataSourceAutoConfiguration 來創(chuàng)建一個(gè)默認(rèn)的 DataSource Bean。

@SpringBootConfiguration:等同與@Configuration,既標(biāo)注該類是Spring的一個(gè)配置類@EnableAutoConfiguration:SpringBoot自動配置功能開啟 @ComponentScan:定義掃描路徑,從中找出標(biāo)識了需要裝配的類,并自動裝配到spring容器中

  1. 起步依賴 (Starter Dependencies)
    自動配置的基礎(chǔ),解決了依賴管理噩夢。
  • 是什么: 一系列預(yù)定義好的依賴描述符(POM文件)。每個(gè) Starter 都集成了開發(fā)某個(gè)功能所需的所有依賴庫,并且這些庫的版本都經(jīng)過了嚴(yán)格的兼容性測試。
  • 例子: 你不需要自己去找 Spring MVC、Tomcat、Jackson 的庫并擔(dān)心它們的版本兼容問題。只需引入一個(gè) spring-boot-starter-web,它就幫你把所有東西都管理好了。
  • 好處: 極大簡化了 Maven/Gradle 配置,避免了“依賴地獄”(Jar包沖突)。
  1. Actuator (監(jiān)控管理)
    Spring Boot 為生產(chǎn)環(huán)境運(yùn)行的項(xiàng)目提供了一套開箱即用的監(jiān)控和管理功能。
  • 是什么: 通過引入 spring-boot-starter-actuator 依賴,你的應(yīng)用會暴露一系列預(yù)定義的 HTTP 端點(diǎn)(Endpoints),如 /health(健康檢查), /info(應(yīng)用信息), /metrics(性能指標(biāo)), /env(環(huán)境變量)等。
  • 價(jià)值: 讓你能深入了解應(yīng)用程序的運(yùn)行狀態(tài),非常適合做監(jiān)控和運(yùn)維。
  1. 嵌入式容器 (Embedded Container)
    改變了Java Web應(yīng)用的部署方式。
  • 是什么: Spring Boot 應(yīng)用不再需要將項(xiàng)目打包成 WAR 包并部署到外部的 Tomcat/ Jetty 服務(wù)器中。而是將服務(wù)器(Tomcat, Jetty, Undertow)作為庫直接嵌入到最終的可執(zhí)行 Jar 包中。
  • 好處:
    1.簡化部署: 只需要一條命令 java -jar yourapp.jar 即可啟動一個(gè)完整的 Web 應(yīng)用。
    2.應(yīng)用自包含: 所有東西都在一個(gè)Jar包里,便于分發(fā)和云原生部署。
    3.統(tǒng)一性: 解決了“在我的環(huán)境是好的,為什么線上不行?”這類因環(huán)境差異導(dǎo)致的問題。

4.SpringBoot工程配置文件

SpringBoot是基于約定的,所以很多配置都有默認(rèn)值,但如果想使用自己的配置替換默認(rèn)配置的話,就可以使用SpringBoot配置文件進(jìn)行配置。
SpringBoot配置文件有兩種:properties文件形式、yml文件形式。SpringBoot默認(rèn)會從Resources目錄下加載application.properties或application.yml文件。

4.1.application.properties配置文件

下面是一個(gè) application.properties 配置文件實(shí)例:

## 修改服務(wù)器啟動端口
server.port=8080
## 設(shè)置應(yīng)用程序訪問上下文路徑
server.servlet.context-path=/elm
## 設(shè)置SpringBoot日志輸出級別(error、warn、info、debug)
logging.level.org.springframework=debug

4.2.application.yml配置文件

YML文件格式是YAML (YAML Aint Markup Language)編寫的文件格式,YAML是一種直觀的能夠被電腦識別的數(shù)據(jù)序列化格式,并且容易被人類閱讀,容易和腳本語言交互的,可以被支持YAML庫的不同的編程語言程序?qū)?,比如?C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以數(shù)據(jù)為核心的,比傳統(tǒng)的xml方式更加簡潔。
YML文件的擴(kuò)展名可以使用.yml或者.yaml。
下面是一個(gè) application.yml 配置文件實(shí)例:

server:
    port: 8765
    servlet:
        context-path: /springboot

yml文件基本語法:

  1. 大小寫敏感
  2. 使用縮進(jìn)表示層級關(guān)系(縮進(jìn)的空格數(shù)并不重要,只要相同層級的元素左對齊即可)
  3. 縮進(jìn)不允許使用tab,只允許空格
  4. 冒號后必須要有一個(gè)空格
  5. 使用 # 作為注釋

4.3.SpringBoot配置信息的查詢

4.3.1.@Value注解

我們可以通過@Value注解,將配置文件中的值映射到一個(gè)Spring管理的Bean的屬性上。

@RestController
public class HelloController {
    //server.port 就是SpringBoot配置文件中的一個(gè)值
    @Value("${server.port}")
    private int port;
    @GetMapping("/value")
    public String hello(){
        System.out.println("端口:"+port);
        return "hello" ;
    }
}

5.SpringBoot日志使用

5.1. 核心概念:Spring Boot 與 Logback

Spring Boot 默認(rèn)使用 SLF4J 作為日志門面(API),并內(nèi)置了 Logback 作為其默認(rèn)的日志實(shí)現(xiàn)框架。這意味著你無需額外添加任何依賴即可開始使用。
SLF4J: 提供統(tǒng)一的日志接口,讓你的代碼與具體的日志實(shí)現(xiàn)解耦。
Logback: 是 Log4j 的繼任者,性能更好,功能更強(qiáng)大。

5.2. 快速開始:基本使用

在任何需要記錄日志的類中,按以下步驟操作:
1.導(dǎo)入 SLF4J 的 Logger 和 LoggerFactory
2.獲取 Logger 實(shí)例(通常以當(dāng)前類名命名)
3.使用不同級別的方法記錄日志
示例

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    // 獲取Logger實(shí)例
    private static final Logger logger = LoggerFactory.getLogger(DemoController.class);
    @GetMapping("/hello")
    public String sayHello() {
        // 記錄不同級別的日志
        logger.trace("This is a TRACE log - very detailed");
        logger.debug("This is a DEBUG log - debugging info");
        logger.info("This is an INFO log - business process info");
        logger.warn("This is a WARN log - warning, but not an error");
        logger.error("This is an ERROR log - an error occurred");
        return "Hello World!";
    }
}

日志級別 (從低到高):
TRACE < DEBUG < INFO < WARN < ERROR < OFF
默認(rèn)情況下,Spring Boot 的日志級別是 INFO,所以 TRACE 和 DEBUG 級別的日志不會輸出。
使用 Lombok 簡化代碼:
如果項(xiàng)目使用了Lombok,可以用 @Slf4j 注解省略創(chuàng)建 Logger 的代碼。
示例

@Slf4j // 自動注入一個(gè)名為 'log' 的 Logger
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String sayHello() {
        log.info("This is done with Lombok!"); // 直接使用 log
        return "Hello";
    }
}

5.3. 日志基礎(chǔ)配置

在application.yml中配置
1.設(shè)置日志級別

logging:
  level: # 設(shè)置日志級別
    root: INFO # 設(shè)置根日志級別
    com.neuedu.springboot: DEBUG # 設(shè)置特定包的日志級別(常用于調(diào)試)

2.日志輸出到文件

logging:
  file:
    name: logs/app.log  # 日志文件路徑

3.設(shè)置日志格式

logging:
  pattern:
   console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" # 控制臺輸出模式
   file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" # 文件輸出模式

常用格式符說明:

  • %d: 日期時(shí)間
  • %thread: 線程名
  • %-5level: 日志級別(左對齊,固定5字符寬度)
  • %logger{36}: Logger 當(dāng)前日志輸出類名(最長36字符)
  • %msg: 日志消息
  • %n: 換行符

6.SpringBoot整合MyBatis

6.1.添加MyBatis相關(guān)依賴

   <!-- MyBatis Spring Boot Starter -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>3.0.5</version>
    </dependency>

    <!-- mysql數(shù)據(jù)庫驅(qū)動 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

6.2.新建數(shù)據(jù)庫: springboot

初始化腳本

drop table if exists `user`;

create table `user`
(
    id        int primary key auto_increment,
    name  varchar(20),
    age     int ,
    email  varchar(30)
);

6.3.添加MyBatis相關(guān)配置

在application.yml配置文件中配置MyBatis相關(guān)信息

# jdbc 數(shù)據(jù)源配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&serverTimezone=GMT%2B8
    username: root
    password: root

# mybatis配置
mybatis:
  type-aliases-package: com.neuedu.springboot.po # po別名包
  mapper-locations: classpath:mappers/*.xml # 批量加載mapper映射文件  

6.4.創(chuàng)建po類

@Data
public class User {
    private Integer id;
    private String  name;
    private Integer age;
    private String  email;
}

6.5.創(chuàng)建mapper接口及映射文件

UserMapper.java

import com.neuedu.springboot.po.User;
import org.apache.ibatis.annotations.*;
import java.util.List;

public interface UserMapper {
    @Insert("insert into `user`(name,age,email) values (#{name},#{age},#{email})")
    int insert(User user);
    @Delete("delete from `user` where id=#{id}")
    int deleteBId(Integer id);
    @Update("update `user` set name=#{name},age=#{age},email=#{email} where id=#{id}")
    int update(User user);
    @Select(" select * from `user`")
    List<User> selectAll();
    @Select(" select * from `user` where id=#{id}")
    User selectById(Integer id);

    List<User> select(User user);
}

UserMapper.xml

<?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.neuedu.springboot.mapper.UserMapper">
    <select id="select" parameterType="user" resultType="user">
        select * from `user`
        <where>
            <if test="id!=null">
                and id=#{id}
            </if>
            <if test="name!=null and name!=''">
                and name like concat('%',#{name},'%')
            </if>
        </where>
    </select>
</mapper>

6.6.創(chuàng)建service接口與實(shí)現(xiàn)類

UserService

import com.neuedu.springboot.po.User;
import java.util.List;

public interface UserService {
    String addUser(User user);
    String updateUser(User user);
    String deleteUser(int id);
    List<User> queryAllUsers();
    User queryUserById(int id);
    List<User> query(User user);
}

UserServiceImpl

import com.neuedu.springboot.mapper.UserMapper;
import com.neuedu.springboot.po.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper mapper;

    @Override
    public String addUser(User user) {
        return mapper.insert(user)==1?"新增成功":"新增失敗";
    }

    @Override
    public String updateUser(User user) {
        return mapper.update(user)==1?"修改成功":"修改失敗";
    }

    @Override
    public String deleteUser(int id) {
        return mapper.deleteById(id)==1?"刪除成功":"刪除失敗";
    }

    @Override
    public List<User> queryAllUsers() {
        return mapper.selectAll();
    }

    @Override
    public User queryUserById(int id) {
        return mapper.selectById(id);
    }

    @Override
    public List<User> query(User user) {
        return mapper.select(user);
    }
}

6.7.創(chuàng)建響應(yīng)結(jié)果封裝類

Result

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Result<T> {
    private int code;       // 狀態(tài)碼
    private String msg;     // 消息
    private T data;         // 數(shù)據(jù)

    // 成功靜態(tài)方法
    public static <T> Result<T> success(T data) {
        return Result.<T>builder()
                .code(200)
                .msg("success")
                .data(data)
                .build();
    }

    // 失敗靜態(tài)方法
    public static <T> Result<T> error(int code, String msg) {
        return Result.<T>builder()
                .code(code)
                .msg(msg)
                .build();
    }
}

6.8.創(chuàng)建controller

UserController

import com.neuedu.springboot.po.User;
import com.neuedu.springboot.response.Result;
import com.neuedu.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private  UserService service;

    @GetMapping
    public Result< List<User> > queryAll(){
        List<User> list = service.queryAllUsers();
        return Result.success(list);
    }

    @GetMapping("/{id}")
    public Result<User> queryById(@PathVariable("id") int id){
        User user = service.queryUserById(id);
        return Result.success(user);
    }

    @PostMapping("/select")
    public Result< List<User> > query(@RequestBody User user){
        List<User> list = service.query(user);
        return Result.success(list);
    }

    @PostMapping
    public Result<String> add (@RequestBody User user) {
       String result = service.addUser(user);
       return Result.success(result);
    }

    @PutMapping
    public Result<String> update (@RequestBody User user) {
        String result = service.updateUser(user);
        return Result.success(result);
    }
    @DeleteMapping("/{id}")
    public Result<String> delete (@PathVariable("id") int id) {
        String result = service.deleteUser(id);
        return Result.success(result);
    }
   @PostMapping("/query")
    public Result<List<User>> query(@RequestBody User user  ) {
        List<User> list = service.query(user);
        return Result.success(list);
    }
}

6.9.修改SpringbootApplication啟動類

@SpringBootApplication
@MapperScan("com.neuedu.springboot.mapper")
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }
}

@MapperScan 是 MyBatis 框架中的一個(gè)重要注解,注解用于配置 MyBatis的mapper接口掃描路徑

6.11.測試

使用ApiFox發(fā)送請求測試

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容