MyBatisPlus 实战字典
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具包,只做增强不做改变,为简化开发工作、提高生产效率而生。
一、Service CRUD 接口
【说明】:【1】通用 Service CRUD 封装 MP提供的 IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页,前缀命名方式区分 Mapper层避免混淆。
【2】采用泛型实现重复利用,泛型 T为任意实体对象。
【3】建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类[IService]
【4】对象 Wrapper 为条件构造器,可以使用 Condition代替 Wrapper。Wrapper 使用时需要 new,Condition通过静态方法创建。
【Save 方法】
【1】插入一条记录(选择字段,策略插入)
【2】批量插入
【3】批量插入,batchSize表时插入批次数量
【SaveOrUpdate】
【1】TableId 主键如果在表中存在则更新记录,否则插入一条新记录
【2】根据 updateWrapper尝试更新,否继续执行 saveOrUpdate(T)方法。Wrapper 的使用后续单独说明。
【3】批量修改插入or修改
【4】 批量修改插入or修改,同时使用 batchSize限制批次插入的数量
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
【Remove】
【1】根据 entity 条件,删除记录
【2】根据 ID 删除
【3】根据 columnMap 条件,删除记录。传入的是表字段[不是类对象] map 对象
【4】 删除(根据ID 批量删除)
【Update】
【1】根据 UpdateWrapper 条件,更新记录需要设置 sqlset
【2】根据 whereEntity 条件,更新记录
【3】 根据 ID 选择修改
【4】 根据ID 批量更新
【4】 根据ID 批量更新,batchSize 表示更新批次数量
【Get】
【1】根据 ID 查询
【2】根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
【3】根据 Wrapper,查询一条记录,throwEx 有多个值时,是否抛错
【4】 根据 Wrapper,查询一条记录,Wrapper<T> 实体对象封装操作类 QueryWrapper
【5】 根据 Wrapper,查询一条记录,Function 表示转化函数
【List】
【1】查询所有
【2】查询列表
【3】查询(根据ID 批量查询)
【4】查询(根据 columnMap 条件)
【5】查询所有列表
【6】查询列表
【7】查询全部记录
【8】查询全部记录
【9】根据 Wrapper 条件,查询全部记录
【10】根据 Wrapper 条件,查询全部记录
【Page】
【1】无条件翻页查询
【2】翻页查询
【3】无条件翻页查询
【4】翻页查询
【Count】
【1】查询总记录数
【2】根据 Wrapper 条件,查询总记录数
【Chain-query】
【1】链式查询普通
【2】链式查询 lambda 式。注意:不支持 Kotlin
【3】示例:
【Chain-update】
【1】链式更改普通
【2】链式更改 lambda 式。注意:不支持 Kotlin
【3】示例:
二、Mapper CRUD 接口
【说明】:【1】通用 CRUD 封装 BaseMapper接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器;
【2】泛型 T 为任意实体对象;
【3】参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键;
对象 Wrapper 为 条件构造器
【Select】
【1】根据 ID 查询
【2】根据 entity 条件,查询一条记录
【3】查询(根据ID 批量查询)
【4】根据 entity 条件,查询全部记录
【5】查询(根据 columnMap 条件)
【6】根据 Wrapper 条件,查询全部记录
【7】根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
【8】根据 entity 条件,查询全部记录(并翻页)
【9】根据 Wrapper 条件,查询全部记录(并翻页)
【10】根据 Wrapper 条件,查询总记录数
【Insert】
【1】插入一条记录,entity表示实体对象;
【Delete】
【1】根据 entity 条件,删除记录
【2】删除(根据ID 批量删除)
【3】根据 ID 删除
【4】根据 columnMap 条件,删除记录
【Update】
【1】根据 whereEntity 条件,更新记录
【2】根据 ID 修改
【Select】
【1】根据 ID 查询
【2】根据 entity 条件,查询一条记录
【3】查询(根据ID 批量查询)
【4】根据 entity 条件,查询全部记录
【5】查询(根据 columnMap 条件)
【6】根据 Wrapper 条件,查询全部记录
【7】根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
【8】根据 entity 条件,查询全部记录(并翻页)
【9】根据 Wrapper 条件,查询全部记录(并翻页)
【10】根据 Wrapper 条件,查询总记录数
类型 | 参数名 | 描述 |
---|---|---|
Serializable | id | 主键ID |
Wrapper<T> | queryWrapper | 实体对象封装操作类(可以为 null) |
Collection<? extends Serializable> | idList | 主键ID列表(不能为 null 以及 empty) |
Map<String, Object> | columnMap | 表字段 map 对象 |
IPage<T> | page | 分页查询条件(可以为 RowBounds.DEFAULT) |
三、条件构造器
【1】以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中
【2】以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true
【3】以下出现的泛型Param均为Wrapper的子类实例(均具有AbstractWrapper的所有方法)
【4】以下方法在入参中出现的R为泛型,在普通wrapper中是String,在LambdaWrapper中是函数(例:Entity::getId,Entity为实体类,getId为字段id的getMethod)
【5】以下方法入参中的R column均表示数据库字段,当R具体类型为String时则为数据库字段名(字段名是数据库关键字的自己用转义符包裹!)!而不是实体类数据字段名,另当R具体类型为SFunction时项目runtime不支持eclipse自家的编译器!
【6】以下举例均为使用普通wrapper,入参为Map和List的均以json形式表现!
【7】使用中如果入参的Map或者List为空,则不会加入最后生成的sql中!
警告:不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输:
①、wrapper 很重
②、传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)
③、正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作
④、我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr
【AbstractWrapper】
说明:QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类用于生成 sql 的 where 条件,entity 属性也用于生成 sql 的 where 条件。注意:entity 生成的 where 条件与使用各个 api 生成的 where 条件没有任何关联行为
【allEq】
个别参数说明:
【1】params:key为数据库字段名,value为字段值;
【2】null2IsNull:为true则在 map的 value为 null时调用 isNull 方法,为false时则忽略 value为 null的;
个别参数说明:
【1】filter:过滤函数,是否允许字段传入比对条件中
【2】params 与 null2IsNull:同上
【eq】
【ne】
【gt】
【ge】
【lt】
【le】
【between】
【notBetween】
【like】
【notLike】
【likeLeft】
【likeRight】
【isNull】
【isNotNull】
【in】
【notIn】
【inSql】
【notInSql】
【groupBy】
【orderByAsc】
【orderByDesc】
【orderBy】
【having】
【or】
注意事项:主动调用 or
表示紧接着下一个方法不是用 and
连接!(不调用or
则默认为使用and
连接)
【and】
【nested】
【apply】
注意事项:该方法可用于数据库函数 动态入参的 params
对应前面 applySql
内部的{index}
部分。这样是不会有 sql注入风险的,反之会有。
【last】
注意事项:只能调用一次,多次调用以最后一次为准。有 sql注入的风险,请谨慎使用
【exists】
【notExists】
【QueryWrapper】
说明:继承自 AbstractWrapper,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper,可以通过 new QueryWrapper().lambda() 方法获取。
【select】
说明:过滤查询字段(主键除外),入参不包含 class 的调用前需要 wrapper内的 entity属性有值。这两类方法重复调用以最后一次为准
【UpdateWrapper】
说明:继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaUpdateWrapper,可以通过 new UpdateWrapper().lambda() 方法获取。
【set】
【setSql】
【lambda】
获取 LambdaWrapper,在 QueryWrapper中是获取 LambdaQueryWrapper在 UpdateWrapper中是获取 LambdaUpdateWrapper