最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot + MyBatisPlus快速實現(xiàn)單表CRUD的示例

 更新時間:2026年06月05日 08:35:03   作者:碼客日記  
本文主要介紹了Spring Boot + MyBatisPlus快速實現(xiàn)單表CRUD的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在Spring Boot項目開發(fā)中,單表CRUD(新增Create、查詢Retrieve、修改Update、刪除Delete)是最基礎、最常用的操作。傳統(tǒng)MyBatis實現(xiàn)CRUD需要編寫大量XML映射文件和SQL語句,繁瑣且易出錯;而MyBatis-Plus(MP)作為MyBatis的增強工具,通過內置接口和注解,實現(xiàn)了單表CRUD的“零XML、零SQL”極簡開發(fā),新手也能快速上手。

本文基于「Spring Boot + MyBatis-Plus + MySQL」技術棧,全程貼合實戰(zhàn),從環(huán)境準備、項目搭建、代碼編寫到測試驗證,一步步教你快速實現(xiàn)單表CRUD,同時梳理高頻踩坑點和最佳實踐,確保你不僅能實現(xiàn)功能,還能規(guī)范編碼、規(guī)避問題,適配日常開發(fā)場景。

前置說明:本文默認你已掌握「Spring Boot + MyBatis-Plus 連接MySQL」的基礎操作(數(shù)據(jù)庫連接、依賴導入),若未掌握,可先完成數(shù)據(jù)庫連接配置,再繼續(xù)本文內容(文末附基礎連接補充)。

一、前置準備(極簡版,快速適配)

確保本地環(huán)境和項目依賴滿足要求,避免版本不兼容導致功能異常,直接照搬配置即可。

1. 環(huán)境要求

  • JDK:1.8 及以上(優(yōu)先1.8,兼容性最佳);
  • Spring Boot:2.7.x 穩(wěn)定版(新手避開3.x,減少語法差異踩坑);
  • MyBatis-Plus:3.5.x 版本(與Spring Boot 2.7.x 完美適配);
  • MySQL:5.7 / 8.0 版本(本文以MySQL 8.0為例,5.7僅驅動配置有差異);
  • 開發(fā)工具:IDEA(社區(qū)版)、MySQL客戶端(Navicat/Workbench);
  • 輔助依賴:Lombok(簡化實體類編寫,可選但強烈推薦)。

2. 核心依賴(pom.xml)

項目中需引入以下核心依賴,若已創(chuàng)建項目,核對并補充即可;若新建項目,IDEA勾選對應選項自動導入。

<!-- Spring Boot 核心啟動器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus 啟動器(核心,內置MyBatis,無需單獨引入) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- MySQL 8.0 驅動 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- Lombok(簡化實體類,無需寫get/set、toString) -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<!-- 測試依賴(用于測試CRUD功能) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

3. 數(shù)據(jù)庫與表準備

提前創(chuàng)建測試數(shù)據(jù)庫和單表,本文以「用戶表(user)」為例,執(zhí)行以下SQL語句(MySQL客戶端中運行),確保表結構和字段與后續(xù)實體類對應。

-- 1. 創(chuàng)建數(shù)據(jù)庫(名稱:mp_demo,可自定義,需與yml配置一致)
CREATE DATABASE IF NOT EXISTS mp_demo 
DEFAULT CHARACTER SET utf8mb4 
DEFAULT COLLATE utf8mb4_general_ci;
-- 2. 切換到目標數(shù)據(jù)庫
USE mp_demo;
-- 3. 創(chuàng)建用戶表(user),單表CRUD測試用
CREATE TABLE IF NOT EXISTS `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID(自增)',
  `name` varchar(30) NOT NULL COMMENT '用戶姓名',
  `age` int(11) DEFAULT NULL COMMENT '用戶年齡',
  `email` varchar(50) DEFAULT NULL COMMENT '用戶郵箱',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';

4. 核心配置(application.yml)

編寫數(shù)據(jù)庫連接配置和MyBatis-Plus基礎配置,重點修改數(shù)據(jù)庫名稱、賬號、密碼,其余配置直接復用,確保CRUD操作能正常關聯(lián)數(shù)據(jù)庫。

# 服務器配置(可選,避免端口沖突)
server:
  port: 8081
  servlet:
    context-path: /crud-demo
# 數(shù)據(jù)庫連接配置(核心,必須修改)
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL 8.0 驅動類
    url: jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
    username: root  # 你的MySQL賬號(默認root)
    password: 123456  # 你的MySQL密碼
# MyBatis-Plus 配置(簡化CRUD關鍵)
mybatis-plus:
  type-aliases-package: com.example.cruddemo.entity  # 實體類包路徑(修改為你的包名)
  mapper-locations: classpath:mapper/**/*.xml  # 自定義SQL的XML路徑(本文暫用不到,預留)
  configuration:
    map-underscore-to-camel-case: true  # 開啟下劃線轉駝峰(數(shù)據(jù)庫create_time → 實體類createTime)
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 開啟SQL日志打?。ū阌谡{試,查看執(zhí)行的SQL)
  global-config:
    db-config:
      table-prefix:  # 表前綴(若表名有前綴,如mp_user,此處填mp_,本文無前綴,留空)
      id-type: AUTO  # 主鍵自增策略(與數(shù)據(jù)庫表id自增對應)

避坑提醒:若使用MySQL 5.7,需將驅動類改為「com.mysql.jdbc.Driver」,并刪除url中的「serverTimezone=GMT%2B8」配置,驅動依賴替換為mysql-connector-java:5.1.47。

二、核心代碼編寫(零XML、零SQL,快速實現(xiàn)CRUD)

MyBatis-Plus的核心優(yōu)勢的是「BaseMapper接口」和「IService接口」,兩者都內置了完整的單表CRUD方法,無需手動編寫SQL。本文分別演示兩種方式(新手優(yōu)先掌握BaseMapper,簡化開發(fā);IService適合復雜業(yè)務場景)。

項目包結構規(guī)范(必遵循,避免掃描失?。?/p>

com.example.cruddemo  # 項目根包
├── CrudDemoApplication.java  # 啟動類
├── entity  # 實體類包(對應數(shù)據(jù)庫表)
│   └── User.java
├── mapper  # Mapper接口包(繼承BaseMapper)
│   └── UserMapper.java
├── service  # 服務層包(繼承IService,可選)
│   ├── UserService.java
│   └── impl
│       └── UserServiceImpl.java
└── controller  # 控制層包(編寫接口,測試CRUD,可選)
    └── UserController.java

1. 第一步:編寫實體類(Entity)

實體類與數(shù)據(jù)庫表一一對應,通過Lombok簡化代碼,通過MyBatis-Plus注解指定表名、主鍵策略等(若實體類名與表名一致、字段名與數(shù)據(jù)庫字段一致,部分注解可省略)。

package com.example.cruddemo.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;

/**
 * 用戶實體類,對應數(shù)據(jù)庫user表
 */
@Data  // Lombok注解,自動生成get/set、toString、equals等方法
@TableName("user")  // 指定對應數(shù)據(jù)庫表名(實體類名與表名一致時,可省略)
public class User {

    /**
     * 主鍵ID,自增
     * @TableId:指定主鍵,type=IdType.AUTO 對應數(shù)據(jù)庫自增策略
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 用戶名,對應數(shù)據(jù)庫name字段
     * 字段名與數(shù)據(jù)庫一致,無需額外注解
     */
    private String name;

    /**
     * 年齡,對應數(shù)據(jù)庫age字段
     */
    private Integer age;

    /**
     * 郵箱,對應數(shù)據(jù)庫email字段
     */
    private String email;

    /**
     * 創(chuàng)建時間,對應數(shù)據(jù)庫create_time字段
     * @TableField:指定數(shù)據(jù)庫字段名(下劃線轉駝峰可省略,此處用于演示)
     * fill = FieldFill.INSERT:插入時自動填充時間(無需手動設置)
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 更新時間,對應數(shù)據(jù)庫update_time字段
     * fill = FieldFill.INSERT_UPDATE:插入和更新時自動填充時間
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

2. 第二步:時間自動填充配置(可選,優(yōu)化體驗)

實體類中createTime和updateTime字段配置了「自動填充」,需編寫填充處理器,實現(xiàn)插入/更新時自動填充當前時間,無需手動設置字段值。

package com.example.cruddemo.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;

/**
 * MyBatis-Plus 時間自動填充處理器
 */
@Component  // 交給Spring管理,必須添加該注解
public class MyMetaObjectHandler implements MetaObjectHandler {

    // 插入時自動填充
    @Override
    public void insertFill(MetaObject metaObject) {
        // 填充createTime和updateTime字段,值為當前時間
        strictInsertFill(metaObject, "createTime", Date.class, new Date());
        strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }

    // 更新時自動填充
    @Override
    public void updateFill(MetaObject metaObject) {
        // 只填充updateTime字段,值為當前時間
        strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

3. 方式1:基于BaseMapper實現(xiàn)CRUD(新手首選)

BaseMapper是MyBatis-Plus提供的基礎Mapper接口,內置了完整的單表CRUD方法(insert、selectById、selectList、updateById、deleteById等),只需讓自定義Mapper接口繼承BaseMapper,無需編寫任何方法,即可直接使用。

3.1 編寫Mapper接口

package com.example.cruddemo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.cruddemo.entity.User;
import org.apache.ibatis.annotations.Mapper;

/**
 * UserMapper接口,繼承BaseMapper,實現(xiàn)單表CRUD
 * @Mapper:標記為MyBatis-Plus的Mapper接口,讓Spring Boot自動掃描
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 無需編寫任何方法!BaseMapper已內置所有單表CRUD方法
}

3.2 啟動類添加Mapper掃描(關鍵避坑)

打開項目啟動類,添加@MapperScan注解,指定Mapper接口所在的包路徑,否則Spring Boot無法掃描到Mapper接口,會導致注入失敗。

package com.example.cruddemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.cruddemo.mapper")  // 掃描Mapper接口包(修改為你的包名)
public class CrudDemoApplication {

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

}

3.3 BaseMapper核心CRUD方法(常用,必記)

BaseMapper內置了數(shù)十種方法,以下是單表CRUD最常用的方法,直接調用即可,無需寫SQL:

方法名功能描述示例
insert(T entity)新增一條數(shù)據(jù)(返回影響行數(shù))userMapper.insert(user);
selectById(Serializable id)根據(jù)主鍵ID查詢一條數(shù)據(jù)userMapper.selectById(1L);
selectList(QueryWrapper queryWrapper)查詢所有數(shù)據(jù)(可加條件)userMapper.selectList(null);(查詢所有)
updateById(T entity)根據(jù)主鍵ID修改數(shù)據(jù)(非null字段才修改)userMapper.updateById(user);
deleteById(Serializable id)根據(jù)主鍵ID刪除一條數(shù)據(jù)userMapper.deleteById(1L);
selectCount(QueryWrapper queryWrapper)統(tǒng)計數(shù)據(jù)條數(shù)(可加條件)userMapper.selectCount(null);(統(tǒng)計所有)

4. 方式2:基于IService實現(xiàn)CRUD(適合業(yè)務層開發(fā))

IService是MyBatis-Plus提供的服務層接口,基于BaseMapper封裝,提供了更豐富的CRUD方法(如批量操作、分頁查詢),還支持自定義業(yè)務邏輯,適合實際開發(fā)中的服務層編寫(推薦項目開發(fā)使用)。

4.1 編寫Service接口(繼承IService)

package com.example.cruddemo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.cruddemo.entity.User;

/**
 * UserService接口,繼承IService,封裝CRUD方法和業(yè)務邏輯
 */
public interface UserService extends IService<User> {
    // 此處可添加自定義業(yè)務方法(如根據(jù)姓名查詢用戶),基礎CRUD方法IService已內置
}

4.2 編寫Service實現(xiàn)類(繼承ServiceImpl)

package com.example.cruddemo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.cruddemo.entity.User;
import com.example.cruddemo.mapper.UserMapper;
import com.example.cruddemo.service.UserService;
import org.springframework.stereotype.Service;

/**
 * Service實現(xiàn)類,繼承ServiceImpl,關聯(lián)Mapper和Entity
 * @Service:標記為Spring服務層組件,交給Spring管理
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    // 基礎CRUD方法無需編寫,IService/ServiceImpl已內置
    // 示例:自定義業(yè)務方法(根據(jù)姓名查詢用戶,后續(xù)可擴展)
    /*
    public User selectByName(String name) {
        // 用QueryWrapper構建查詢條件(下文會演示)
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return baseMapper.selectOne(queryWrapper);
    }
    */
}

4.3 IService核心CRUD方法(常用)

IService在BaseMapper基礎上做了增強,新增了批量操作、分頁等方法,常用方法如下:

  • 新增:save(T entity)(等同于insert)、saveBatch(Collection entityList)(批量新增);
  • 查詢:getById(Serializable id)(等同于selectById)、list()(查詢所有)、count()(統(tǒng)計條數(shù));
  • 修改:updateById(T entity)(等同于updateById)、updateBatchById(Collection entityList)(批量修改);
  • 刪除:removeById(Serializable id)(等同于deleteById)、removeBatchByIds(Collection<?> idList)(批量刪除)。

三、測試驗證(兩種方式,確保CRUD功能正常)

本文通過「Spring Boot測試類」直接測試CRUD功能,無需編寫接口,簡單高效;后續(xù)也可通過控制層編寫接口,用Postman測試(文末附控制層示例)。

1. 測試BaseMapper方式(新手優(yōu)先)

在test目錄下,找到默認的測試類,注入UserMapper,編寫測試方法,逐一驗證CRUD功能。

package com.example.cruddemo;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.cruddemo.entity.User;
import com.example.cruddemo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;

@SpringBootTest  // 標記為Spring Boot測試類,啟動Spring容器
class CrudDemoApplicationTests {

    // 自動注入UserMapper(Spring掃描@Mapper注解后,自動創(chuàng)建實例)
    @Autowired
    private UserMapper userMapper;

    /**
     * 測試1:新增用戶(Create)
     */
    @Test
    void testInsert() {
        // 創(chuàng)建User對象,無需設置id(自增)、createTime、updateTime(自動填充)
        User user = new User();
        user.setName("張三");
        user.setAge(22);
        user.setEmail("zhangsan@163.com");

        // 調用BaseMapper的insert方法,新增數(shù)據(jù)
        int rows = userMapper.insert(user);
        System.out.println("新增成功,影響行數(shù):" + rows);
        System.out.println("新增用戶ID:" + user.getId());  // 新增后,自增ID會自動回顯
    }

    /**
     * 測試2:根據(jù)ID查詢用戶(Retrieve)
     */
    @Test
    void testSelectById() {
        // 調用selectById方法,根據(jù)ID查詢(ID為新增時回顯的ID,可修改為自己的)
        User user = userMapper.selectById(1L);
        System.out.println("查詢到的用戶信息:" + user);
    }

    /**
     * 測試3:查詢所有用戶 + 條件查詢(Retrieve)
     */
    @Test
    void testSelectList() {
        // 1. 查詢所有用戶(無條件,queryWrapper傳null)
        List<User> allUser = userMapper.selectList(null);
        System.out.println("所有用戶:" + allUser);

        // 2. 條件查詢(示例:查詢年齡>20的用戶)
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.gt("age", 20);  // gt表示“大于”,eq表示“等于”,lt表示“小于”
        List<User> userList = userMapper.selectList(queryWrapper);
        System.out.println("年齡大于20的用戶:" + userList);
    }

    /**
     * 測試4:根據(jù)ID修改用戶(Update)
     */
    @Test
    void testUpdateById() {
        // 1. 先查詢要修改的用戶(確保用戶存在)
        User user = userMapper.selectById(1L);
        // 2. 修改用戶信息(僅修改非null字段)
        user.setAge(23);  // 修改年齡
        user.setEmail("zhangsan_update@163.com");  // 修改郵箱

        // 3. 調用updateById方法,修改數(shù)據(jù)
        int rows = userMapper.updateById(user);
        System.out.println("修改成功,影響行數(shù):" + rows);
    }

    /**
     * 測試5:根據(jù)ID刪除用戶(Delete)
     */
    @Test
    void testDeleteById() {
        // 調用deleteById方法,根據(jù)ID刪除(ID為要刪除的用戶ID,謹慎操作)
        int rows = userMapper.deleteById(1L);
        System.out.println("刪除成功,影響行數(shù):" + rows);
    }
}

2. 測試IService方式(服務層測試)

注入UserService,測試IService內置的CRUD方法,用法與BaseMapper類似,更貼合實際業(yè)務開發(fā)。

package com.example.cruddemo;

import com.example.cruddemo.entity.User;
import com.example.cruddemo.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;

@SpringBootTest
class UserServiceTest {

    // 自動注入UserService(@Service注解標記,Spring自動管理)
    @Autowired
    private UserService userService;

    // 測試新增
    @Test
    void testSave() {
        User user = new User();
        user.setName("李四");
        user.setAge(25);
        user.setEmail("lisi@163.com");
        boolean success = userService.save(user);  // IService返回boolean,更直觀
        System.out.println("新增是否成功:" + success);
    }

    // 測試查詢所有
    @Test
    void testList() {
        List<User> userList = userService.list();
        System.out.println("所有用戶:" + userList);
    }

    // 測試修改
    @Test
    void testUpdateById() {
        User user = new User();
        user.setId(2L);  // 必須設置ID,否則無法修改
        user.setAge(26);
        boolean success = userService.updateById(user);
        System.out.println("修改是否成功:" + success);
    }

    // 測試刪除
    @Test
    void testRemoveById() {
        boolean success = userService.removeById(2L);
        System.out.println("刪除是否成功:" + success);
    }

    // 測試批量新增(IService增強方法)
    @Test
    void testSaveBatch() {
        User user1 = new User();
        user1.setName("王五");
        user1.setAge(28);
        user1.setEmail("wangwu@163.com");

        User user2 = new User();
        user2.setName("趙六");
        user2.setAge(30);
        user2.setEmail("zhaoliu@163.com");

        List<User> userList = List.of(user1, user2);
        boolean success = userService.saveBatch(userList);
        System.out.println("批量新增是否成功:" + success);
    }
}

3. 測試成功標志

  • 運行所有測試方法,控制臺無紅色報錯;
  • SQL日志正常打?。ㄩ_啟了log-impl配置),能看到自動生成的SQL語句;
  • 打開MySQL客戶端,查詢user表,能看到新增、修改、刪除后的對應數(shù)據(jù);
  • 條件查詢、批量操作能返回正確結果。

四、可選擴展:編寫控制層接口(Postman測試)

實際開發(fā)中,CRUD功能通常通過接口對外提供,這里編寫簡單的RESTful接口,用Postman測試,貼合真實開發(fā)場景。

package com.example.cruddemo.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.cruddemo.entity.User;
import com.example.cruddemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;

/**
 * 用戶控制層,編寫CRUD接口
 * @RestController:等同于@Controller + @ResponseBody,返回JSON數(shù)據(jù)
 * @RequestMapping:接口統(tǒng)一前綴
 */
@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 1. 新增用戶(POST請求)
    @PostMapping("/add")
    public String addUser(@RequestBody User user) {
        boolean success = userService.save(user);
        return success ? "新增成功" : "新增失敗";
    }

    // 2. 根據(jù)ID查詢用戶(GET請求)
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getById(id);
    }

    // 3. 查詢所有用戶(GET請求)
    @GetMapping("/list")
    public List<User> getUserList() {
        return userService.list();
    }

    // 4. 根據(jù)ID修改用戶(PUT請求)
    @PutMapping("/update")
    public String updateUser(@RequestBody User user) {
        boolean success = userService.updateById(user);
        return success ? "修改成功" : "修改失敗";
    }

    // 5. 根據(jù)ID刪除用戶(DELETE請求)
    @DeleteMapping("/{id}")
    public String deleteUser(@PathVariable Long id) {
        boolean success = userService.removeById(id);
        return success ? "刪除成功" : "刪除失敗";
    }

    // 6. 條件查詢(示例:根據(jù)姓名查詢)
    @GetMapping("/list/name")
    public List<User> getUserByName(@RequestParam String name) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return userService.list(queryWrapper);
    }
}

接口測試方法:啟動項目,打開Postman,根據(jù)接口請求方式(POST/PUT/GET/DELETE),輸入接口地址(如 http://localhost:8081/crud-demo/api/user/add),傳遞參數(shù),即可測試CRUD功能。

五、高頻踩坑點匯總(新手必看,規(guī)避90%問題)

整理了新手實現(xiàn)單表CRUD時最常遇到的6個問題,每個問題附上根因和解決方案,遇到報錯直接對照排查,快速解決。

踩坑1:Mapper注入失?。∟o qualifying bean of type ‘xxxMapper’ available)

? 報錯原因:啟動類未添加@MapperScan注解,或注解中的包路徑錯誤;Mapper接口未添加@Mapper注解。

? 解決方案:啟動類添加@MapperScan(“com.example.cruddemo.mapper”);確保Mapper接口添加@Mapper注解;核對包路徑,確保一致。

踩坑2:新增/修改后,時間字段未自動填充

? 報錯原因:未編寫時間自動填充處理器(MyMetaObjectHandler);處理器未添加@Component注解,未被Spring管理;實體類字段的@TableField(fill = …)配置錯誤。

? 解決方案:編寫MyMetaObjectHandler類,添加@Component注解;核對實體類字段的fill屬性,insert對應INSERT,update對應INSERT_UPDATE。

踩坑3:修改數(shù)據(jù)無效,無報錯

? 報錯原因:修改時未設置實體類的id字段(MyBatis-Plus根據(jù)id修改);實體類所有字段為null,無修改內容;數(shù)據(jù)庫表主鍵不是id,或主鍵策略配置錯誤。

? 解決方案:修改時必須設置實體類的id;確保至少有一個非null字段需要修改;核對yml中mybatis-plus.global-config.db-config.id-type配置,與數(shù)據(jù)庫主鍵策略一致。

踩坑4:條件查詢無結果,SQL日志顯示條件錯誤

? 報錯原因:QueryWrapper構建條件時,字段名與數(shù)據(jù)庫字段不一致;未開啟下劃線轉駝峰配置,導致字段匹配失?。ㄈ鏲reateTime對應create_time)。

? 解決方案:QueryWrapper中使用數(shù)據(jù)庫字段名(如name、age),而非實體類駝峰名;確保yml中開啟map-underscore-to-camel-case: true。

踩坑5:Service注入失?。∟o qualifying bean of type ‘xxxService’ available)

? 報錯原因:Service實現(xiàn)類未添加@Service注解;Service接口未繼承IService,或實現(xiàn)類未繼承ServiceImpl。

? 解決方案:Service實現(xiàn)類添加@Service注解;確保UserService繼承IService,UserServiceImpl繼承ServiceImpl<UserMapper, User>。

踩坑6:SQL日志不打印,無法調試

? 報錯原因:未開啟MyBatis-Plus的SQL日志打印配置;log-impl配置路徑錯誤。

? 解決方案:在yml的mybatis-plus.configuration中,添加log-impl: org.apache.ibatis.logging.stdout.StdOutImpl。

六、補充:BaseMapper vs IService 選擇建議

很多新手會糾結兩種方式的選擇,結合實際開發(fā)場景,給出明確建議,避免選型困惑:

  • 新手入門、簡單測試:優(yōu)先使用BaseMapper,代碼更簡潔,無需編寫Service層,快速實現(xiàn)CRUD;
  • 實際項目開發(fā):優(yōu)先使用IService+ServiceImpl,封裝服務層,便于添加自定義業(yè)務邏輯,支持批量操作、分頁查詢等增強功能,符合分層開發(fā)規(guī)范(Controller → Service → Mapper);
  • 核心區(qū)別:IService基于BaseMapper封裝,功能更豐富,返回值更直觀(如boolean表示操作結果),適合業(yè)務場景;BaseMapper更偏向底層,適合簡單場景。

七、總結

Spring Boot + MyBatis-Plus 實現(xiàn)單表CRUD的核心,就是“復用MyBatis-Plus內置接口”,無需編寫XML和SQL,極大簡化了開發(fā)流程,核心步驟可總結為3步:

  • 準備工作:導入核心依賴、配置數(shù)據(jù)庫連接、創(chuàng)建數(shù)據(jù)庫表;
  • 核心編碼:編寫實體類(關聯(lián)數(shù)據(jù)庫表)、Mapper接口(繼承BaseMapper)、Service層(可選,繼承IService);
  • 測試驗證:通過測試類或接口,驗證新增、查詢、修改、刪除功能正常。

本文覆蓋了新手實現(xiàn)單表CRUD的全流程,從基礎配置到進階用法,從測試驗證到踩坑排查,貼合實戰(zhàn)場景,新手只需跟著步驟操作,就能快速上手。后續(xù)可基于此基礎,學習MyBatis-Plus的高級特性(條件構造器、分頁插件、自動生成代碼),進一步提高開發(fā)效率。

若遇到其他問題,可對照本文踩坑點排查,或留言交流,助力你快速搞定單表CRUD開發(fā)!

到此這篇關于Spring Boot + MyBatisPlus快速實現(xiàn)單表CRUD的示例的文章就介紹到這了,更多相關SpringBoot MyBatisPlus 單表CRUD內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java制作智能拼圖游戲原理及代碼

    Java制作智能拼圖游戲原理及代碼

    本文給大家分享的是使用Java實現(xiàn)智能拼圖游戲的原理,以及實現(xiàn)的源碼,推薦給大家,有需要的小伙伴可以參考下。
    2015-03-03
  • @Async異步線程池以及線程的命名方式

    @Async異步線程池以及線程的命名方式

    這篇文章主要介紹了@Async異步線程池以及線程的命名方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring Properties的使用和配置方法

    Spring Properties的使用和配置方法

    這篇文章主要介紹了Spring Properties的使用和配置方法,本文不是原理分析、源碼分析文章,只是希望可以幫助讀者更好地理解和使用 Spring Properties,有興趣的可以了解一下
    2018-01-01
  • SpringBoot3整合SpringSecurity6快速入門示例教程

    SpringBoot3整合SpringSecurity6快速入門示例教程

    SpringSecurity 是Spring大家族中一名重要成員,是專門負責安全的框架,本文給大家介紹SpringBoot3整合SpringSecurity6快速入門示例教程,感興趣的朋友一起看看吧
    2025-04-04
  • Java移除無效括號的方法實現(xiàn)

    Java移除無效括號的方法實現(xiàn)

    本文主要介紹了Java移除無效括號的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot如何實現(xiàn)Tomcat自動配置

    SpringBoot如何實現(xiàn)Tomcat自動配置

    這篇文章主要介紹了SpringBoot如何實現(xiàn)Tomcat自動配置,幫助大家更好的理解和學習使用SpringBoot框架,感興趣的朋友可以了解下
    2021-03-03
  • Java微信二次開發(fā)(一) Java微信請求驗證功能

    Java微信二次開發(fā)(一) Java微信請求驗證功能

    這篇文章主要為大家詳細介紹了Java微信二次開發(fā)第一篇,Java微信請求驗證功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Jrebel License Server 激活 IDEA-Jrebel-在線-離線-均適用(推薦)

    Jrebel License Server 激活 IDEA-Jrebel-在線-

    這篇文章主要介紹了Jrebel License Server 激活 IDEA-Jrebel-在線-離線-均適用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java中indexOf()的用法小結

    Java中indexOf()的用法小結

    這篇文章主要介紹了Java中indexOf()的用法小結,indexOf()有四種方法,用來查找某個字符或字符串的位置,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • java設計模式之實現(xiàn)對象池模式示例分享

    java設計模式之實現(xiàn)對象池模式示例分享

    對象池模式經常用在頻繁創(chuàng)建、銷毀對象(并且對象創(chuàng)建、銷毀開銷很大)的場景,比如數(shù)據(jù)庫連接池、線程池、任務隊列池等。本代碼簡單,沒有限制對象池大小
    2014-02-02

最新評論

昆明市| 西安市| 当涂县| 墨竹工卡县| 利津县| 芦溪县| 满洲里市| 安化县| 河南省| 历史| 永善县| 正镶白旗| 红河县| 离岛区| 大埔县| 雅安市| 蒲城县| 洛川县| 廊坊市| 宽城| 芮城县| 额尔古纳市| 灯塔市| 临江市| 灌云县| 东台市| 昔阳县| 专栏| 志丹县| 鹤山市| 隆昌县| 乐安县| 老河口市| 四会市| 长宁区| 华坪县| 宜宾县| 扶沟县| 盖州市| 清涧县| 玉龙|