目 录CONTENT

文章目录

MybatisPlus

FatFish1
2025-11-04 / 0 评论 / 0 点赞 / 20 阅读 / 0 字 / 正在检测是否收录...

概述

MybatisPlus的宗旨是只做增强,不做修改

它的目的是简化sql编写流程

核心能力

BaseMapper

MybatisPlus在原始Mapper的基础上封装了一层BaseMapper,其中提供了简单的默认方法实现:

public interface BaseMapper<T> extends Mapper<T> {

    ……
    default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {
        List<T> list = this.selectList(queryWrapper);
        // 抄自 DefaultSqlSession#selectOne
        if (list.size() == 1) {
            return list.get(0);
        } else if (list.size() > 1) {
            throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
        } else {
            return null;
        }
    }

    default boolean exists(Wrapper<T> queryWrapper) {
        Long count = this.selectCount(queryWrapper);
        return null != count && count > 0;
    }

    ……
}

MybatisPlus提供的增删改查(CRUD)操作‌:

  • ‌插入(Insert)‌:通过 save 方法自动生成插入语句。

  • ‌删除(Delete)‌:通过 remove 方法自动生成删除语句,支持通过实体删除和通过条件构造器删除。

  • ‌更新(Update)‌:通过 update 方法自动生成更新语句,支持通过实体更新和通过条件构造器更新。

  • ‌查询(Select)‌:通过 selectById、selectByMap、selectList、selectOne 等方法自动生成查询语句。

即使用最简单的CRUD方法时,可以不需要编写Mapper的xml映射,直接调用接口即可,那么如果只需要用这几个简单方法的Mapper,甚至只需要一个空实现即可

Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo>{
 
}

Wrapper - 包装器

MybatisPlus的强大之处在于它的一个包装器机制

可以让开发者不需要编写sql就能实现一些条件语句开发

包装器有:

  • AbstractWrapper:这是⼀个抽象基类, 提供了所有 Wrapper 类共有的方法和属性。详细参考官网介绍: 条件构造器

  • QueryWrapper:用于构造查询条件, 在AbstractWrapper的基础上拓展了⼀个select方法, 允许指定查询字段。

  • UpdateWrapper: 用于构造更新条件, 可以在更新数据时指定条件。

  • LambdaQueryWrapper:基于 Lambda 表达式的查询条件构造器, 它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。

  • LambdaUpdateWrapper: 基于 Lambda 表达式的更新条件构造器, 它允许你使⽤ Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。

其中常用的方法包括:

  • lt : "less than" 的缩写,表示小于.

  • le : "less than or equal to"的缩写,表示小于等于

  • ge : "greater than or equal to" 的缩写,表示大于等于.

  • gt : "greater than" 的缩写,表示大于.

  • eq : "equals" 的缩写,表示等于.

  • ne : "not equals" 的缩写,表示不等于.

  • in:用于设置单个字段的 IN 条件,即字段的值在给定的集合中。

  • not in:用于设置单个字段的 NOT IN 条件,即字段的值不在给定的集合中。

  • like:用于设置单个字段的 LIKE 条件。

  • notlike:用于设置单个字段的 NOT LIKE 条件。

  • likeLeft:用于设置单个字段的右模糊匹配条件。

  • likeRight:用于设置单个字段的左模糊匹配条件。

  • notLikeLeft:用于设置单个字段的非右模糊匹配条件。

  • notLikeRight:用于设置单个字段的非左模糊匹配条件。

  • orderBy:可以生成 SQL 语句中的 ORDER BY 子句。

  • having:用于设置 HAVING 子句,通常与 GROUP BY 一起使用,用于对分组后的数据进行条件筛选。

QueryWrapper

QueryWrapper并不只用于查询语句,无论是修改、删除、查询,都可以使用QueryWrapper来构建查询条件

    @Test
    void testQueryWrapper(){
        QueryWrapper<Userinfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("id", "username", "password", "age")
                .eq("age", 18)
                .like("username", "min");
        userInfoMapper.selectList(queryWrapper).forEach(System.out::println);
    }

    @Test
    void testQueryWrapper2(){
        QueryWrapper<Userinfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lt("age", 20);
 
        Userinfo userinfo = new Userinfo();
        userinfo.setDeleteflag(1);
        userInfoMapper.update(userinfo, queryWrapper);
    }

    @Test
    void testUpdateWrapper(){
        UpdateWrapper<Userinfo> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("delete_flag", 2)
                .lt("age", 20);
        userInfoMapper.update(updateWrapper);
    }

UpdateWrapper

用于sql更新

    @Test
    void testUpdateWrapper2(){
        UpdateWrapper<Userinfo> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("delete_flag", 0).set("age", 6)
                        .in("id", List.of(1,2,3));
        userInfoMapper.update(updateWrapper);
    }

LambdaQueryWrapper/LambdaUpdateWrapper

QueryWrapper 和 UpdateWrapper存在⼀个问题,就是需要写死字段名,如果字段名发生变更,可能会因为测试不到位酿成事故。

MyBatis-Plus 提供了⼀种基于Lambda表达式的条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名,也提高了代码的可读性和可维护性

    @Test
    void testLambdaQueryWrapper(){
        QueryWrapper<Userinfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
                .select(Userinfo::getId, Userinfo::getUsername, Userinfo::getPassword)
                .eq(Userinfo::getAge, 18)
                .like(Userinfo::getUsername, "min");
        userInfoMapper.selectList(queryWrapper).forEach(System.out::println);
    }

    @Test
    void testLambdaUpdateWrapper(){
        UpdateWrapper<Userinfo> updateWrapper = new UpdateWrapper<>();
 
//        updateWrapper.set("delete_flag", 0).set("age", 6).in("id", List.of(1,2,3));
        updateWrapper.lambda()
                .set(Userinfo::getDeleteflag, 0)
                .set(Userinfo::getAge, 6)
                .in(Userinfo::getId, List.of(1,2,3));
        userInfoMapper.update(updateWrapper);
    }

注解和映射

可以通过表映射来把表具象化到代码中:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName("test_customer")
public class Customer {

    @TableId(value = "customer_id", type = IdType.AUTO)
    private String customerId;

    private String customerName;

    private String customerAddress;
}

常用的注解包括:

  • @TableId注解用于制定主键,value属性用于映射主键字段名,type表示主键生成方式

    • AUTO自增

    • NONE雪花算法

    • INPUT开发者必须主动赋值

    • ASSIGN_ID:MP分配

    • ASSIGN_UUID:分配UUID

  • @TableName用于处理非小驼峰转下划线形式的表名

  • @TableField用于指定表属性

    • updateStrategy:更新策略,NEVER代表从不更新;IGNORED代表不判断;NOT_NULL代表非空则更新

    • insertStrategy:插入策略

    • exist:表示是否是数据库字段

    • select:表示是否查询该字段

    • fill:是否自动填充

MyBatisPlus没有直接的联合主键的定义方式,只能选取一个属性作为逻辑主键

0

评论区