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

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】示例:

1 update().eq("column", value).remove();
2 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的;

1 allEq(Map<R, V> params)
2 allEq(Map<R, V> params, boolean null2IsNull)
3 allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
4 
5 例1: allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null
6 例2: allEq({id:1,name:"老王",age:null}, false)--->id = 1 and name = '老王'

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

1 allEq(BiPredicate<R, V> filter, Map<R, V> params)
2 allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
3 allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) 
4 
5 例1: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})--->name = '老王' and age is null
6 例2: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)--->name = '老王'

【eq】

1 //等于 =
2 eq(R column, Object val)
3 eq(boolean condition, R column, Object val)
4 
5 例: eq("name", "老王")--->name = '老王'

【ne】

1 //不等于 <>
2 ne(R column, Object val)
3 ne(boolean condition, R column, Object val)
4 
5 例: ne("name", "老王")--->name <> '老王'

【gt】

1 //大于 >
2 gt(R column, Object val)
3 gt(boolean condition, R column, Object val)
4 
5 例: gt("age", 18)--->age > 18

【ge】

1 //大于等于 >=
2 ge(R column, Object val)
3 ge(boolean condition, R column, Object val)
4 
5 例: ge("age", 18)--->age >= 18

【lt】

1 //小于 <
2 lt(R column, Object val)
3 lt(boolean condition, R column, Object val)
4 
5 例: lt("age", 18)--->age < 18

【le】

1 //小于等于 <=
2 le(R column, Object val)
3 le(boolean condition, R column, Object val)
4 
5 例: le("age", 18)--->age <= 18

【between】

1 //BETWEEN 值1 AND 值2
2 between(R column, Object val1, Object val2)
3 between(boolean condition, R column, Object val1, Object val2)
4 
5 例: between("age", 18, 30)--->age between 18 and 30

【notBetween】

1 //NOT BETWEEN 值1 AND 值2
2 notBetween(R column, Object val1, Object val2)
3 notBetween(boolean condition, R column, Object val1, Object val2)
4 
5 例: notBetween("age", 18, 30)--->age not between 18 and 30

【like】

1 //LIKE '%值%'
2 like(R column, Object val)
3 like(boolean condition, R column, Object val)
4 
5 例: like("name", "王")--->name like '%王%'

【notLike】

1 //NOT LIKE '%值%'
2 notLike(R column, Object val)
3 notLike(boolean condition, R column, Object val)
4 
5 例: notLike("name", "王")--->name not like '%王%'

【likeLeft】

1 //LIKE '%值'
2 likeLeft(R column, Object val)
3 likeLeft(boolean condition, R column, Object val)
4 
5 例: likeLeft("name", "王")--->name like '%王'

【likeRight】

1 //LIKE '值%'
2 likeRight(R column, Object val)
3 likeRight(boolean condition, R column, Object val)
4 
5 例: likeRight("name", "王")--->name like '王%'

【isNull】

1 //字段 IS NULL
2 isNull(R column)
3 isNull(boolean condition, R column)
4 
5 例: isNull("name")--->name is null

【isNotNull】

1 //字段 IS NOT NULL
2 isNotNull(R column)
3 isNotNull(boolean condition, R column)
4 
5 例: isNotNull("name")--->name is not null

【in】

 1 //字段 IN (value.get(0), value.get(1), ...)
 2 in(R column, Collection<?> value)
 3 in(boolean condition, R column, Collection<?> value)
 4 
 5 例: in("age",{1,2,3})--->age in (1,2,3)
 6 
 7 //字段 IN (v0, v1, ...)
 8 in(R column, Object... values)
 9 in(boolean condition, R column, Object... values)
10 
11 例: in("age", 1, 2, 3)--->age in (1,2,3)

【notIn】

 1 //字段 IN (value.get(0), value.get(1), ...)
 2 notIn(R column, Collection<?> value)
 3 notIn(boolean condition, R column, Collection<?> value)
 4 
 5 例: notIn("age",{1,2,3})--->age not in (1,2,3)
 6 
 7 //字段 NOT IN (v0, v1, ...)
 8 notIn(R column, Object... values)
 9 notIn(boolean condition, R column, Object... values)
10 
11 例: notIn("age", 1, 2, 3)--->age not in (1,2,3)

【inSql】

1 //字段 IN ( sql语句 )
2 where id < 3)
3 inSql(R column, String inValue)
4 inSql(boolean condition, R column, String inValue)
5 
6 例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
7 例: inSql("id", "select id from table where id < 3")--->id in (select id from table 

【notInSql】

1 //字段 NOT IN ( sql语句 )
2 notInSql(R column, String inValue)
3 notInSql(boolean condition, R column, String inValue)
4 
5 例: notInSql("age", "1,2,3,4,5,6")--->age not in (1,2,3,4,5,6)
6 例: notInSql("id", "select id from table where id < 3")--->id not in (select id from table where id < 3)

【groupBy】

1 //分组:GROUP BY 字段, ...
2 groupBy(R... columns)
3 groupBy(boolean condition, R... columns)
4 
5 例: groupBy("id", "name")--->group by id,name

【orderByAsc】

1 //排序:ORDER BY 字段, ... ASC
2 orderByAsc(R... columns)
3 orderByAsc(boolean condition, R... columns)
4 
5 例: orderByAsc("id", "name")--->order by id ASC,name ASC

【orderByDesc】

1 //排序:ORDER BY 字段, ... DESC
2 orderByDesc(R... columns)
3 orderByDesc(boolean condition, R... columns)
4 
5 例: orderByDesc("id", "name")--->order by id DESC,name DESC

【orderBy】

1 //排序:ORDER BY 字段, ...
2 orderBy(boolean condition, boolean isAsc, R... columns)
3 
4 例: orderBy(true, true, "id", "name")--->order by id ASC,name ASC

【having】

1 //HAVING ( sql语句 )
2 having(String sqlHaving, Object... params)
3 having(boolean condition, String sqlHaving, Object... params)
4 
5 例: having("sum(age) > 10")--->having sum(age) > 10
6 例: having("sum(age) > {0}", 11)--->having sum(age) > 11

【or】

1 //拼接 OR
2 or()
3 or(boolean condition)
4 
5 例: eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'

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

1 //OR 嵌套
2 or(Consumer<Param> consumer)
3 or(boolean condition, Consumer<Param> consumer)
4 
5 例: or(i -> i.eq("name", "李白").ne("status", "活着"))--->or (name = '李白' and status <> '活着')

【and】

1 //AND 嵌套
2 and(Consumer<Param> consumer)
3 and(boolean condition, Consumer<Param> consumer)
4 
5 例: and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着')

【nested】

1 //正常嵌套 不带 AND 或者 OR
2 nested(Consumer<Param> consumer)
3 nested(boolean condition, Consumer<Param> consumer)
4 
5 例: nested(i -> i.eq("name", "李白").ne("status", "活着"))--->(name = '李白' and status <> '活着')

【apply】

1 //拼接 sql
2 apply(String applySql, Object... params)
3 apply(boolean condition, String applySql, Object... params)
4 
5 例: apply("id = 1")--->id = 1
6 例: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
7 例: 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】

1 //无视优化规则直接拼接到 sql 的最后
2 last(String lastSql)
3 last(boolean condition, String lastSql)
4 
5 例: last("limit 1")

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

【exists】

1 //拼接 EXISTS ( sql语句 )
2 exists(String existsSql)
3 exists(boolean condition, String existsSql)
4 
5 例: exists("select id from table where age = 1")--->exists (select id from table where age = 1)

【notExists】

1 //拼接 NOT EXISTS ( sql语句 )
2 notExists(String notExistsSql)
3 notExists(boolean condition, String notExistsSql)
4 
5 例: 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】

 1 //设置查询字段
 2 select(String... sqlSelect)
 3 select(Predicate<TableFieldInfo> predicate)
 4 select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
 5 
 6 //案例
 7 //TestVO 查询的表对应的实体类
 8 QueryWrapper<TestVO> wrapper = new QueryWrapper<>();
 9 //data_type、value_code、column_a、column_b  均为数据库中的字段名,不是实体对象的属性
10 QueryWrapper<TestVO> queryWrapper = moduleInfoVOQueryWrapper.select("data_type", "value_code", "column_a", "column_b");
11 //我们将获取的值封装到 map 中传递
12 List<Map<String, Object>> maps = moduleInfoDAO.selectMaps(queryWrapper);

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

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

【UpdateWrapper】

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

【set】

1 //SQL SET 字段
2 set(String column, Object val)
3 set(boolean condition, String column, Object val)
4 
5 例: set("name", "老李头")
6 例: set("name", "")--->数据库字段值变为空字符串
7 例: set("name", null)--->数据库字段值变为null

【setSql】

1 //设置 SET 部分 SQL
2 setSql(String sql)
3 
4 例: setSql("name = '老李头'")

【lambda】

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

posted @ 2020-11-15 14:12  Java程序员进阶  阅读(562)  评论(0编辑  收藏  举报