单纯的收集建议,不一定采纳!!

Comment From: nn200433

  1. 支持物理删除 java lambdaUpdate().eq(Test::getId, "1").remove().force();
  2. 支持忽略逻辑删除查询 java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
  3. 支持忽略逻辑删除更新 java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
  4. 增加 sumcount 等简单的聚合函数
  5. IService 接口支持下查询结果转换功能。以下接口是举例,最终想法就是Entity查出10条,VO只需要5条,直接用Mapstruct映射下,调用 getById("id", EntityConvertMapper:toVO); 即可。 ```java /**

    • 根据id查询 *
    • @param id 主键
    • @param convert 转换
    • @return {@link R } */ public R getById(Serializable id, Function convert);

    /* * 根据 Wrapper,查询一条记录
    *

    结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

    * * @param queryWrapper 查询包装器 * @param convert 转换 * @return {@link R } / public R getOne(Wrapper queryWrapper, Function convert);

    /* * 列表 * * @param wrapper 包装器 * @param convert 转换 * @return {@link List }<{@link R }> / public List list(Wrapper wrapper, Function convert);

    /* * 查询(根据ID 批量查询) * * @param idList 主键ID列表 * @param convert 转换 * @return {@link List }<{@link R }> / public List listByIds(Collection<? extends Serializable> idList, Function convert);

    /* * 分页查询(循环转) * * @param page 翻页对象 * @param queryWrapper 实体对象封装操作类 * @param convert 转换 * @return {@link IPage }<{@link R }> / public IPage page(IPage page, Wrapper queryWrapper, Function convert);

    / * page查询结果转IPage> * * @param page page对象 * @param convertFields 转换字段 * @return {@link IPage }<{@link Map }<{@link String }, {@link Object }>> */ public IPage> pageResult2Map(IPage<?> page, String... convertFields); 7. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)java / * 实体类反射获取表信息【初始化】 */ public synchronized static TableInfo initTableInfo(MapperBuilderAssistant builderAssistant, Class<?> clazz) { TableInfo targetTableInfo = TABLE_INFO_CACHE.get(clazz); final Configuration configuration = builderAssistant.getConfiguration(); if (targetTableInfo != null) { Configuration oldConfiguration = targetTableInfo.getConfiguration(); if (!oldConfiguration.equals(configuration)) { // 不是同一个 Configuration,进行重新初始化 targetTableInfo = initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } return targetTableInfo; } return initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } ```

Comment From: ShuTianGit

求求你sum之类的简单语法也加上吧

Comment From: wuzhaozhongguo

1.queryWrapperLambda和queryWrapper互转,或者queryWrapperLambda支持写sql 2.增加 sum 、count 等复杂的聚合函数

Comment From: Taogang00

希望引入PageHelper 相似的分页处理方式,要分页的时候在查询之前定义分页条件,不需要分页的时候就不需要定义分页调整, 而不是需要将分页Page对象一层层传递下去Service,Mapper

PageHelper.startPage(query.getPage(), query.getPageSize());
//list 其实是可以共用的,前面定义了分页查询条件,返回的是分页结构的数据;没定义分页条件时,返回的是符合条件的集合
List<OlesDeviceDTO> list = xxxService.list(query);

Comment From: clovu

updateById 这个函数在执行 sql 前检查是否除ID外所有字段都为 null,如果为 null 那么不执行 sql。 因为有时候一张表好几十个字段,如果在执行之前手动检查,代码会很丑陋。

Comment From: CxMYu

希望增加“通用”的sql函数、聚合、转换 相关功能等

Comment From: uncarbon97

1.queryWrapperLambda和queryWrapper互转,或者queryWrapperLambda支持写sql 2.增加 sum 、count 等复杂的聚合函数

现在就可以用 new queryWrapper().select(" SUM(xxx) AS xxx").lambda().eq()

Comment From: uncarbon97

求求你sum之类的简单语法也加上吧

现在就可以用 new queryWrapper().select(" SUM(xxx) AS xxx").lambda().eq()

Comment From: frozenfield

建议,能向下兼容3.X。

Comment From: Xueyu334

例如 TableName TableId以及 TableField 可以兼容java的persistence Api 的注解

Comment From: fu9809

希望增加日志打印SQL的功能,只打印SQL,而不打印返回的数据。 并且现在日志里的SQL,并不能直接运行,希望可以打印成可以执行的SQL

Comment From: Monkey-Java

增加注解式定义查询字段(复合查询场景下,有大量重复代码用于判空、条件拼接) 现状: if(a != null) then wrapper.eq(xxx,a), if(b !=null) then wrapper.in(xxx, b), if( c != null) then wrapper.like(xxx,c)

期待: @QueryCondition(type=EQ, columnName = "xxx") private String a; @QueryCondition(type=IN, columnName = "xxx") private List b; @QueryCondition(type=LIKE, columnName = "xxx") private String c;

Comment From: nn200433

增加注解式定义查询字段(复合查询场景下,有大量重复代码用于判空、条件拼接) 现状: if(a != null) then wrapper.eq(xxx,a), if(b !=null) then wrapper.in(xxx, b), if( c != null) then wrapper.like(xxx,c)

期待: @QueryCondition(type=EQ, columnName = "xxx") private String a; @QueryCondition(type=IN, columnName = "xxx") private List b; @QueryCondition(type=LIKE, columnName = "xxx") private String c;

上古就支持条件判断了,你还用 if ? MyBatis-Plus [功能改进]: 4.0 希望支持功能建议收集

Comment From: nn200433

希望增加日志打印SQL的功能,只打印SQL,而不打印返回的数据。 并且现在日志里的SQL,并不能直接运行,希望可以打印成可以执行的SQL

一看就是没好好看文档的。

ps6y解决方案:https://baomidou.com/guides/p6spy/ druid连接池解决方案:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

Comment From: qmdx

希望引入PageHelper 相似的分页处理方式,要分页的时候在查询之前定义分页条件,不需要分页的时候就不需要定义分页调整, 而不是需要将分页Page对象一层层传递下去Service,Mapper

java PageHelper.startPage(query.getPage(), query.getPageSize()); //list 其实是可以共用的,前面定义了分页查询条件,返回的是分页结构的数据;没定义分页条件时,返回的是符合条件的集合 List<OlesDeviceDTO> list = xxxService.list(query);

这种做法早期支持过,存在安全隐患移除了,当使 startPage 和 List 中间调用了其它 list 会导致本应该分页的语句变成全表扫描,这种做法是极为不安全的,因此不会支持该能力。

Comment From: fu9809

感谢,文档上只有ps6y ,还需要改配置,实在麻烦,Mybatisflex那个原生的就很不错。 druid的方案倒是可以

---- 回复的原邮件 ---- | 发件人 | @.> | | 日期 | 2024年08月17日 14:55 | | 收件人 | @.> | | 抄送至 | @.>@.> | | 主题 | Re: [baomidou/mybatis-plus] [功能改进]: 4.0 希望支持功能建议收集 (Issue #6374) |

希望增加日志打印SQL的功能,只打印SQL,而不打印返回的数据。 并且现在日志里的SQL,并不能直接运行,希望可以打印成可以执行的SQL

一看就是没好好看文档的。

ps6y解决方案:https://baomidou.com/guides/p6spy/ druid连接池解决方案:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

Comment From: Monkey-Java

增加注解式定义查询字段(复合查询场景下,有大量重复代码用于判空、条件拼接) 现状: if(a != null) then wrapper.eq(xxx,a), if(b !=null) then wrapper.in(xxx, b), if( c != null) then wrapper.like(xxx,c) 期待: @QueryCondition(type=EQ, columnName = "xxx") private String a; @QueryCondition(type=IN, columnName = "xxx") private List b; @QueryCondition(type=LIKE, columnName = "xxx") private String c;

上古就支持条件判断了,你还用 if ?

您好!您的给的这个不就是个等值条件的method吗?我的意思是:复合条件查询下(QueryDTO查询参数非常多),不用每次都自己去判空,然后手动的写一大堆wrapper.eq, wrapper.in等等,而是通过注解查询字段的方式来解决这个问题

Comment From: nn200433

增加注解式定义查询字段(复合查询场景下,有大量重复代码用于判空、条件拼接) 现状: if(a != null) then wrapper.eq(xxx,a), if(b !=null) then wrapper.in(xxx, b), if( c != null) then wrapper.like(xxx,c) 期待: @QueryCondition(type=EQ, columnName = "xxx") private String a; @QueryCondition(type=IN, columnName = "xxx") private List b; @QueryCondition(type=LIKE, columnName = "xxx") private String c;

上古就支持条件判断了,你还用 if ?

您好!您的给的这个不就是个等值条件的method吗?我的意思是:复合条件查询下(QueryDTO查询参数非常多),不用每次都自己去判空,然后手动的写一大堆wrapper.eq, wrapper.in等等,而是通过注解查询字段的方式来解决这个问题

你没考虑过多个业务都要用的场景吗?按你这样说,A业务要这个查询条件,B业务不要,这还只是2个业务的场景,我10个业务用到这个实体类,你还要用注解还要加一堆分组去判断?

Comment From: Monkey-Java

你没考虑过多个业务都要用的场景吗?按你这样说,A业务要这个查询条件,B业务不要,这还只是2个业务的场景,我10个业务用到这个实体类,你还要用注解还要加一堆分组去判断?

你这么说就真的没理解我说的话,B业务不要,他不传这个参数不就行了 ?注解式默认过滤为空的条件。或者你说没做业务隔离控制,那写个策略枚举类,路由下不同业务下的不同查询权限就解决了?

Comment From: Xueyu334

希望增加日志打印SQL的功能,只打印SQL,而不打印返回的数据。 并且现在日志里的SQL,并不能直接运行,希望可以打印成可以执行的SQL

一看就是没好好看文档的。

ps6y解决方案:https://baomidou.com/guides/p6spy/ druid连接池解决方案:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_LogFilter

如果把mapper层的日志调成debug 不就输出sql了么

Comment From: Xueyu334

你没考虑过多个业务都要用的场景吗?按你这样说,A业务要这个查询条件,B业务不要,这还只是2个业务的场景,我10个业务用到这个实体类,你还要用注解还要加一堆分组去判断?

你这么说就真的没理解我说的话,B业务不要,他不传这个参数不就行了 ?注解式默认过滤为空的条件。或者你说没做业务隔离控制,那写个策略枚举类,路由下不同业务下的不同查询权限就解决了?

这个东西太重了 类上加查询条件注解的话 不太适用于所有场景吧 也违背了ibatis的半自动框架的初衷吧 这样搞直接用jpa了

Comment From: Monkey-Java

你没考虑过多个业务都要用的场景吗?按你这样说,A业务要这个查询条件,B业务不要,这还只是2个业务的场景,我10个业务用到这个实体类,你还要用注解还要加一堆分组去判断?

你这么说就真的没理解我说的话,B业务不要,他不传这个参数不就行了 ?注解式默认过滤为空的条件。或者你说没做业务隔离控制,那写个策略枚举类,路由下不同业务下的不同查询权限就解决了?

这个东西太重了 类上加查询条件注解的话 不太适用于所有场景吧 也违背了ibatis的半自动框架的初衷吧 这样搞直接用jpa了

不太认同,个人认为框架不应该被定义。如果强行给ibatis定义为半自动化框架,而放弃一些可以简化业务逻辑的API,这不是有背于框架本身的意思吗(框架就是简化开发)。你想想mybatis-plus的意义是啥,不就是为了简化mybatis繁琐的CURD吗?而且个人认为给字段增加注解,不会是一个重操作,范围简化了代码量,service层可以更加专注于业务代码的编写。

Comment From: Xueyu334

你没考虑过多个业务都要用的场景吗?按你这样说,A业务要这个查询条件,B业务不要,这还只是2个业务的场景,我10个业务用到这个实体类,你还要用注解还要加一堆分组去判断?

你这么说就真的没理解我说的话,B业务不要,他不传这个参数不就行了 ?注解式默认过滤为空的条件。或者你说没做业务隔离控制,那写个策略枚举类,路由下不同业务下的不同查询权限就解决了?

这个东西太重了 类上加查询条件注解的话 不太适用于所有场景吧 也违背了ibatis的半自动框架的初衷吧 这样搞直接用jpa了

不太认同,个人认为框架不应该被定义。如果强行给ibatis定义为半自动化框架,而放弃一些可以简化业务逻辑的API,这不是有背于框架本身的意思吗(框架就是简化开发)。你想想mybatis-plus的意义是啥,不就是为了简化mybatis繁琐的CURD吗?而且个人认为给字段增加注解,不会是一个重操作,范围简化了代码量,service层可以更加专注于业务代码的编写。

不明白在类上加条件注解的场景究竟有多少?一个po实例对应数据库的一条记录,如何被过滤筛选根据不同的业务场景,不同的接口方法调用,不同的传参都有不同的过滤逻辑加入进来,除了 等于 不等于 还有 is null is not null 或者 exist not exist having等各种各样的函数表达方式, 框架会变得特别笨重。

Comment From: Monkey-Java

你没考虑过多个业务都要用的场景吗?按你这样说,A业务要这个查询条件,B业务不要,这还只是2个业务的场景,我10个业务用到这个实体类,你还要用注解还要加一堆分组去判断?

你这么说就真的没理解我说的话,B业务不要,他不传这个参数不就行了 ?注解式默认过滤为空的条件。或者你说没做业务隔离控制,那写个策略枚举类,路由下不同业务下的不同查询权限就解决了?

这个东西太重了 类上加查询条件注解的话 不太适用于所有场景吧 也违背了ibatis的半自动框架的初衷吧 这样搞直接用jpa了

不太认同,个人认为框架不应该被定义。如果强行给ibatis定义为半自动化框架,而放弃一些可以简化业务逻辑的API,这不是有背于框架本身的意思吗(框架就是简化开发)。你想想mybatis-plus的意义是啥,不就是为了简化mybatis繁琐的CURD吗?而且个人认为给字段增加注解,不会是一个重操作,范围简化了代码量,service层可以更加专注于业务代码的编写。

不明白在类上加条件注解的场景究竟有多少?一个po实例对应数据库的一条记录,如何被过滤筛选根据不同的业务场景,不同的接口方法调用,不同的传参都有不同的过滤逻辑加入进来,除了 等于 不等于 还有 is null is not null 或者 exist not exist having等各种各样的函数表达方式, 框架会变得特别笨重。

不太好说明白,还是得给你把代码给写出来。等我有时间吧,talk is cheap, show you code!

Comment From: code142857

  1. 支持物理删除 java lambdaUpdate().eq(Test::getId, "1").remove().force();
  2. 支持忽略逻辑删除查询 java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
  3. 支持忽略逻辑删除更新 java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
  4. 增加 sumcount 等简单的聚合函数
  5. IService 接口支持下查询结果转换功能。以下接口是举例,最终想法就是Entity查出10条,VO只需要5条,直接用Mapstruct映射下,调用 getById("id", EntityConvertMapper:toVO); 即可。 ```java /**
  6. 根据id查询 *
  7. @param id 主键
  8. @param convert 转换
  9. @return {@link R } */ public R getById(Serializable id, Function convert);

/* * 根据 Wrapper,查询一条记录
*

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

* * @param queryWrapper 查询包装器 * @param convert 转换 * @return {@link R } / public R getOne(Wrapper queryWrapper, Function convert);

/* * 列表 * * @param wrapper 包装器 * @param convert 转换 * @return {@link List }<{@link R }> / public List list(Wrapper wrapper, Function convert);

/* * 查询(根据ID 批量查询) * * @param idList 主键ID列表 * @param convert 转换 * @return {@link List }<{@link R }> / public List listByIds(Collection<? extends Serializable> idList, Function convert);

/* * 分页查询(循环转) * * @param page 翻页对象 * @param queryWrapper 实体对象封装操作类 * @param convert 转换 * @return {@link IPage }<{@link R }> / public IPage page(IPage page, Wrapper queryWrapper, Function convert);

/ * page查询结果转IPage> * * @param page page对象 * @param convertFields 转换字段 * @return {@link IPage }<{@link Map }<{@link String }, {@link Object }>> */ public IPage> pageResult2Map(IPage<?> page, String... convertFields); 6. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)java / * 实体类反射获取表信息【初始化】 */ public synchronized static TableInfo initTableInfo(MapperBuilderAssistant builderAssistant, Class<?> clazz) { TableInfo targetTableInfo = TABLE_INFO_CACHE.get(clazz); final Configuration configuration = builderAssistant.getConfiguration(); if (targetTableInfo != null) { Configuration oldConfiguration = targetTableInfo.getConfiguration(); if (!oldConfiguration.equals(configuration)) { // 不是同一个 Configuration,进行重新初始化 targetTableInfo = initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } return targetTableInfo; } return initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } ```

@nn200433 我搞了个idea插件,可以热加载实体类,目前日常使用没问题,你可以试试,装上后jrebel方式启动项目就行了

JRebel-Extension-Idea-Plugin-1.0.0.zip

Comment From: nn200433

  1. 支持物理删除 java lambdaUpdate().eq(Test::getId, "1").remove().force();
  2. 支持忽略逻辑删除查询 java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
  3. 支持忽略逻辑删除更新 java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
  4. 增加 sumcount 等简单的聚合函数
  5. IService 接口支持下查询结果转换功能。以下接口是举例,最终想法就是Entity查出10条,VO只需要5条,直接用Mapstruct映射下,调用 getById("id", EntityConvertMapper:toVO); 即可。 ```java /**
  6. 根据id查询 *
  7. @param id 主键
  8. @param convert 转换
  9. @return {@link R } */ public R getById(Serializable id, Function convert);

/* * 根据 Wrapper,查询一条记录
*

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

* * @param queryWrapper 查询包装器 * @param convert 转换 * @return {@link R } / public R getOne(Wrapper queryWrapper, Function convert);

/* * 列表 * * @param wrapper 包装器 * @param convert 转换 * @return {@link List }<{@link R }> / public List list(Wrapper wrapper, Function convert);

/* * 查询(根据ID 批量查询) * * @param idList 主键ID列表 * @param convert 转换 * @return {@link List }<{@link R }> / public List listByIds(Collection<? extends Serializable> idList, Function convert);

/* * 分页查询(循环转) * * @param page 翻页对象 * @param queryWrapper 实体对象封装操作类 * @param convert 转换 * @return {@link IPage }<{@link R }> / public IPage page(IPage page, Wrapper queryWrapper, Function convert);

/ * page查询结果转IPage> * * @param page page对象 * @param convertFields 转换字段 * @return {@link IPage }<{@link Map }<{@link String }, {@link Object }>> */ public IPage> pageResult2Map(IPage<?> page, String... convertFields); 6. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)java / * 实体类反射获取表信息【初始化】 */ public synchronized static TableInfo initTableInfo(MapperBuilderAssistant builderAssistant, Class<?> clazz) { TableInfo targetTableInfo = TABLE_INFO_CACHE.get(clazz); final Configuration configuration = builderAssistant.getConfiguration(); if (targetTableInfo != null) { Configuration oldConfiguration = targetTableInfo.getConfiguration(); if (!oldConfiguration.equals(configuration)) { // 不是同一个 Configuration,进行重新初始化 targetTableInfo = initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } return targetTableInfo; } return initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } ```

@nn200433 我搞了个idea插件,可以热加载实体类,目前日常使用没问题,你可以试试,装上后jrebel方式启动项目就行了

JRebel-Extension-Idea-Plugin-1.0.0.zip

牛逼,我试试

Comment From: beingEggache

@TableField @TableId 等框架注解, 应该要可以支持接口的getter setter, 这样可以在MetaObjectHandler, 或者其他地方做一些抽象, 避免 实体之间的继承..

Comment From: YangAoLib

updateById 这个函数在执行 sql 前检查是否除ID外所有字段都为 null,如果为 null 那么不执行 sql。 因为有时候一张表好几十个字段,如果在执行之前手动检查,代码会很丑陋。

使用配置更新策略应该可以实现你想要的效果(默认的策略应该就是只有不是Null的才会进行生成set语句) https://baomidou.com/reference/annotation/#updatestrategy https://baomidou.com/reference/#updatestrategy

Comment From: CxMYu

updateById 这个函数在执行 sql 前检查是否除ID外所有字段都为 null,如果为 null 那么不执行 sql。 因为有时候一张表好几十个字段,如果在执行之前手动检查,代码会很丑陋。

使用配置更新策略应该可以实现你想要的效果(默认的策略应该就是只有不是Null的才会进行生成set语句) https://baomidou.com/reference/annotation/#updatestrategy https://baomidou.com/reference/#updatestrategy

但是这个适配mapper和service层所有的接口吗 我记得save、saveOrUpdate不适用 因为走的是默认的非空策略

Comment From: hejun-pacvue

以下是我的建议,希望可以参考: 1. 加入绕过逻辑删除的方法

  1. 加入join联表查询方法

  2. mapper层加入service层同样的批量处理方法,如saveBatch等

  3. QueryChainWrapper和LambdaQueryChainWrapper的互转,或者LambdaQueryChainWrapper支持QueryChainWrapper类似的手写sql select语句等,譬如要加个distinct 或者sum之类的函数LambdaQueryChainWrapper不支持

Comment From: socialzhy

[代码生成器] 如果po配置了父类,在生成po的时候默认不生成父类的字段,在加个开关配置

Comment From: aiyohe

分页查询默认的count查询语句是全表扫描,能不能从from截取 直接转成 select count(1) from

Comment From: HoHo1

  1. 建议可以兼容java的persistence Api 的注解
  2. 建议增加启动自动创建和更新数据库表结构和注释
  3. 增加复杂查询的支持, 如多表连接

Comment From: minitt

  1. 希望加入复合主键支持
  2. 希望加入Join构造器

Comment From: valuetodays

希望增加日志打印SQL的功能,只打印SQL,而不打印返回的数据。 并且现在日志里的SQL,并不能直接运行,希望可以打印成可以执行的SQL

这个功能,使用p6spy数据源的话就可以了。

Comment From: valuetodays

希望支持新框架 micronaut

Comment From: xxd11111

希望可以只提供实体类就能使用【com.baomidou.mybatisplus.extension.toolkit.Db】工具类; 我非常喜欢这个工具类的功能,而且我想简化项目中类的数量; 但是使用中发现必须要提供对应实体类的BaseMapper接口才能使用,否则会抛错Not Found TableInfoCache; 因为实际开发中BaseMapper 90%都是不要额外写方法的,只有一小部分功能需要单独写sql,这部分sql跟很多都是涉及到多个表,写在BaseMapper中也并不太合适。

Comment From: rowstop

1.queryWrapperLambda和queryWrapper互转,或者queryWrapperLambda支持写sql 2.增加 sum 、count 等复杂的聚合函数

3.5.8已经支持chainWrapper 转 lambdaChainWrapper #6314

Comment From: rowstop

以下是我的建议,希望可以参考:

  1. 加入绕过逻辑删除的方法
  2. 加入join联表查询方法
  3. mapper层加入service层同样的批量处理方法,如saveBatch等
  4. QueryChainWrapper和LambdaQueryChainWrapper的互转,或者LambdaQueryChainWrapper支持QueryChainWrapper类似的手写sql select语句等,譬如要加个distinct 或者sum之类的函数LambdaQueryChainWrapper不支持

6314

Comment From: beingEggache

  1. 支持物理删除 java lambdaUpdate().eq(Test::getId, "1").remove().force();
  2. 支持忽略逻辑删除查询 java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
  3. 支持忽略逻辑删除更新 java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
  4. 增加 sumcount 等简单的聚合函数
  5. IService 接口支持下查询结果转换功能。以下接口是举例,最终想法就是Entity查出10条,VO只需要5条,直接用Mapstruct映射下,调用 getById("id", EntityConvertMapper:toVO); 即可。 ```java /**
  6. 根据id查询 *
  7. @param id 主键
  8. @param convert 转换
  9. @return {@link R } */ public R getById(Serializable id, Function convert);

/* * 根据 Wrapper,查询一条记录
*

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

* * @param queryWrapper 查询包装器 * @param convert 转换 * @return {@link R } / public R getOne(Wrapper queryWrapper, Function convert);

/* * 列表 * * @param wrapper 包装器 * @param convert 转换 * @return {@link List }<{@link R }> / public List list(Wrapper wrapper, Function convert);

/* * 查询(根据ID 批量查询) * * @param idList 主键ID列表 * @param convert 转换 * @return {@link List }<{@link R }> / public List listByIds(Collection<? extends Serializable> idList, Function convert);

/* * 分页查询(循环转) * * @param page 翻页对象 * @param queryWrapper 实体对象封装操作类 * @param convert 转换 * @return {@link IPage }<{@link R }> / public IPage page(IPage page, Wrapper queryWrapper, Function convert);

/ * page查询结果转IPage> * * @param page page对象 * @param convertFields 转换字段 * @return {@link IPage }<{@link Map }<{@link String }, {@link Object }>> */ public IPage> pageResult2Map(IPage<?> page, String... convertFields); 6. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)java / * 实体类反射获取表信息【初始化】 */ public synchronized static TableInfo initTableInfo(MapperBuilderAssistant builderAssistant, Class<?> clazz) { TableInfo targetTableInfo = TABLE_INFO_CACHE.get(clazz); final Configuration configuration = builderAssistant.getConfiguration(); if (targetTableInfo != null) { Configuration oldConfiguration = targetTableInfo.getConfiguration(); if (!oldConfiguration.equals(configuration)) { // 不是同一个 Configuration,进行重新初始化 targetTableInfo = initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } return targetTableInfo; } return initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } ```

这个自己 写 SqlInjector 就可以了, 官方文档有例子...

Comment From: beingEggache

@TableField @TableId 等框架注解, 应该要可以支持接口的getter setter, 这样可以在MetaObjectHandler, 或者其他地方做一些抽象, 避免 实体之间的继承..

这个实现了, 方便做抽象...

Comment From: rowstop

1819 这种为什么不支持 不止能解决 NPE 问题,还能过滤调一部分非必要的计算,如果使用 if 那代码可太丑陋了

Comment From: ideaviewes

join你懂的

Comment From: HK-hub

很多时候我们在进行一些业务的时候需要进行幂等控制。其实希望增加exists()方法进行判断是否存在,不用每次都count() 去计数。exists()效率和性能是肯定优于count()的

Comment From: ideaviewes

希望能新增c#中类似于linq那样的查询语法

Comment From: huixiang-2024

@TableField @TableId 等框架注解, 应该要可以支持接口的getter setter, 这样可以在MetaObjectHandler, 或者其他地方做一些抽象, 避免 实体之间的继承..

+1

Comment From: cnbeiyu

目前updateById字段更新策略是使用的字段注解或者全局配置,希望可以增加一个方法可以强制更新所有字段(包含null),比如updateAllColById

Comment From: timeroar

MyBatis-Plus [功能改进]: 4.0 希望支持功能建议收集 建议 链式调用支持.one()而不是报错, 而且提供类似方法 比如oneByList这样的 自动追加limit 1这样的语法 而不是像源码这样一大堆中在get(0)

Comment From: miemieYaho

建议 链式调用支持.one()而不是报错, 而且提供类似方法 比如oneByList这样的 自动追加limit 1这样的语法 而不是像源码这样一大堆中在get(0)

不会有自动追加limit 1,别多想了

Comment From: limng06

  1. 支持物理删除 java lambdaUpdate().eq(Test::getId, "1").remove().force();
  2. 支持忽略逻辑删除查询 java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
  3. 支持忽略逻辑删除更新 java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
  4. 增加 sumcount 等简单的聚合函数
  5. IService 接口支持下查询结果转换功能。以下接口是举例,最终想法就是Entity查出10条,VO只需要5条,直接用Mapstruct映射下,调用 getById("id", EntityConvertMapper:toVO); 即可。 ```java /**
  6. 根据id查询 *
  7. @param id 主键
  8. @param convert 转换
  9. @return {@link R } */ public R getById(Serializable id, Function convert);

/* * 根据 Wrapper,查询一条记录
*

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

* * @param queryWrapper 查询包装器 * @param convert 转换 * @return {@link R } / public R getOne(Wrapper queryWrapper, Function convert);

/* * 列表 * * @param wrapper 包装器 * @param convert 转换 * @return {@link List }<{@link R }> / public List list(Wrapper wrapper, Function convert);

/* * 查询(根据ID 批量查询) * * @param idList 主键ID列表 * @param convert 转换 * @return {@link List }<{@link R }> / public List listByIds(Collection<? extends Serializable> idList, Function convert);

/* * 分页查询(循环转) * * @param page 翻页对象 * @param queryWrapper 实体对象封装操作类 * @param convert 转换 * @return {@link IPage }<{@link R }> / public IPage page(IPage page, Wrapper queryWrapper, Function convert);

/ * page查询结果转IPage> * * @param page page对象 * @param convertFields 转换字段 * @return {@link IPage }<{@link Map }<{@link String }, {@link Object }>> */ public IPage> pageResult2Map(IPage<?> page, String... convertFields); 6. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)java / * 实体类反射获取表信息【初始化】 */ public synchronized static TableInfo initTableInfo(MapperBuilderAssistant builderAssistant, Class<?> clazz) { TableInfo targetTableInfo = TABLE_INFO_CACHE.get(clazz); final Configuration configuration = builderAssistant.getConfiguration(); if (targetTableInfo != null) { Configuration oldConfiguration = targetTableInfo.getConfiguration(); if (!oldConfiguration.equals(configuration)) { // 不是同一个 Configuration,进行重新初始化 targetTableInfo = initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } return targetTableInfo; } return initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } ```

+1 忽略逻辑删除很有意义

Comment From: Xueyu334

实体类加属性 热加载也没办法处理啊 这是JVM本身的类加载机制导致的 不知道应用框架层面需要做什么修改

雨别 @.***

 

------------------ 原始邮件 ------------------ 发件人: "baomidou/mybatis-plus" @.>; 发送时间: 2024年12月24日(星期二) 上午10:22 @.>; @.**@.**>; 主题: Re: [baomidou/mybatis-plus] [功能改进]: 4.0 希望支持功能建议收集 (Issue #6374)

支持物理删除 lambdaUpdate().eq(Test::getId, "1").remove().force();

支持忽略逻辑删除查询 lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();

支持忽略逻辑删除更新 lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();

增加 sum 、count 等简单的聚合函数

IService 接口支持下查询结果转换功能。以下接口是举例,最终想法就是Entity查出10条,VO只需要5条,直接用Mapstruct映射下,调用 getById("id", EntityConvertMapper:toVO); 即可。 / * 根据id查询 * * @param id 主键 * @param convert 转换 * @return @. R } / public <R> R getById(Serializable id, Function<T, R> convert); / * 根据 Wrapper,查询一条记录 <br/> * <p>结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")</p> * * @param queryWrapper 查询包装器 * @param convert 转换 * @return @. R } / public <R> R getOne(Wrapper<T> queryWrapper, Function<T, R> convert); / * 列表 * * @param wrapper 包装器 * @param convert 转换 * @return @. List @. R }> / public <R> List<R> list(Wrapper<T> wrapper, Function<T, R> convert); /** * 查询(根据ID 批量查询) * * @param idList 主键ID列表 * @param convert 转换 * @return @. List @. R }> / public <R> List<R> listByIds(Collection<? extends Serializable> idList, Function<T, R> convert); / * 分页查询(循环转) * * @param page 翻页对象 * @param queryWrapper 实体对象封装操作类 * @param convert 转换 * @return @. IPage @. R }> / public <R> IPage<R> page(IPage<T> page, Wrapper<T> queryWrapper, Function<T, R> convert); / * page查询结果转IPage<Map<String, Object>> * * @param page page对象 * @param convertFields 转换字段 * @return @. IPage @. Map @. String }, @. Object }>> / public IPage<Map<String, Object>> pageResult2Map(IPage<?> page, String... convertFields);

@.**@. 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用JRebel mybatisPlus extension 插件能热部署,实体类完全没用,求求你改改吧,加个字段还要重启项目很累啊!!!) / * 实体类反射获取表信息【初始化】 */ public synchronized static TableInfo initTableInfo(MapperBuilderAssistant builderAssistant, Class<?> clazz) { TableInfo targetTableInfo = TABLE_INFO_CACHE.get(clazz); final Configuration configuration = builderAssistant.getConfiguration(); if (targetTableInfo != null) { Configuration oldConfiguration = targetTableInfo.getConfiguration(); if (!oldConfiguration.equals(configuration)) { // 不是同一个 Configuration,进行重新初始化 targetTableInfo = initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); } return targetTableInfo; } return initTableInfo(configuration, builderAssistant.getCurrentNamespace(), clazz); }

+1 忽略逻辑删除很有意义

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

Comment From: LSL1618

6. @TableName

确实PageHelper的分页调用方式最友好,既可以灵活自定义查询参数与分页参数隔离开来,又不会跟自定义查询深度绑定,像现在这样IPage传来传去导致耦合度高太麻烦。

Comment From: LSL1618

希望引入PageHelper 相似的分页处理方式,要分页的时候在查询之前定义分页条件,不需要分页的时候就不需要定义分页调整, 而不是需要将分页Page对象一层层传递下去Service,Mapper java PageHelper.startPage(query.getPage(), query.getPageSize()); //list 其实是可以共用的,前面定义了分页查询条件,返回的是分页结构的数据;没定义分页条件时,返回的是符合条件的集合 List<OlesDeviceDTO> list = xxxService.list(query);

这种做法早期支持过,存在安全隐患移除了,当使 startPage 和 List 中间调用了其它 list 会导致本应该分页的语句变成全表扫描,这种做法是极为不安全的,因此不会支持该能力。

你这种说法没啥说服力,只要控制好PageHelper的调用位置,紧跟在需要分页的查询前面,就完全不是问题,而且也可以通过参数控制是否需要分页调用。

        if (form.getPagination()) {
            PageHelper.startPage(form.getPage(), form.getRows());
        }
        List<SystemUserVo> list = systemUserService.findSystemUsers(form);
        PageInfo<SystemUserVo> pageEntity = new PageInfo(list);

Comment From: dxrun

优化分页方式,现在每次都要给分页之外的对象参数使用@Param定义别名,太麻烦 现在: IPage listTeacher(@Param("page") Page page, @Param("param") ListTeacherDTO param); 在xml里的标签内也要加param.属性名 AND "phone_number" = #{param.phoneNumber}

希望可以支持在mappp传单对象的时候,mapper和xml中不需要加别名

Comment From: Code-Lonely

希望引入PageHelper 相似的分页处理方式,要分页的时候在查询之前定义分页条件,不需要分页的时候就不需要定义分页调整, 而不是需要将分页Page对象一层层传递下去Service,Mapper java PageHelper.startPage(query.getPage(), query.getPageSize()); //list 其实是可以共用的,前面定义了分页查询条件,返回的是分页结构的数据;没定义分页条件时,返回的是符合条件的集合 List<OlesDeviceDTO> list = xxxService.list(query);

这种做法早期支持过,存在安全隐患移除了,当使 startPage 和 List 中间调用了其它 list 会导致本应该分页的语句变成全表扫描,这种做法是极为不安全的,因此不会支持该能力。

这是开发时不注意才会导致的问题,只要确保startPage和list是在一起的,就不会有这种问题。不应该为了这个所谓的安全隐患,放弃这么方便的设计。建议可以保留两种设计,想用啥都可以

Comment From: qmdx

希望引入PageHelper 相似的分页处理方式,要分页的时候在查询之前定义分页条件,不需要分页的时候就不需要定义分页调整, 而不是需要将分页Page对象一层层传递下去Service,Mapper java PageHelper.startPage(query.getPage(), query.getPageSize()); //list 其实是可以共用的,前面定义了分页查询条件,返回的是分页结构的数据;没定义分页条件时,返回的是符合条件的集合 List<OlesDeviceDTO> list = xxxService.list(query);

这种做法早期支持过,存在安全隐患移除了,当使 startPage 和 List 中间调用了其它 list 会导致本应该分页的语句变成全表扫描,这种做法是极为不安全的,因此不会支持该能力。

这是开发时不注意才会导致的问题,只要确保startPage和list是在一起的,就不会有这种问题。不应该为了这个所谓的安全隐患,放弃这么方便的设计。建议可以保留两种设计,想用啥都可以

这个存在安全风险,早期版本支持过后面放弃了,职责单一也是有好处的不会混乱,当然也存在你说的不够灵活

Comment From: jinceon

https://github.com/baomidou/mybatis-plus/issues/6670 https://zhuanlan.zhihu.com/p/657973985

增加类似jpa里的@Embedded和@Embedable支持。 或者在@TableField里继续做扩展?

public class User {
    private Long id;    
    private String name;
    private String email;

    // 期望是用Address对象来定义,而不是把Address里的所有字段定义出来
    @Embedded
     private Address home;
     @Embedded
    private Address work;
}

public class Address{
       private String city;
       private String street;
      //假设这里有较多字段,但是又没必要用OneToOne的概念,类似于领域驱动设计里的值对象的概念
}

Comment From: hitcp

1.希望可以在联表、子查询时候自动拼接租户字段 2.希望可以在联表、子查询时候自动拼接删除字段

Comment From: wenqiuhan

啥时候更新4.x,4.0.8已经一年多没更新了,

Comment From: jiayongming

1、希望增加日志打印SQL的功能,不要打印带占位符的,需要打印最终执行的SQL,可以的话带上返回值的大小、执行耗时等; 2、支持物理删除,现在必须自己写sql支持物理删除;

Comment From: LSL1618

@jiayongming 第1点完全可以使用 p6spy 来实现。

Comment From: jiayongming

@jiayongming 第1点完全可以使用 p6spy 来实现。

说的没错,上面的建议都可以有各种实现方式,那做mp的意义是啥,不就是简化使用吗

Comment From: libra1010

新增上下文 ScopedValue 支持 目前看很多插件,拦截器,均没有上下文传入,随着虚拟线程的启用, 是否有考虑支持 ScopedValue 或者各种拦截上下文传入

Comment From: jinceon

增加注解式定义查询字段(复合查询场景下,有大量重复代码用于判空、条件拼接) 现状: if(a != null) then wrapper.eq(xxx,a), if(b !=null) then wrapper.in(xxx, b), if( c != null) then wrapper.like(xxx,c) 期待: @QueryCondition(type=EQ, columnName = "xxx") private String a; @QueryCondition(type=IN, columnName = "xxx") private List b; @QueryCondition(type=LIKE, columnName = "xxx") private String c;

上古就支持条件判断了,你还用 if ? MyBatis-Plus [功能改进]: 4.0 希望支持功能建议收集

.eq(StringUtil.isNotBlank(name), "Name", name.trim())如果对值做了处理,比如字符串的值调用trim(),那么即使判断不为空不通过,这行代码依然会报空指针,这种情况还是只能外面包一层判断

你都会用 StringUtil.isNotBlank了,就不会用 StringUtil.trim ???

Comment From: Xhengfeng

增加注解式定义查询字段(复合查询场景下,有大量重复代码用于判空、条件拼接) 现状: if(a != null) then wrapper.eq(xxx,a), if(b !=null) then wrapper.in(xxx, b), if( c != null) then wrapper.like(xxx,c) 期待: @QueryCondition(type=EQ, columnName = "xxx") private String a; @QueryCondition(type=IN, columnName = "xxx") private List b; @QueryCondition(type=LIKE, columnName = "xxx") private String c;

上古就支持条件判断了,你还用 if ? MyBatis-Plus [功能改进]: 4.0 希望支持功能建议收集

.eq(StringUtil.isNotBlank(name), "Name", name.trim())如果对值做了处理,比如字符串的值调用trim(),那么即使判断不为空不通过,这行代码依然会报空指针,这种情况还是只能外面包一层判断

你都会用 StringUtil.isNotBlank了,就不会用 StringUtil.trim ???

想了下还是删了,本质还是我太菜的问题,用的时候下意识觉得前面判断了,后面怎么都不会有问题,但这和外面包一层判断并不是一样的,作为参数传进去前就是会先执行。