学会Mybatis-Plus,从此告别加班,谁用谁知道!

本文介绍如何使用MyBatis-Plus增强工具与SpringBoot整合,实现快速开发和高效数据库操作。涵盖项目搭建、逆向工程、基本CRUD操作及条件构造器QueryWrapper的高级使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它的愿景就是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。

要说起mp就得先说 mybatis和hibernate,mybatis的众所周知他的好处就是sql写起来很灵活,hibernate的好处就是不用写sql通过实体类的关系配置,只要操作类就可以啦,,抛弃了数据库中心的思想,完全的面向对象思想。所以有人就想有没有集两者优点的框架呢,于是mp(mybatis-Plus)诞生啦。

这篇文章通过mybatis-plus整合springboot来讲解mybatis-plus的一些基本操作!

正文:

一、整合springboot和mybatis-plus

1.新建一个springboot项目

这个我在之前的博客写过,传送门https://blog.youkuaiyun.com/jdk_wangtaida/article/details/86293548

2.我的pom文件

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dada</groupId>
    <artifactId>springboot_jsp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_jsp</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>RELEASE</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!-- mybatisPlus 核心库 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
        <!-- 数据库 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--添加 代码生成器 依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.我的application.yml文件

# 配置端口
server:
  port: 9202
spring:
  # 配置数据源
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/bendi?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
# mybatis-plus相关配置
mybatis-plus:
  # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)
  mapper-locations: classpath:mapper/*.xml
  # 以下配置均有默认值,可以不设置
  global-config:
    db-config:
      #主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
      id-type: auto
      #字段策略 IGNORED:"忽略判断"  NOT_NULL:"非 NULL 判断")  NOT_EMPTY:"非空判断"
      field-strategy: NOT_EMPTY
      #数据库类型
      db-type: MYSQL
  configuration:
    # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射
    map-underscore-to-camel-case: true
    # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
    call-setters-on-nulls: true
    # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4.我的逆向工程类CodeGenerator

package com.dada.springboot_jsp.until;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class CodeGenerator {
    /**
     * 数据库 URL
     */
    private static final String URL = "jdbc:mysql://localhost:3306/bendi?characterEncoding=utf8&useSSL=false";
    /**
     * 数据库驱动
     */
    private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
    /**
     * 数据库用户名
     */
    private static final String USERNAME = "root";
    /**
     * 数据库密码
     */
    private static final String PASSWORD = "root";
    /**
     * @author 值
     */
    private static final String AUTHOR = "dada";
    /**
     * 需要生成的表名
     */
    public static final String[] INCLUDE_TABLES = {"user"};
    /**
     * 代码所在服务名
     */
    public static final String SERVICE_NAME = "study";
    /**
     * 代码生成的包名
     */
    public static String PACKAGE_NAME = "com.dada.springboot_jsp";

    /**
     * 代码生成路径
     */
    public static final String Output_Dir_NAME = "F:\\tower\\springboot_jsp\\src\\main\\java";

    public static void main(String[] args) {
            AutoGenerator mpg = new AutoGenerator();

            // 全局配置
            GlobalConfig gc = new GlobalConfig();
            gc.setOutputDir(Output_Dir_NAME);
            gc.setFileOverride(true);
            gc.setActiveRecord(true);
            gc.setEnableCache(true);// XML 二级缓存
            gc.setBaseResultMap(true);// XML ResultMap
            gc.setBaseColumnList(true);// XML columList
            gc.setAuthor(AUTHOR);

            // 自定义文件命名,注意 %s 会自动填充表实体属性!
            gc.setMapperName("%sDao");
            gc.setXmlName("%sMapper");
            gc.setServiceName("%sService");
            gc.setServiceImplName("%sServiceImpl");
            gc.setControllerName("%sController");
            mpg.setGlobalConfig(gc);

            // 数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setDbType(DbType.MYSQL);
        /*dsc.setTypeConvert(new MySqlTypeConvert(){
            // 自定义数据库表字段类型转换【可选】
            @Override
            public DbColumnType processTypeConvert(String fieldType) {
                System.out.println("转换类型:" + fieldType);
                return super.processTypeConvert(fieldType);
            }
        });*/

            dsc.setDriverName( DRIVER_NAME);
            dsc.setUrl(URL);
            dsc.setUsername(USERNAME);
            dsc.setPassword(PASSWORD);
            mpg.setDataSource(dsc);

            // 策略配置
            StrategyConfig strategy = new StrategyConfig();
            // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
            // strategy.setTablePrefix(new String[] { "tlog_", "tsys_" });// 此处可以修改为您的表前缀
            strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
            strategy.setInclude(INCLUDE_TABLES); // 需要生成的表
            // strategy.setExclude(new String[]{"test"}); // 排除生成的表
            mpg.setStrategy(strategy);

            // 包配置
            PackageConfig pc = new PackageConfig();
            pc.setParent(PACKAGE_NAME);
            pc.setModuleName(SERVICE_NAME);
            mpg.setPackageInfo(pc);

            // 执行生成
            mpg.execute();
        }


    }

5.建表语句和插入数据的语句

CREATE TABLE `user` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

INSERT INTO `user` VALUES (1, '阿达', 20);
INSERT INTO `user` VALUES (2, '小达', 19);
INSERT INTO `user` VALUES (3, '达达', 18);

6.执行逆向工程的类CodeGenerator,生成如下图的目录结构

二、我们先写一个最简单的demo

1.前端controller的代码(记住这里我也只写了前端controller的代码)

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

    /**
     * 获取所有User
     * @return
     */
    @RequestMapping("/getAllUser")
    public List<User> getAllUser(){
        List<User> list = userService.list();
        return list;
    }

}

 2.postman请求的例子

3.请求的结果

 

三、 MyBatis-Plus通用的CRUD

我们通过逆向工程生成的这一系列代码,直接调用相应的service就可以帮我们完成基本增删改查。(这里就不对源码进行解释啦,主要讲解使用的例子,感兴趣的可以追一下代码)

1.增

controller层代码

 /**
     *新增User
     */
    @RequestMapping("/save")
    public Boolean save(@RequestBody User user){
        boolean save = userService.save(user);
        return save;
    }

postman请求的例子:

 请求结果:

2.改

 controller层代码

 /**
     *修改User
     */
    @RequestMapping("/update")
    public Boolean update(@RequestBody User user){
        boolean save = userService.saveOrUpdate(user);
        return save;
    }

 postman请求的例子:

 请求结果:

 3.查

 controller层代码

 /**
     *查询detail
     */
    @RequestMapping("/detail")
    public User detail(@RequestBody User user){
        User userout = userService.getById(user);
        return userout;
    }

  postman请求的例子:

  请求结果:

四、似乎上面的mybatis也可以做到,别着急,MP 最好用的就是条件构造器QueryWrapper

1.这里我举个根据名字查询用户的信息的例子

controller层代码:

 /**
     *根据name查询用户信息
     */
    @RequestMapping("/selectByName")
    public User selectByName(@RequestBody User user){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("name",user.getName());
        User one = userService.getOne(userQueryWrapper);
        return one;
    }

   postman请求的例子:

   请求结果:

后台打印的日志:

这里我就简单举这些例子,更丰富的查询方法,可以参考官方文档,传送门:https://mp.baomidou.com/guide/

总结:

 

我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有3255位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言!

<think>我们正在解决用户的问题:在若依框架中添加MyBatis-Plus依赖后无法正确生效,特别是关于`mybatis-plus-boot-starter` 3.5.0版本。 根据引用[2]的内容,用户可能遇到了升级到Spring Boot 3的问题,因为引用[2]提到“SpringBoot3集成MyBatis-Plus(解决Boot2升级Boot3)”以及“PaginationInnerInterceptor cannot be resolved to a type”的错误。 步骤分析: 1. 确认若依框架的Spring Boot版本。若依框架的不同版本依赖的Spring Boot版本不同。例如,若依4.x基于Spring Boot 2.x,而若依5.x基于Spring Boot 3.x。 2. 根据引用[2]的提示,MyBatis-Plus的版本需要与Spring Boot版本匹配。对于Spring Boot 3,需要使用MyBatis-Plus 3.5.0或更高版本(但注意具体兼容版本)。 3. 用户提到使用的是`mybatis-plus-boot-starter` 3.5.0,但未说明Spring Boot版本。因此,我们需要检查版本兼容性。 可能的问题: - 版本不兼容:如果若依框架使用的是Spring Boot 2.x,而MyBatis-Plus 3.5.0是为Spring Boot 3.x设计的,则会出现问题。 - 依赖冲突:可能存在与其他组件的版本冲突。 - 缺少必要的依赖:例如,引用[2]中提到单独引用MyBatis-Plus可能会报错(PaginationInnerInterceptor cannot be resolved to a type),这可能是由于缺少`mybatis-plus-extension`依赖。 解决方案: 1. 确定Spring Boot版本:查看项目的父pom.xml(通常是根目录下的pom.xml)中的`<parent>`标签,例如: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <!-- 或3.x.x --> </parent> ``` 2. 根据Spring Boot版本选择正确的MyBatis-Plus版本: - Spring Boot 2.x:使用MyBatis-Plus 3.4.x或3.5.3.1(注意:3.5.3.1是兼容Spring Boot 2的,官方有特别版本) - Spring Boot 3.x:使用MyBatis-Plus 3.5.0及以上(目前最新是3.5.3.1,但注意3.5.0开始支持Spring Boot 3) 具体可参考MyBatis-Plus官方文档:https://baomidou.com/pages/226c9f/ 3. 添加正确的依赖: - 对于Spring Boot 3: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> ``` - 对于Spring Boot 2: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> <!-- 注意:3.5.3.1版本同时支持Spring Boot 2和3,但需要Java 17+ --> </dependency> ``` 但注意:若依4.x(Spring Boot 2)通常使用Java 8,而MyBatis-Plus 3.5.3.1要求Java 17+。因此,对于Spring Boot 2且Java 8的项目,应使用3.4.x版本,例如: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3.4</version> </dependency> ``` 4. 如果遇到“PaginationInnerInterceptor cannot be resolved to a type”错误,需要添加`mybatis-plus-extension`依赖(在3.4.x版本中,分页插件在`mybatis-plus-extension`中): ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>与mybatis-plus-boot-starter相同版本</version> </dependency> ``` 5. 配置MyBatis-Plus:在Spring Boot配置文件中(如application.yml)添加MyBatis-Plus相关配置,例如: ```yaml mybatis-plus: mapper-locations: classpath*:mapper/**/*Mapper.xml type-aliases-package: com.ruoyi.**.domain configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 可选,开启SQL日志 ``` 6. 检查依赖冲突:使用`mvn dependency:tree`命令查看依赖树,排除冲突的依赖。 7. 重新加载Maven并重启项目。 注意:若依框架本身已经集成了MyBatis,因此添加MyBatis-Plus时需要注意排除MyBatis的默认依赖,但MyBatis-Plus的starter已经处理了这一点。 由于用户问题中未明确Spring Boot版本,因此需要根据实际情况调整。 总结步骤: 1. 确定Spring Boot版本 2. 选择兼容的MyBatis-Plus版本 3. 添加依赖(注意starter和extension) 4. 检查并排除冲突 5. 配置MyBatis-Plus 如果问题仍然存在,请提供具体的错误信息。</think>### 解决 MyBatis-Plus 3.5.0 依赖无法生效的问题 在若依框架中添加 `mybatis-plus-boot-starter` 依赖后未生效,通常由以下原因导致。请逐步排查: --- #### 1. **版本兼容性问题(最常见)** 若依框架的 Spring Boot 版本决定了 MyBatis-Plus 的兼容版本: ```xml <!-- 检查若依的 Spring Boot 版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.5</version> <!-- 关键版本号 --> </parent> ``` **版本匹配方案**: | Spring Boot 版本 | MyBatis-Plus 版本 | 配置示例 | |------------------|-------------------|----------| | 2.x.x | 3.4.x - 3.5.3.1 | `<version>3.4.3.4</version>` | | 3.x.x | ≥ 3.5.0 | `<version>3.5.3.1</version>` | > 📌 **验证方法**: > 执行 `mvn dependency:tree | grep 'spring-boot'` 确认实际版本 --- #### 2. **依赖冲突问题** MyBatis-Plus 与原生 MyBatis 冲突时,需排除旧依赖: ```xml <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> <exclusions> <!-- 排除原生 MyBatis --> <exclusion> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加 MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> ``` --- #### 3. **分页插件配置缺失(引用[2]问题)** 添加分页插件依赖(Spring Boot 3 需额外配置): ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.5.3.1</version> <!-- 必须与 starter 同版本 --> </dependency> ``` **配置类示例**: ```java @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } ``` --- #### 4. **依赖未正确加载** 执行以下命令强制更新依赖: ```bash mvn clean install -U -DskipTests ``` - `-U`:强制更新快照依赖 - `-DskipTests`:跳过测试 --- #### 5. **验证是否生效** 创建测试 Mapper 接口: ```java public interface TestMapper extends BaseMapper<User> { // 自动继承 MyBatis-Plus 的 CRUD 方法 } ``` 启动项目,检查日志: ``` ... MyBatis Plus v3.5.3.1 ... ``` > ⚠️ **若报错 `PaginationInnerInterceptor cannot be resolved`**: > 确保 `mybatis-plus-extension` 版本与 starter 完全一致(引用[2]问题) --- ### 完整依赖配置示例(Spring Boot 3) ```xml <!-- ruoyi-admin/pom.xml --> <dependencies> <!-- 排除原生 MyBatis --> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-common</artifactId> <exclusions> <exclusion> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> <!-- MyBatis-Plus 核心 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <!-- 分页等扩展功能 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-extension</artifactId> <version>3.5.3.1</version> </dependency> </dependencies> ``` [^1] [^2]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心的码字达

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值