MyBatisPlus 实战字典

目录

一、Service CRUD 接口

【Save 方法】

【SaveOrUpdate】

【Remove】

【Update】

【Get】

【List】

【Page】

【Count】

【Chain-query】

【Chain-update】

二、Mapper CRUD 接口

【Select】

【Insert】

【Delete】

【Update】

【Select】

三、条件构造器

【AbstractWrapper】

【allEq】

【eq】

【ne】

【gt】

【ge】

【lt】

【le】

【between】

【notBetween】

【like】

【notLike】

【likeLeft】

【likeRight】

【isNull】

【isNotNull】

【in】

【notIn】

【inSql】

【notInSql】

【groupBy】

【orderByAsc】

【orderByDesc】

【orderBy】

【having】

【or】

【and】

【nested】

【apply】

【last】

【exists】

【notExists】

【QueryWrapper】

【select】

【UpdateWrapper】

【set】

【setSql】

【lambda】


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】插入一条记录(选择字段,策略插入)

boolean save(T entity);

【2】批量插入

boolean saveBatch(Collection<T> entityList);

【3】批量插入,batchSize表时插入批次数量

boolean saveBatch(Collection<T> entityList, int batchSize);

【SaveOrUpdate】


【1】TableId 主键如果在表中存在则更新记录,否则插入一条新记录

boolean saveOrUpdate(T entity);

【2】根据 updateWrapper尝试更新,否继续执行 saveOrUpdate(T)方法。Wrapper 的使用后续单独说明。

boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

【3】批量修改插入or修改

boolean saveOrUpdateBatch(Collection<T> entityList);

【4】 批量修改插入or修改,同时使用 batchSize限制批次插入的数量
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

【Remove】


【1】根据 entity 条件,删除记录

boolean remove(Wrapper<T> queryWrapper);

【2】根据 ID 删除

boolean removeById(Serializable id);

【3】根据 columnMap 条件,删除记录。传入的是表字段[不是类对象] map 对象

boolean removeByMap(Map<String, Object> columnMap);

【4】 删除(根据ID 批量删除)

boolean removeByIds(Collection<? extends Serializable> idList);

【Update】


【1】根据 UpdateWrapper 条件,更新记录需要设置 sqlset

boolean update(Wrapper<T> updateWrapper);

【2】根据 whereEntity 条件,更新记录

boolean update(T entity, Wrapper<T> updateWrapper);

【3】 根据 ID 选择修改

boolean updateById(T entity);

【4】 根据ID 批量更新

boolean updateBatchById(Collection<T> entityList);

【4】 根据ID 批量更新,batchSize 表示更新批次数量

boolean updateBatchById(Collection<T> entityList, int batchSize);

【Get】


【1】根据 ID 查询

T getById(Serializable id);

【2】根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

T getOne(Wrapper<T> queryWrapper);

【3】根据 Wrapper,查询一条记录,throwEx 有多个值时,是否抛错

T getOne(Wrapper<T> queryWrapper, boolean throwEx);

【4】 根据 Wrapper,查询一条记录,Wrapper<T> 实体对象封装操作类 QueryWrapper

Map<String, Object> getMap(Wrapper<T> queryWrapper);

【5】 根据 Wrapper,查询一条记录,Function 表示转化函数

<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

【List】


【1】查询所有

List<T> list();

【2】查询列表

List<T> list(Wrapper<T> queryWrapper);

【3】查询(根据ID 批量查询)

Collection<T> listByIds(Collection<? extends Serializable> idList);

【4】查询(根据 columnMap 条件)

Collection<T> listByMap(Map<String, Object> columnMap);

【5】查询所有列表

List<Map<String, Object>> listMaps();

【6】查询列表

List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);

【7】查询全部记录

List<Object> listObjs();

【8】查询全部记录

<V> List<V> listObjs(Function<? super Object, V> mapper);

【9】根据 Wrapper 条件,查询全部记录

List<Object> listObjs(Wrapper<T> queryWrapper);

【10】根据 Wrapper 条件,查询全部记录

<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

【Page】


【1】无条件翻页查询

IPage<T> page(IPage<T> page);

【2】翻页查询

IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);

【3】无条件翻页查询

IPage<Map<String, Object>> pageMaps(IPage<T> page);

【4】翻页查询

IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);

【Count】


【1】查询总记录数

int count();

【2】根据 Wrapper 条件,查询总记录数

int count(Wrapper<T> queryWrapper);

Chain-query】


【1】链式查询普通

QueryChainWrapper<T> query();

【2】链式查询 lambda 式。注意:不支持 Kotlin

LambdaQueryChainWrapper<T> lambdaQuery();

【3】示例:

query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();

Chain-update】


【1】链式更改普通

UpdateChainWrapper<T> update();

【2】链式更改 lambda 式。注意:不支持 Kotlin

LambdaUpdateChainWrapper<T> lambdaUpdate();

【3】示例:

update().eq("column", value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);

二、Mapper CRUD 接口


说明【1】通用 CRUD 封装 BaseMapper接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器;
【2】泛型 T 为任意实体对象;
【3】参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键;
对象 Wrapper 为 条件构造器

【Select】


【1】根据 ID 查询

T selectById(Serializable id);

【2】根据 entity 条件,查询一条记录

T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【3】查询(根据ID 批量查询)

List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

【4】根据 entity 条件,查询全部记录

List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【5】查询(根据 columnMap 条件)

List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

【6】根据 Wrapper 条件,查询全部记录

List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【7】根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值

List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【8】根据 entity 条件,查询全部记录(并翻页)

IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【9】根据 Wrapper 条件,查询全部记录(并翻页)

IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【10】根据 Wrapper 条件,查询总记录数

Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【Insert】


【1】插入一条记录,entity表示实体对象;

int insert(T entity);

【Delete】


【1】根据 entity 条件,删除记录

int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);

【2】删除(根据ID 批量删除)

int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

【3】根据 ID 删除

int deleteById(Serializable id);

【4】根据 columnMap 条件,删除记录

int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

【Update】


【1】根据 whereEntity 条件,更新记录

int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

【2】根据 ID 修改

int updateById(@Param(Constants.ENTITY) T entity);

【Select】


【1】根据 ID 查询

T selectById(Serializable id);

【2】根据 entity 条件,查询一条记录

T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【3】查询(根据ID 批量查询)


List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

【4】根据 entity 条件,查询全部记录

List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【5】查询(根据 columnMap 条件)

List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

【6】根据 Wrapper 条件,查询全部记录

List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【7】根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值

List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【8】根据 entity 条件,查询全部记录(并翻页)

IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【9】根据 Wrapper 条件,查询全部记录(并翻页)

IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

【10】根据 Wrapper 条件,查询总记录数

Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
类型 参数名 描述
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的;

allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)

例1: allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null
例2: allEq({id:1,name:"老王",age:null}, false)--->id = 1 and name = '老王'

个别参数说明:
【1】filter:过滤函数,是否允许字段传入比对条件中
【2】params 与 null2IsNull:同上

allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) 

例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})--->name = '老王' and age is null
例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)--->name = '老王'

【eq】

//等于 =
eq(R column, Object val)
eq(boolean condition, R column, Object val)

例: eq("name", "老王")--->name = '老王'

【ne】

//不等于 <>
ne(R column, Object val)
ne(boolean condition, R column, Object val)

例: ne("name", "老王")--->name <> '老王'

【gt】

//大于 >
gt(R column, Object val)
gt(boolean condition, R column, Object val)

例: gt("age", 18)--->age > 18

【ge】

//大于等于 >=
ge(R column, Object val)
ge(boolean condition, R column, Object val)

例: ge("age", 18)--->age >= 18

【lt】

//小于 <
lt(R column, Object val)
lt(boolean condition, R column, Object val)

例: lt("age", 18)--->age < 18

【le】

//小于等于 <=
le(R column, Object val)
le(boolean condition, R column, Object val)

例: le("age", 18)--->age <= 18

【between】

//BETWEEN 值1 AND 值2
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)

例: between("age", 18, 30)--->age between 18 and 30

【notBetween】

//NOT BETWEEN 值1 AND 值2
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)

例: notBetween("age", 18, 30)--->age not between 18 and 30

【like】

//LIKE '%值%'
like(R column, Object val)
like(boolean condition, R column, Object val)

例: like("name", "王")--->name like '%王%'

【notLike】

//NOT LIKE '%值%'
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)

例: notLike("name", "王")--->name not like '%王%'

【likeLeft】

//LIKE '%值'
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)

例: likeLeft("name", "王")--->name like '%王'

【likeRight】

//LIKE '值%'
likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)

例: likeRight("name", "王")--->name like '王%'

【isNull】

//字段 IS NULL
isNull(R column)
isNull(boolean condition, R column)

例: isNull("name")--->name is null

【isNotNull】

//字段 IS NOT NULL
isNotNull(R column)
isNotNull(boolean condition, R column)

例: isNotNull("name")--->name is not null

【in】

//字段 IN (value.get(0), value.get(1), ...)
in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)

例: in("age",{1,2,3})--->age in (1,2,3)

//字段 IN (v0, v1, ...)
in(R column, Object... values)
in(boolean condition, R column, Object... values)

例: in("age", 1, 2, 3)--->age in (1,2,3)

【notIn】

//字段 IN (value.get(0), value.get(1), ...)
notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)

例: notIn("age",{1,2,3})--->age not in (1,2,3)

//字段 NOT IN (v0, v1, ...)
notIn(R column, Object... values)
notIn(boolean condition, R column, Object... values)

例: notIn("age", 1, 2, 3)--->age not in (1,2,3)

【inSql】

//字段 IN ( sql语句 )
where id < 3)
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)

例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
例: inSql("id", "select id from table where id < 3")--->id in (select id from table 

【notInSql】

//字段 NOT IN ( sql语句 )
notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)

例: notInSql("age", "1,2,3,4,5,6")--->age not in (1,2,3,4,5,6)
例: notInSql("id", "select id from table where id < 3")--->id not in (select id from table where id < 3)

【groupBy】

//分组:GROUP BY 字段, ...
groupBy(R... columns)
groupBy(boolean condition, R... columns)

例: groupBy("id", "name")--->group by id,name

【orderByAsc】

//排序:ORDER BY 字段, ... ASC
orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)

例: orderByAsc("id", "name")--->order by id ASC,name ASC

【orderByDesc】

//排序:ORDER BY 字段, ... DESC
orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)

例: orderByDesc("id", "name")--->order by id DESC,name DESC

【orderBy】

//排序:ORDER BY 字段, ...
orderBy(boolean condition, boolean isAsc, R... columns)

例: orderBy(true, true, "id", "name")--->order by id ASC,name ASC

【having】

//HAVING ( sql语句 )
having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)

例: having("sum(age) > 10")--->having sum(age) > 10
例: having("sum(age) > {0}", 11)--->having sum(age) > 11

【or】

//拼接 OR
or()
or(boolean condition)

例: eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'

注意事项:主动调用 or表示紧接着下一个方法不是用 and连接!(不调用or则默认为使用and连接)

//OR 嵌套
or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)

例: or(i -> i.eq("name", "李白").ne("status", "活着"))--->or (name = '李白' and status <> '活着')

【and】

//AND 嵌套
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)

例: and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着')

【nested】

//正常嵌套 不带 AND 或者 OR
nested(Consumer<Param> consumer)
nested(boolean condition, Consumer<Param> consumer)

例: nested(i -> i.eq("name", "李白").ne("status", "活着"))--->(name = '李白' and status <> '活着')

【apply】

//拼接 sql
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)

例: apply("id = 1")--->id = 1
例: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")

注意事项:该方法可用于数据库函数 动态入参的 params对应前面 applySql内部的{index}部分。这样是不会有 sql注入风险的,反之会有。

【last】

//无视优化规则直接拼接到 sql 的最后
last(String lastSql)
last(boolean condition, String lastSql)

例: last("limit 1")

注意事项:只能调用一次,多次调用以最后一次为准。有 sql注入的风险,请谨慎使用

【exists】

//拼接 EXISTS ( sql语句 )
exists(String existsSql)
exists(boolean condition, String existsSql)

例: exists("select id from table where age = 1")--->exists (select id from table where age = 1)

【notExists】

//拼接 NOT EXISTS ( sql语句 )
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)

例: notExists("select id from table where age = 1")--->not exists (select id from table where age = 1)

【QueryWrapper】

说明:继承自 AbstractWrapper,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper,可以通过 new QueryWrapper().lambda() 方法获取。

【select】

//设置查询字段
select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)

//案例
//TestVO 查询的表对应的实体类
QueryWrapper<TestVO> wrapper = new QueryWrapper<>();
//data_type、value_code、column_a、column_b  均为数据库中的字段名,不是实体对象的属性
QueryWrapper<TestVO> queryWrapper = moduleInfoVOQueryWrapper.select("data_type", "value_code", "column_a", "column_b");
//我们将获取的值封装到 map 中传递
List<Map<String, Object>> maps = moduleInfoDAO.selectMaps(queryWrapper);

说明:过滤查询字段(主键除外),入参不包含 class 的调用前需要 wrapper内的 entity属性有值。这两类方法重复调用以最后一次为准

例: select("id", "name", "age")
例: select(i -> i.getProperty().startsWith("test"))

【UpdateWrapper】

说明:继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaUpdateWrapper,可以通过 new UpdateWrapper().lambda() 方法获取。

【set】

//SQL SET 字段
set(String column, Object val)
set(boolean condition, String column, Object val)

例: set("name", "老李头")
例: set("name", "")--->数据库字段值变为空字符串
例: set("name", null)--->数据库字段值变为null

【setSql】

//设置 SET 部分 SQL
setSql(String sql)

例: setSql("name = '老李头'")

【lambda】

获取 LambdaWrapper,在 QueryWrapper中是获取 LambdaQueryWrapper在 UpdateWrapper中是获取 LambdaUpdateWrapper


----关注公众号,获取更多内容----

猜你喜欢

转载自blog.csdn.net/zhengzhaoyang122/article/details/105568333