MyBatis column属性详解:查询结果列名与实体属性的映射关系
在使用MyBatis进行对象关系映射(ORM)时,column 属性的作用域常被误解。许多开发者认为它直接对应数据库表中的物理列名,但实际上,当使用 resultMap 并配合 SQL 别名时,column 指向的是 SQL 查询语句返回的结果集列名。理解这一区别是解决复杂字段映射问题的关键。
核心结论先行
<result property="..." column="..." /> 中的 column 属性,默认情况下对应的是查询结果集中显示的列名(即 SQL Select 语句后的标识符),而非数据库中表的原始列名。
实验验证:默认映射机制
为了直观理解 MyBatis 的行为,我们构建一个基础测试环境。假设数据库中有一张 user 表,包含以下字段:
对应的 Java 实体类 User 包含三个属性:id、username、password。
第1步:执行标准查询
在 Mapper 配置文件中,编写获取所有用户的 SQL 语句。以下是两种常见的写法:
<select id="getUsers" resultType="User">
select * from mybaties.user
</select>
或者显式指定字段:
<select id="getUsers" resultType="User">
select id, username, password from mybaties.user
</select>
这两种写法在功能上是等价的。MyBatis 会根据查询返回的列名与实体类属性名进行自动匹配。运行测试结果如下:
可以看到,所有信息均被成功获取,这是因为列名 username 和 password 与实体类属性名完全一致,触发了 MyBatis 的自动映射机制。
第2步:引入 SQL 别名并观察异常
现在,我们尝试修改 SQL 语句,给 password 字段起一个别名 pwd,以模拟实际开发中可能遇到的需求(如避免保留字冲突或自定义输出格式):
<select id="getUsers" resultType="User">
select id, username, password as pwd from mybaties.user
</select>
此时再次运行代码,我们会发现意外发生了。尽管数据库中存在密码值,但获取到的结果中 password 字段变成了 null:
原因分析
出现该现象的原因是:SQL 查询返回的结果集列名已变为 pwd。由于我们没有配置 resultMap,MyBatis 默认根据列名查找对应的实体属性。它在 User 类中寻找名为 pwd 的属性,但未找到,因此该字段映射失败;而 id 和 username 因名称未变,依然能正确映射。
第3步:使用 resultMap 修正映射
要解决这个问题,必须显式告诉 MyBatis:查询结果中的 pwd 列应该赋值给实体类的 password 属性。我们需要定义一个 resultMap:
<resultMap id="um" type="User">
<result property="password" column="pwd"/>
</resultMap>
然后在查询语句中引用这个 resultMap:
<select id="getUsers" resultMap="um">
select id, username, password as pwd from mybaties.user
</select>
关键参数解释:
property="password":指定 Java 实体类中的属性名。column="pwd":指定 SQL 查询返回结果集中的列名(即别名)。
再次运行测试,结果恢复正常:
可以看到,即使使用了别名,password 字段也能正确获取到数据库中的值。
总结
通过以上实验可以得出明确结论:在 MyBatis 的 resultMap 中,column 属性映射的是SQL查询所得到的表的列名(即 Result Set 中的列名),而不是数据库中已存在的物理表列名。当 SQL 语句中包含别名时,务必确保 column 的值与别名一致,以便正确关联至实体类的 property。
以上就是MyBatis中column属性的详细内容,更多关于MyBatis映射配置的技巧请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













