关于MyBatis中ResultMap属性/列重命名的技术问询
关于MyBatis ResultMap与resultType别名映射的答疑
首先针对你的第一个问题:
上述ResultMap配置是否表示将POJO/Bean的username、password属性分别对应到数据库的user_name、hashed_password列?
答案是否定的。我们来看给出的userResultMap配置:
<resultMap id="userResultMap" type="User"> <id property="id" column="user_id" /> <result property="username" column="user_name"/> <result property="password" column="password"/> </resultMap>
这里的映射关系是:
- POJO的
id属性 ↔ 数据库列user_id - POJO的
username属性 ↔ 数据库列user_name - POJO的
password属性 ↔ 数据库列password
并没有将password映射到hashed_password列,你提到的hashed_password只出现在后面的resultType示例SQL里。
然后是第二个问题:
这种映射方式是否与以下使用resultType并在SQL中通过as指定别名的方式作用一致?
从解决列名与POJO属性名不匹配的核心需求来说,两者的最终效果是一致的——都能让MyBatis正确把查询结果映射到User对象的对应属性上。
但两者也有明显区别,适用场景不同:
ResultMap方式:
- 可复用性强:一旦定义好
userResultMap,所有需要映射User对象的SQL语句都能直接引用,不用重复编写别名逻辑 - 支持复杂映射:比如处理关联查询(一对一、一对多)、集合映射、自定义类型转换、高级映射规则等,这些是SQL别名方式无法实现的
- 配置集中,便于统一维护和修改
- 可复用性强:一旦定义好
SQL别名方式:
- 写法更直观,简单场景下代码更简洁
- 映射逻辑与SQL语句绑定,适合临时的、单一的简单映射需求
举个实际场景的例子:如果后续需要给User类新增一个createTime属性,对应数据库的create_time列,用ResultMap只需要在userResultMap里添加一行<result property="createTime" column="create_time"/>,所有引用该ResultMap的SQL都会自动生效;而用SQL别名方式,则需要在每一条相关SQL语句里都补充create_time as "createTime"的别名定义。
内容的提问来源于stack exchange,提问作者physicsboy
相关产品推荐
相关产品推荐

