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

【数据库系列】Spring Boot 中整合 MyBatis-Plus详细步骤

在这里插入图片描述

在 Spring Boot 中整合 MyBatis-Plus 可以按照以下步骤进行:

一、整合步骤

1. 创建 Spring Boot 项目

首先,使用 Spring Initializr(https://start.spring.io/)创建一个新的 Spring Boot 项目。在创建过程中,选择以下依赖:

  • Spring Web
  • MySQL Driver
  • MyBatis-Plus

2. 配置项目依赖

如果手动创建 pom.xml 文件,确保添加以下依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- MyBatis-Plus Starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>最新版本</version>
    </dependency>
    <!-- MySQL Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- Spring Boot Starter Test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

请将 最新版本 替换为 MyBatis-Plus 的实际最新版本号。

3. 配置数据源

application.yml 文件中配置数据库连接信息:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/yourdatabase
    username: yourusername
    password: yourpassword
    driver-class-name: com.mysql.cj.jdbc.Driver

yourdatabaseyourusernameyourpassword 替换为实际的数据库名称、用户名和密码。

4. 创建实体类

创建一个 Java 实体类,用于映射数据库表。例如,创建一个 User 实体类:

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user")
public class User {
    private Long id;
    private String username;
    private String password;
}

@Data 是 Lombok 注解,用于自动生成 gettersetterequalshashCodetoString 方法。@TableName 注解指定实体类对应的数据库表名。

5. 创建 Mapper 接口

创建一个 Mapper 接口,继承 BaseMapper 接口,BaseMapper 是 MyBatis-Plus 提供的基础接口,包含了常用的 CRUD 方法。例如,创建一个 UserMapper 接口:

package com.example.demo.mapper;

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

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 可以在这里定义自定义的 SQL 方法
}

@Mapper 注解用于将该接口标记为 MyBatis 的 Mapper 接口。

6. 创建 Service 层

创建一个 Service 接口和其实现类。例如,创建一个 UserService 接口和 UserServiceImpl 实现类:

package com.example.demo.service;

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

import java.util.List;

public interface UserService extends IService<User> {
    // 可以在这里定义自定义的业务方法
}
package com.example.demo.service.impl;

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

import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 如果需要,可以重写或实现自定义方法
}

ServiceImpl 是 MyBatis-Plus 提供的基础 Service 实现类,它提供了基本的 CRUD 方法实现。

7. 创建 Controller 层

创建一个 Controller 层,用于处理客户端请求。例如,创建一个 UserController

package com.example.demo.controller;

import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> findAll() {
        return userService.list();
    }

    @GetMapping("/{id}")
    public User findById(@PathVariable Long id) {
        return userService.getById(id);
    }

    @PostMapping
    public boolean save(@RequestBody User user) {
        return userService.save(user);
    }

    @PutMapping
    public boolean update(@RequestBody User user) {
        return userService.updateById(user);
    }

    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Long id) {
        return userService.removeById(id);
    }
}

8. 配置 MyBatis-Plus 扫描

在 Spring Boot 主应用类上添加 @MapperScan 注解,扫描 Mapper 接口所在的包:

package com.example.demo;

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

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

9. 测试

可以使用 Spring Boot 的测试框架来测试各个接口:

package com.example.demo;

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

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    private UserService userService;

    @Test
    public void testFindAll() {
        assertTrue(userService.list().size() >= 0);
    }

    @Test
    public void testFindById() {
        User user = new User();
        user.setUsername("testuser");
        user.setPassword("testpassword");
        userService.save(user);
        assertNotNull(userService.getById(user.getId()));
    }

    @Test
    public void testSave() {
        User user = new User();
        user.setUsername("newuser");
        user.setPassword("newpassword");
        assertTrue(userService.save(user));
    }

    @Test
    public void testUpdate() {
        User user = new User();
        user.setUsername("updateuser");
        user.setPassword("updatepassword");
        userService.save(user);
        user.setPassword("newupdatepassword");
        assertTrue(userService.updateById(user));
    }

    @Test
    public void testDelete() {
        User user = new User();
        user.setUsername("deleteuser");
        user.setPassword("deletepassword");
        userService.save(user);
        assertTrue(userService.removeById(user.getId()));
    }
}

通过以上步骤,你就可以在 Spring Boot 项目中成功整合 MyBatis-Plus,并实现基本的 CRUD 操作。在实际项目中,你可以根据需求进一步扩展和优化代码。

二、 基本 CRUD 操作

在前面整合的基础上,我们已经有了基本的 CRUD 方法。

新增操作

UserService 中调用 save 方法:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 新增操作
    @Override
    public boolean saveUser(User user) {
        return this.save(user);
    }
}
查询操作
  • 根据 ID 查询:调用 getById 方法。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 根据 ID 查询
    @Override
    public User getUserById(Long id) {
        return this.getById(id);
    }
}
  • 查询所有:调用 list 方法。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 查询所有
    @Override
    public List<User> getAllUsers() {
        return this.list();
    }
}
更新操作

调用 updateById 方法:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 更新操作
    @Override
    public boolean updateUser(User user) {
        return this.updateById(user);
    }
}
删除操作
  • 根据 ID 删除:调用 removeById 方法。
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 根据 ID 删除
    @Override
    public boolean deleteUserById(Long id) {
        return this.removeById(id);
    }
}

条件查询

使用 QueryWrapper 构建查询条件。

简单条件查询

例如,查询用户名等于某个值的用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public List<User> findUsersByUsername(String username) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", username);
        return this.list(queryWrapper);
    }
}
复杂条件查询

多个条件组合,例如查询用户名包含某个字符串且年龄大于某个值的用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public List<User> findComplexUsers(String usernameLike, Integer ageGreaterThan) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("username", usernameLike);
        queryWrapper.gt("age", ageGreaterThan);
        return this.list(queryWrapper);
    }
}

分页查询

使用 Page 类实现分页查询。

首先,在 UserService 中定义分页查询方法:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public Page<User> getUserPage(int current, int size) {
        Page<User> page = new Page<>(current, size);
        return this.page(page);
    }
}

批量操作

批量插入

使用 saveBatch 方法批量插入用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public boolean saveUserBatch(List<User> userList) {
        return this.saveBatch(userList);
    }
}
批量更新

使用 updateBatchById 方法批量更新用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public boolean updateUserBatch(List<User> userList) {
        return this.updateBatchById(userList);
    }
}
批量删除

使用 removeByIds 方法批量删除用户:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public boolean deleteUserBatch(List<Long> idList) {
        return this.removeByIds(idList);
    }
}

自定义 SQL 操作

如果 MyBatis-Plus 提供的内置方法无法满足需求,可以在 Mapper 接口中定义自定义 SQL 方法。

在 Mapper 接口中定义方法
@Mapper
public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user WHERE age > #{age}")
    List<User> findUsersByAge(int age);
}
在 Service 层调用自定义方法
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public List<User> findUsersByAge(int age) {
        return userMapper.findUsersByAge(age);
    }
}

示例代码总结

上述示例展示了在 Spring Boot 中使用 MyBatis-Plus 进行各种数据库操作的方法。在实际项目中,可以根据具体需求,在 Service 层和 Mapper 层灵活组合和扩展这些方法,以实现复杂的业务逻辑。

注意事项

  • 确保数据库表结构与实体类属性对应,否则可能导致数据操作异常。
  • 在使用 QueryWrapper 构建条件时,注意条件的正确性和安全性,防止 SQL 注入。
  • 对于分页操作,要合理设置分页参数,避免数据量过大导致性能问题。

通过以上内容,你可以全面掌握在 Spring Boot 中使用 MyBatis-Plus 进行数据库操作的方法。


http://www.kler.cn/a/468806.html

相关文章:

  • Excel | 空格分隔的行怎么导入excel?
  • Vue笔记-001-声明式渲染
  • vulnhub靶场-potato(至获取shell)
  • JavaScript语言的编程范式
  • VisionPro软件Image Stitch拼接算法
  • 在Spring Boot项目中使用Zookeeper和Curator实现高效、可靠的分布式锁
  • 学习Video.js
  • 第四十三天|动态规划|子序列| 300.最长递增子序列 ,674. 最长连续递增序列,718. 最长重复子数组
  • DeepSeek-V3 正式发布,已在网页端和 API 全面上线,性能领先,速度飞跃。
  • 【第二部分--Python之基础】05 类与对象
  • 详细讲一下Canvas标签的基础使用和应用场景
  • 集成方案:基于慧集通的某客户多系统间集成简略方案(致远OA、NCC高级版、三方物业系统、发票税务系统等)
  • 模拟出一个三维表面生成表面点,计算体积,并处理边界点
  • 系统架构师考试-CBSE基于构件的软件工程
  • 前端开发语言涉及到 的注解(Annotations)
  • vue3 vite 使用 代理转发
  • 阿赵的MaxScript学习笔记分享十六《MaxScript和WinForm交互》
  • 【Python系列】Python 中的 `enumerate` 函数及其应用
  • 基于区块链的共享算力系统概念方案
  • Django Admin 以管理 AWS Lambda 函数
  • 深度信念网络 (Deep Belief Network, DBN) 算法详解与PyTorch实现
  • 性能测试04|JMeter:连接数据库、逻辑控制器、定时器
  • Linux中操作中的无痕命令history技巧
  • Sonic:开源Go语言开发的高性能博客平台
  • 第五届神经网络、信息与通信工程国际学术会议(NNICE 2025)
  • Java与AI:构建智能应用的强大组合