You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mybatis执行select *查询的实际行为及列选择最佳实践咨询

MyBatis中select *与resultMap的匹配逻辑及最佳实践

我来给你把这两个问题梳理清楚:

1. MyBatis会重写select *为指定列吗?

答案是不会。MyBatis完全尊重你编写的SQL语句,不管你的resultMap里定义了多少列,只要你写的是select *,它就会原封不动地执行这条SQL,把表中所有列的数据都查出来。之后,MyBatis会根据resultMap的配置,只把那些和POJO字段匹配的列映射到对象中,剩下的不匹配的列数据会被直接忽略,不会对POJO产生影响。

举个简单例子:假设你的表有id、name、age三列,resultMap只配置了id和name映射到POJO的对应字段,当你执行select *时,数据库会返回这三列的数据,但MyBatis只会把id和name的值设置到POJO里,age的数据会被丢弃。

2. 仅需部分列时,要不要手动编写select col1, col2,...?

非常建议你手动编写指定列,而不是依赖select *,原因有这几点:

  • 性能优化:查询不需要的列会浪费数据库的IO资源和网络带宽,尤其是当表中有大字段(比如text、blob类型)时,这种浪费会更明显。
  • 避免表结构变更的潜在问题:如果后续表中新增了列,select *会自动把新列也查出来,虽然MyBatis会忽略不匹配的字段,但如果新列的名称和POJO中某个字段巧合重名,可能会导致意外的赋值,引发bug。
  • 代码可读性与可维护性:明确写出要查询的列,能让其他开发者一眼看出这个SQL要获取哪些数据,后续维护时也更容易理解和修改。

当然,如果你的表结构非常稳定,且确实需要绝大多数列的数据,偶尔用select *也不是不行,但从最佳实践的角度来说,指定列的写法更稳妥。

内容的提问来源于stack exchange,提问作者Calvin_Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:38:22