单纯的收集建议,不一定采纳!!
Comment From: nn200433
- 支持物理删除
java lambdaUpdate().eq(Test::getId, "1").remove().force();
- 支持忽略逻辑删除查询
java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
- 支持忽略逻辑删除更新
java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
- 增加
sum
、count
等简单的聚合函数 -
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 } / publicR 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 * 实体类反射获取表信息【初始化】 */ 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
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 ?
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
- 支持物理删除
java lambdaUpdate().eq(Test::getId, "1").remove().force();
- 支持忽略逻辑删除查询
java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
- 支持忽略逻辑删除更新
java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
- 增加
sum
、count
等简单的聚合函数- 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 } / publicR 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 * 实体类反射获取表信息【初始化】 */ 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); } ```> pageResult2Map(IPage<?> page, String... convertFields); 6. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)
java /
@nn200433 我搞了个idea插件,可以热加载实体类,目前日常使用没问题,你可以试试,装上后jrebel方式启动项目就行了
JRebel-Extension-Idea-Plugin-1.0.0.zip
Comment From: nn200433
- 支持物理删除
java lambdaUpdate().eq(Test::getId, "1").remove().force();
- 支持忽略逻辑删除查询
java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
- 支持忽略逻辑删除更新
java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
- 增加
sum
、count
等简单的聚合函数- 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 } / publicR 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 * 实体类反射获取表信息【初始化】 */ 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); } ```> pageResult2Map(IPage<?> page, String... convertFields); 6. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)
java /@nn200433 我搞了个idea插件,可以热加载实体类,目前日常使用没问题,你可以试试,装上后jrebel方式启动项目就行了
牛逼,我试试
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. 加入绕过逻辑删除的方法
-
加入join联表查询方法
-
mapper层加入service层同样的批量处理方法,如saveBatch等
-
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
- 建议可以兼容java的persistence Api 的注解
- 建议增加启动自动创建和更新数据库表结构和注释
- 增加复杂查询的支持, 如多表连接
Comment From: minitt
- 希望加入复合主键支持
- 希望加入Join构造器
Comment From: valuetodays
希望增加日志打印SQL的功能,只打印SQL,而不打印返回的数据。 并且现在日志里的SQL,并不能直接运行,希望可以打印成可以执行的SQL
这个功能,使用p6spy数据源的话就可以了。
Comment From: valuetodays
希望支持新框架 micronaut
Comment From: xxd11111
希望可以只提供实体类就能使用【com.baomidou.mybatisplus.extension.toolkit.Db】工具类;
我非常喜欢这个工具类的功能,而且我想简化项目中类的数量;
但是使用中发现必须要提供对应实体类的BaseMapper
Comment From: rowstop
1.queryWrapperLambda和queryWrapper互转,或者queryWrapperLambda支持写sql 2.增加 sum 、count 等复杂的聚合函数
3.5.8已经支持chainWrapper 转 lambdaChainWrapper #6314
Comment From: rowstop
以下是我的建议,希望可以参考:
- 加入绕过逻辑删除的方法
- 加入join联表查询方法
- mapper层加入service层同样的批量处理方法,如saveBatch等
- QueryChainWrapper和LambdaQueryChainWrapper的互转,或者LambdaQueryChainWrapper支持QueryChainWrapper类似的手写sql select语句等,譬如要加个distinct 或者sum之类的函数LambdaQueryChainWrapper不支持
6314
Comment From: beingEggache
- 支持物理删除
java lambdaUpdate().eq(Test::getId, "1").remove().force();
- 支持忽略逻辑删除查询
java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
- 支持忽略逻辑删除更新
java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
- 增加
sum
、count
等简单的聚合函数- 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 } / publicR 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 * 实体类反射获取表信息【初始化】 */ 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); } ```> pageResult2Map(IPage<?> page, String... convertFields); 6. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)
java /
这个自己 写 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
建议 链式调用支持.one()而不是报错, 而且提供类似方法 比如oneByList这样的 自动追加limit 1这样的语法 而不是像源码这样一大堆中在get(0)
Comment From: miemieYaho
建议 链式调用支持.one()而不是报错, 而且提供类似方法 比如oneByList这样的 自动追加limit 1这样的语法 而不是像源码这样一大堆中在get(0)
不会有自动追加limit 1,别多想了
Comment From: limng06
- 支持物理删除
java lambdaUpdate().eq(Test::getId, "1").remove().force();
- 支持忽略逻辑删除查询
java lambdaQuery().eq(Test::getId, "1").list().ignoreLogicalDel();
- 支持忽略逻辑删除更新
java lambdaUpdate().set(Test::getType, "2").eq(Test::getId, "1").update().ignoreLogicalDel();
- 增加
sum
、count
等简单的聚合函数- 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 } / publicR 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 * 实体类反射获取表信息【初始化】 */ 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); } ```> pageResult2Map(IPage<?> page, String... convertFields); 6. Mapper.xml、@TableName、@TableField 支持下开发中能够热加载。(一改动,使用jrebel热部署都没用,xml至少还能用`JRebel mybatisPlus extension` 插件能热部署,实体类完全没用,**求求你改改吧,加个字段还要重启项目很累啊!!!**)
java /
+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
希望可以支持在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 ?
.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 ?
.eq(StringUtil.isNotBlank(name), "Name", name.trim())
如果对值做了处理,比如字符串的值调用trim(),那么即使判断不为空不通过,这行代码依然会报空指针,这种情况还是只能外面包一层判断你都会用 StringUtil.isNotBlank了,就不会用 StringUtil.trim ???
想了下还是删了,本质还是我太菜的问题,用的时候下意识觉得前面判断了,后面怎么都不会有问题,但这和外面包一层判断并不是一样的,作为参数传进去前就是会先执行。