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
相关产品推荐
相关产品推荐

