SpringBoot之整合MyBatisPlus

在Java开发中,MyBatis作为主流ORM框架被广泛使用,但原生写XML映射文件或注解SQL仍需大量重复工作,MyBatisPlus(简称MP)在MyBatis基础上增强了CRUD操作,通过内置接口实现无SQL开发,大幅提升开发效率。

一、MyBatisPlus的优势

MyBatisPlus是一个MyBatis的增强工具,在保留MyBatis原有功能的基础上,提供了以下核心优势:

  • 无SQL实现CRUD:内置BaseMapper接口,提供单表增删改查操作,无需编写SQL;
  • 条件构造器:通过QueryWrapper/LambdaQueryWrapper灵活组装查询条件,替代XML中的动态SQL;
  • 代码生成器:自动生成实体类、Mapper、Service等代码,减少重复劳动;
  • 分页插件:一键集成分页功能,无需手动编写分页SQL;
  • 全局主键策略:支持雪花算法、自增等多种主键生成策略,无需手动设置ID;
  • 逻辑删除:通过注解实现逻辑删除(更新is_deleted字段),无需修改SQL。

MyBatisPlus与MyBatis的关系类似:MyBatisPlus = MyBatis + 增强功能,完全兼容MyBatis的用法,可平滑过渡。

二、环境准备

  • JDK:1.8及以上;
  • 开发工具:IntelliJ IDEA;
  • 构建工具:Maven 3.6+;
  • 数据库:MySQL 8.0;
  • SpringBoot版本:2.7.x;
  • MyBatisPlus版本:3.5.x。

三、SpringBoot整合MyBatisPlus步骤

3.1 创建项目并添加依赖

通过Spring Initializr创建项目,或手动添加以下依赖:

<!-- pom.xml核心依赖 -->
<dependencies>
    <!-- SpringBoot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MyBatisPlus起步依赖(包含MyBatis) -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version>
    </dependency>

    <!-- MySQL驱动 -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Lombok(简化实体类) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

注意:引入mybatis-plus-boot-starter后,无需再单独引入MyBatis的依赖,避免版本冲突。

3.2 配置数据库连接

application.yml中配置数据源和MyBatisPlus参数:

# application.yml
server:
  port: 8080

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: root # 替换为实际密码

# MyBatisPlus配置
mybatis-plus:
  # 实体类包路径(别名配置)
  type-aliases-package: com.example.mp.entity
  # 映射文件路径(若需要XML方式写SQL)
  mapper-locations: classpath:mapper/*.xml
  configuration:
    # 日志打印(开发环境用)
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 驼峰命名转换(数据库字段user_name → 实体类userName)
    map-underscore-to-camel-case: true
  global-config:
    db-config:
      # 全局主键策略:ASSIGN_ID(雪花算法,分布式ID)
      id-type: ASSIGN_ID
      # 逻辑删除字段名(默认为is_deleted)
      logic-delete-field: isDeleted
      # 逻辑删除值(1:已删除)
      logic-delete-value: 1
      # 未删除值(0:未删除)
      logic-not-delete-value: 0

3.3 创建数据库表

user表为例,创建测试数据:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS mp_demo CHARACTER SET utf8mb4;
USE mp_demo;

-- 创建用户表
CREATE TABLE user (
    id BIGINT PRIMARY KEY COMMENT '主键ID',
    username VARCHAR(50) NOT NULL COMMENT '用户名',
    age INT COMMENT '年龄',
    email VARCHAR(100) COMMENT '邮箱',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    is_deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0:未删,1:已删)'
) COMMENT '用户表';

-- 插入测试数据
INSERT INTO user (username, age, email) VALUES 
('张三', 20, 'zhangsan@example.com'),
('李四', 22, 'lisi@example.com'),
('王五', 25, 'wangwu@example.com');

3.4 编写实体类(Entity)

使用Lombok和MyBatisPlus注解定义实体类:

package com.example.mp.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@TableName("user") // 指定数据库表名(若类名与表名一致可省略)
public class User {
    // 主键(全局策略:雪花算法)
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;

    private String username;

    private Integer age;

    private String email;

    // 自动填充:创建时间
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    // 自动填充:更新时间
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    // 逻辑删除字段
    @TableLogic
    private Integer isDeleted;
}

核心注解说明

  • @TableName:指定实体类对应的数据库表名;
  • @TableId:标记主键字段,type = IdType.ASSIGN_ID表示使用雪花算法生成ID;
  • @TableField:标记普通字段,fill属性用于配置自动填充策略;
  • @TableLogic:标记逻辑删除字段。

3.5 实现自动填充(元对象处理器)

createTimeupdateTime字段实现自动填充(创建时自动设置时间,更新时自动更新时间):

package com.example.mp.handler;

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

@Component // 注册为Spring组件
public class MyMetaObjectHandler implements MetaObjectHandler {

    // 插入时自动填充
    @Override
    public void insertFill(MetaObject metaObject) {
        // 填充createTime和updateTime为当前时间
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }

    // 更新时自动填充
    @Override
    public void updateFill(MetaObject metaObject) {
        // 填充updateTime为当前时间
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

3.6 创建Mapper接口

继承MyBatisPlus的BaseMapper接口,无需编写方法即可获得CRUD功能:

package com.example.mp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mp.entity.User;

// 继承BaseMapper<User>,泛型为实体类
public interface UserMapper extends BaseMapper<User> {
    // 无需编写方法,BaseMapper已提供CRUD操作
}

3.7 注册Mapper接口

在SpringBoot启动类上添加@MapperScan注解,扫描Mapper接口所在包:

package com.example.mp;

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

@SpringBootApplication
@MapperScan("com.example.mp.mapper") // 扫描Mapper接口
public class MybatisPlusDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusDemoApplication.class, args);
    }
}

3.8 编写Service层(可选)

MyBatisPlus提供IServiceServiceImpl简化Service层开发,比传统Service更高效:

3.8.1 定义Service接口
package com.example.mp.service;

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

// 继承IService<User>
public interface UserService extends IService<User> {
    // 可添加自定义业务方法
}
3.8.2 实现Service接口
package com.example.mp.service.impl;

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

@Service
// 继承ServiceImpl<UserMapper, User>,实现UserService
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 无需编写基础CRUD方法,已由ServiceImpl实现
}

四、MyBatisPlus核心功能实战

4.1 基础CRUD操作(基于Service)

package com.example.mp.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mp.entity.User;
import com.example.mp.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;

    // 1. 新增用户
    @PostMapping
    public String addUser(@RequestBody User user) {
        boolean save = userService.save(user);
        return save ? "新增成功,ID:" + user.getId() : "新增失败";
    }

    // 2. 根据ID查询
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getById(id);
    }

    // 3. 查询所有用户
    @GetMapping
    public List<User> getAllUsers() {
        return userService.list();
    }

    // 4. 更新用户
    @PutMapping
    public String updateUser(@RequestBody User user) {
        boolean update = userService.updateById(user);
        return update ? "更新成功" : "更新失败";
    }

    // 5. 删除用户(逻辑删除)
    @DeleteMapping("/{id}")
    public String deleteUser(@PathVariable Long id) {
        boolean remove = userService.removeById(id);
        return remove ? "删除成功" : "删除失败";
    }
}

测试结果:调用DELETE /users/1后,数据库中is_deleted字段会被更新为1(而非物理删除),查询时会自动过滤已删除数据。

4.2 条件查询(QueryWrapper/LambdaQueryWrapper)

使用条件构造器实现复杂查询,替代XML中的动态SQL:

@GetMapping("/query")
public List<User> queryUsers(
        @RequestParam(required = false) String username,
        @RequestParam(required = false) Integer minAge,
        @RequestParam(required = false) Integer maxAge) {

    // 方式1:QueryWrapper(字符串字段名,易出错)
    /*QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    if (username != null) {
        queryWrapper.like("username", username); // 模糊查询
    }
    if (minAge != null) {
        queryWrapper.ge("age", minAge); // 大于等于
    }
    if (maxAge != null) {
        queryWrapper.le("age", maxAge); // 小于等于
    }
    queryWrapper.orderByDesc("create_time"); // 按创建时间降序*/

    // 方式2:LambdaQueryWrapper(类型安全,推荐)
    LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
    if (username != null) {
        lambdaQuery.like(User::getUsername, username); // 引用方法,避免字段名拼写错误
    }
    if (minAge != null) {
        lambdaQuery.ge(User::getAge, minAge);
    }
    if (maxAge != null) {
        lambdaQuery.le(User::getAge, maxAge);
    }
    lambdaQuery.orderByDesc(User::getCreateTime);

    return userService.list(lambdaQuery);
}

常用条件方法

  • eq:等于(=);
  • ne:不等于(≠);
  • like:模糊查询(%value%);
  • likeLeft:左模糊(%value);
  • likeRight:右模糊(value%);
  • ge:大于等于(≥);
  • le:小于等于(≤);
  • in:包含(in (value1, value2));
  • orderByAsc/orderByDesc:排序。

4.3 分页查询

MyBatisPlus的分页插件可一键实现分页功能,步骤如下:

4.3.1 配置分页插件
package com.example.mp.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {

    // 注册分页插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件(针对MySQL)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
4.3.2 实现分页查询
// 分页查询
@GetMapping("/page")
public IPage<User> getUserPage(
        @RequestParam(defaultValue = "1") Integer pageNum, // 页码(默认1)
        @RequestParam(defaultValue = "10") Integer pageSize) { // 每页条数(默认10)

    // 创建分页对象
    Page<User> page = new Page<>(pageNum, pageSize);
    // 执行分页查询(支持条件查询)
    IPage<User> userPage = userService.page(page, 
        new LambdaQueryWrapper<User>().ge(User::getAge, 18)); // 条件:年龄≥18

    return userPage;
}

返回结果说明

{
  "records": [{"id": 1, "username": "张三", ...}], // 当前页数据
  "total": 3, // 总条数
  "size": 10, // 每页条数
  "current": 1, // 当前页码
  "pages": 1 // 总页数
}

4.4 自定义SQL(XML方式)

MyBatisPlus兼容MyBatis的XML方式,适合复杂SQL场景:

4.4.1 在Mapper接口中定义方法
package com.example.mp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mp.entity.User;
import java.util.List;

public interface UserMapper extends BaseMapper<User> {
    // 自定义方法:查询指定年龄范围的用户
    List<User> selectByAgeRange(@Param("minAge") Integer minAge, @Param("maxAge") Integer maxAge);
}
4.4.2 创建XML映射文件

src/main/resources/mapper目录下创建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.example.mp.mapper.UserMapper">
    <!-- 自定义查询:根据年龄范围查询 -->
    <select id="selectByAgeRange" resultType="User">
        SELECT * FROM user 
        WHERE age BETWEEN #{minAge} AND #{maxAge}
        AND is_deleted = 0
    </select>
</mapper>
4.4.3 在Service中调用
// 在UserService接口添加方法
List<User> selectByAgeRange(Integer minAge, Integer maxAge);

// 在UserServiceImpl实现方法
@Override
public List<User> selectByAgeRange(Integer minAge, Integer maxAge) {
    return baseMapper.selectByAgeRange(minAge, maxAge);
}

// 在Controller中使用
@GetMapping("/age-range")
public List<User> getByAgeRange(Integer minAge, Integer maxAge) {
    return userService.selectByAgeRange(minAge, maxAge);
}

五、MyBatisPlus高级特性

5.1 代码生成器(AutoGenerator)

AutoGenerator可根据数据库表自动生成实体类、Mapper、Service、Controller等代码,步骤如下:

5.1.1 添加代码生成器依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3.1</version>
</dependency>
<!-- 模板引擎(默认Velocity) -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>
5.1.2 编写生成器配置类
package com.example.mp.generator;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import java.util.Collections;

public class CodeGenerator {
    public static void main(String[] args) {
        // 数据库连接配置
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/mp_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai",
                        "root", "root")
                // 全局配置
                .globalConfig(builder -> {
                    builder.author("开发者") // 设置作者
                            .outputDir(System.getProperty("user.dir") + "/src/main/java") // 输出目录
                            .disableOpenDir(); // 生成后不打开文件夹
                })
                // 包配置
                .packageConfig(builder -> {
                    builder.parent("com.example.mp") // 父包名
                            .moduleName("") // 模块名(无子模块可留空)
                            .mapper("mapper") // Mapper包名
                            .service("service") // Service包名
                            .controller("controller") // Controller包名
                            .entity("entity") // 实体类包名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, 
                                    System.getProperty("user.dir") + "/src/main/resources/mapper")); // MapperXML路径
                })
                // 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("user") // 需要生成的表名(可多个)
                            .addTablePrefix("t_") // 忽略表前缀(如t_user → User)
                            // 实体类策略
                            .entityBuilder()
                            .enableLombok() // 启用Lombok
                            .enableTableFieldAnnotation() // 生成字段注解
                            // Controller策略
                            .controllerBuilder()
                            .enableRestStyle(); // 生成@RestController
                })
                .execute(); // 执行生成
    }
}

运行CodeGeneratormain方法,即可自动生成全套代码。

5.2 乐观锁插件

乐观锁用于解决并发更新冲突(如秒杀场景),通过版本号控制:

5.2.1 配置乐观锁插件
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        // 添加乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}
5.2.2 在实体类添加版本字段
@Data
@TableName("user")
public class User {
    // ... 其他字段
    @Version // 标记为乐观锁版本字段
    private Integer version;
}
5.2.3 使用乐观锁
// 更新时自动校验版本号
@PutMapping("/optimistic")
public String updateWithOptimisticLock(@RequestBody User user) {
    // 1. 先查询用户(获取当前version)
    User dbUser = userService.getById(user.getId());
    if (dbUser == null) {
        return "用户不存在";
    }
    // 2. 设置要更新的字段
    dbUser.setUsername(user.getUsername());
    dbUser.setAge(user.getAge());
    // 3. 执行更新(MP会自动添加WHERE version = ?条件)
    boolean success = userService.updateById(dbUser);
    return success ? "更新成功" : "更新失败(可能已被其他线程修改)";
}

六、常见问题与避坑指南

6.1 依赖冲突问题

若同时引入mybatis-plus-boot-startermybatis-spring-boot-starter,会导致依赖冲突。解决方案:只保留mybatis-plus-boot-starter

6.2 逻辑删除失效

原因

  • 未配置@TableLogic注解;
  • 全局配置中logic-delete-field与实体类字段名不一致;
  • 自定义SQL未添加is_deleted = 0条件。

解决方案:确保注解和配置一致,自定义SQL需手动处理逻辑删除。

6.3 分页查询返回总数为0

原因:未配置分页插件或插件顺序错误。

解决方案:在MybatisPlusInterceptor中正确注册PaginationInnerInterceptor

6.4 LambdaQueryWrapper字段引用错误

使用User::getUsername时若报“方法引用错误”,可能是Lombok版本与IDE插件不兼容。解决方案:升级Lombok版本或重新安装IDE插件。

总结

SpringBoot整合MyBatisPlus能显著简化CRUD操作:

  • 无SQL开发:通过BaseMapperIService实现基础CRUD,无需编写SQL;
  • 条件构造器LambdaQueryWrapper替代动态SQL,类型安全且简洁;
  • 丰富插件:分页、乐观锁、逻辑删除等功能一键集成;
  • 代码生成器:自动生成全套代码,减少重复劳动。

实际开发中,建议基础操作使用MyBatisPlus的内置方法,复杂查询结合XML方式,平衡开发效率和灵活性。

若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>我们被要求提供Spring Boot 2.0.9与MyBatis-Plus的整合方法。根据引用[2]中提到的Spring Boot 2.0.7整合MyBatis-Plus 3.0.5,我们可以参考类似的配置,但需要调整版本以适配Spring Boot 2.0.9。 步骤: 1. 添加依赖:由于MyBatis-Plus需要与Spring Boot版本兼容,我们选择与Spring Boot 2.0.x兼容的MyBatis-Plus版本。根据MyBatis-Plus的官方文档,3.0.x版本支持Spring Boot 2.0.x。因此,我们使用MyBatis-Plus 3.0.5(如引用[2])或稍高版本,但确保兼容性。 2. 配置数据源:在application.properties或application.yml中配置数据库连接。 3. 使用@MapperScan注解扫描Mapper接口。 4. 创建实体类和Mapper接口。 详细步骤: 1. 在pom.xml中添加依赖(Maven项目): ```xml <!-- MyBatis-Plus 启动器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> <!-- 此版本支持Spring Boot 2.0.x --> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> <!-- 请根据你的MySQL版本选择,Spring Boot 2.0.9默认可能使用5.x,但8.x需要指定版本 --> </dependency> <!-- Lombok(可选) --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> ``` 注意:Spring Boot 2.0.9的父POM中可能已经指定了MySQL驱动的版本,如果不想覆盖,可以省略版本号。但为了确保兼容性,建议明确指定与数据库匹配的版本。 2. 配置数据源(application.properties): ```properties spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=your_password ``` 如果是MySQL 5.x,驱动类可能是`com.mysql.jdbc.Driver`。 3. 在Spring Boot主启动类上添加`@MapperScan`注解,指定Mapper接口所在的包: ```java @SpringBootApplication @MapperScan("com.example.mapper") // 替换为你的Mapper接口所在包 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 4. 创建实体类(使用Lombok简化): ```java import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("user") // 指定表名,如果表名与类名一致(忽略大小写)可省略 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; private Integer age; private String email; } ``` 5. 创建Mapper接口: ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.entity.User; // 替换为你的实体类路径 public interface UserMapper extends BaseMapper<User> { // 可以自定义方法,但基本的CRUD已经由BaseMapper提供 } ``` 6. 在Service中注入Mapper使用: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public User findById(Long id) { return userMapper.selectById(id); } } ``` 可能遇到的问题及解决: - 问题1:启动时报错找不到Mapper bean。 解决:确保`@MapperScan`的包路径正确,并且Mapper接口被正确扫描到。 - 问题2:数据库连接问题,例如时区错误。 解决:在数据库连接URL中指定时区,如`serverTimezone=Asia/Shanghai`。 - 问题3:MyBatis-Plus版本与Spring Boot不兼容。 解决:如果遇到兼容性问题,可以尝试升级MyBatis-Plus到3.1.x版本(需要确认支持Spring Boot 2.0.x),或者调整Spring Boot版本。 注意:由于Spring Boot 2.0.9是一个较旧的版本(发布于2018年),建议在可能的情况下升级到更高版本以获得更好的支持和性能。 引用说明:[^1]中提到SpringBoot3.2.0整合MyBatis-plus的问题,但我们的目标是Spring Boot 2.0.9,所以参考价值不大。[^2]提供了Spring Boot 2.0.7整合MyBatis-Plus 3.0.5的方法,我们可以借鉴。 相关问题: 1. 如何解决Spring Boot 2.0.9整合MyBatis-Plus时的版本兼容性问题? 2. 在Spring Boot 2.0.9中使用MyBatis-Plus需要配置哪些参数? 3. 如何升级旧项目中的Spring Boot和MyBatis-Plus版本? </think>以下是Spring Boot 2.0.9与MyBatis-Plus整合的完整解决方案,基于最佳实践和引用内容优化: ### 一、Maven依赖配置(pom.xml) ```xml <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.0.9.RELEASE</version> </dependency> <!-- MyBatis-Plus 核心库 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.0.5</version> <!-- 兼容Spring Boot 2.0.x的版本 --> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> <!-- 匹配MySQL 8.x --> <!-- 若用MySQL 5.x,改用5.1.47版本 --> </dependency> <!-- Lombok 简化实体类 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> ``` ### 二、配置文件(application.yml) ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC username: your_username password: your_password mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志 global-config: db-config: id-type: auto # 主键自增策略 ``` ### 三、主启动类配置 ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.mapper") // 替换为你的Mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 四、实体类与Mapper示例 ```java // 实体类 @Data @TableName("sys_user") // 指定表名 public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; } ``` ```java // Mapper接口 public interface UserMapper extends BaseMapper<User> { // 继承BaseMapper即获得CRUD方法 // 自定义SQL方法可在此添加 } ``` ### 五、解决常见问题 1. **版本兼容问题** Spring Boot 2.0.9需配合MyBatis-Plus 3.0.x系列。若出现`ClassNotFoundException`,检查: ```bash mvn dependency:tree | grep 'mybatis-plus' ``` 2. **SQL语法错误处理** 在实体类字段使用`@TableField`解决列名映射问题: ```java @TableField("user_name") private String username; ``` 3. **自动填充配置** 实现元对象处理器: ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime", LocalDateTime.now(), metaObject); } } ``` ### 六、验证整合是否成功 ```java @RestController public class TestController { @Autowired private UserMapper userMapper; @GetMapping("/users") public List<User> getUsers() { return userMapper.selectList(null); // 查询所有用户 } } ``` 访问 `http://localhost:8080/users` 应返回数据库用户列表[^2]。 --- ### 关键配置说明 1. **版本匹配原则** Spring Boot 2.0.x + MyBatis-Plus 3.0.x + MySQL Driver 8.x/5.x $$ \text{兼容矩阵} = \begin{cases} \text{Spring Boot 2.0.x} & \rightarrow \text{MyBatis-Plus 3.0.5} \\ \text{MySQL 8.x} & \rightarrow \text{Driver 8.0+} \\ \text{MySQL 5.x} & \rightarrow \text{Driver 5.1.x} \end{cases} $$ 2. **自动配置生效条件** - 主类需在Mapper包的上层目录 - 数据源配置正确且数据库可访问 - 无依赖版本冲突(使用`mvn dependency:tree`验证) [^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值