MyBatis-Plus

sunjk 发布于 19 天前 49 次阅读


引入


MyBatis-Plus 的 部分 核心特性包括:

  1. 无侵入设计:不会改变 MyBatis 原有的 API 和使用方式,你可以自由选择 MyBatis 和 MyBatis-Plus 的功能。
  2. 自动 CRUD:通过 BaseMapper 和 ServiceImpl 接口,MyBatis-Plus 提供了一系列 CRUD 操作的方法,如 insertdeleteupdate 和 select,减少了重复的 SQL 编写工作。
  3. 条件构造器:MyBatis-Plus 提供了条件构造器(如 QueryWrapper),可以通过链式编程方式轻松构建复杂的查询条件。

快速开始


准备工作

添加依赖

以Spring Boot3 为例

可以用 MyBatis-Plus 的 starter 代替 MyBatis 的 starter

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.15</version>
</dependency>

配置

application.yml中添加数据库的相关配置。

  • MySQL 数据源配置
spring:
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
        username: root
        password: 123456
  • MyBastis-Plus 核心配置
mybatis-plus:
    # 指定 MyBatis Mapper 对应的 XML 文件位置
    mapper-locations: classpath:/mapper/**/*.xml
    # 指定 MyBatis 别名包扫描路径,用于给包中的类注册别名
    type-aliases-package: com.example.demo.entity

Mapper 层基本操作

BaseMapper

BaseMapper 是 Mybatis-Plus 提供的一个基础 Mapper 接口,提供了一系列通用的数据库操作方法。

public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    // Getter and Setter
}
public interface UserMapper extends BaseMapper<User> {
    // 自定义方法
}

常见注解


MyBatis-Plus 通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。

约定:

  • 类名驼峰转下划线作为表名
  • 名为 id 的字段作为主键
  • 变量名驼峰转下划线作为表的字段名

当不符合约定时,使用注解来进行配置:

  • @TableName :指定表名
  • @TableId :指定表中的主键字段信息
  • @TableField :指定表中的普通字段信息

@TableName

@TableName("sys_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

@TableId

@TableName("sys_user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

@TableField

@TableName("sys_user")
public class User {
    @TableId
    private Long id;
    @TableField("nickname")  // 映射到数据库字段 "nickname"
    private String name;
    private Integer age;
    private String email;
}

常见配置


Configuration

mapUnderscoreToCamelCase

开启自动驼峰命名规则(camel case)映射,默认值 true

mybatis-plus:
    configuration:
        map-underscore-to-camel-case: true

GlobalConfig

dbConfig

idType

默认值:ASSIGN_ID

  • IdType.AUTO:使用数据库自增 ID 作为主键。
  • IdType.NONE:无特定生成策略,如果全局配置中有 IdType 相关的配置,则会跟随全局配置。
  • IdType.INPUT:在插入数据前,由用户自行设置主键值。
  • IdType.ASSIGN_ID:自动分配 ID,适用于 LongIntegerString 类型的主键。默认使用雪花算法通过 IdentifierGenerator 的 nextId 实现。
  • IdType.ASSIGN_UUID:自动分配 UUID,适用于 String 类型的主键。默认实现为 IdentifierGenerator 的 nextUUID 方法。
mybatis-plus:
    global-config:
        id-type: assign_id

条件构造器


条件构造器( Wapper )用于构建复杂的数据库查询条件,构建条件后进项查询

常用的构造器有两类,一类是用于查询的条件构造器 QueryWrapper ,一类是用于更新的条件构造器 UpdateWrapper ,关系如下所示。

eq

eq 方法用于设置单个字段的相等条件

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "老王");

对应的 SQL 为:

SELECT * FROM user WHERE name = '老王';

ne

ne 用于设置单个字段的不相等条件

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ne("name", "老王");

对应的 SQL 为:

SELECT * FROM user WHERE name <> '老王';
方法作用描述示例
eq等于 (=) 条件eq("name", "Tom")
ne不等于 (<>) 条件ne("status", 1)
gt大于 (>) 条件gt("age", 18)
ge大于等于 (>=) 条件ge("score", 60)
lt小于 (<) 条件lt("age", 30)
le小于等于 (<=) 条件le("price", 100)
betweenBETWEEN … AND … 条件between("age", 18, 30)
notBetweenNOT BETWEEN … AND … 条件notBetween("age", 20, 25)
likeLIKE '%xxx%' 模糊查询like("name", "J")
notLikeNOT LIKE 条件notLike("desc", "test")
likeLeftLIKE '%xxx' 左模糊likeLeft("name", "son")
likeRightLIKE 'xxx%' 右模糊likeRight("name", "Jack")
inIN(…) 条件in("id", Arrays.asList(1,2))
notInNOT IN(…) 条件notIn("type", list)
isNullIS NULL 条件isNull("remark")
isNotNullIS NOT NULL 条件isNotNull("email")
orderByAsc升序排序orderByAsc("age")
orderByDesc降序排序orderByDesc("score")
select指定返回的字段select("id", "name")
last拼接在SQL语句后(如limit等)last("limit 1")
or条件 OR 连接or()
and条件 AND 连接and()
apply直接拼接SQL片段apply("date_format(date,'%Y-%m-%d') = {0}", "2026-01-20")
existsEXISTS 条件exists("sub_query_sql")
notExistsNOT EXISTS 条件notExists("sub_query_sql")

Wrapper 可通过链式调用创建,如:

QueryWrapper<User> wrapper = new QueryWrapper<User>()
        .select("id","username","info")
        .like("username","o")
        .ge("balance",1000);

List<User> user = userMapper.selectList(wrapper);
// 更新所有balance大于1000且username包含“o”的用户的info字段为“已升级”
UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>()
    .like("username", "o")
    .ge("balance", 1000);

User user = new User();
user.setInfo("已升级");

int rows = userMapper.update(user, updateWrapper);

References


注解配置
mybatis plus 常用知识汇总
使用配置
条件构造器

此作者没有提供个人介绍。
最后更新于 2026-01-20