问题背景
之前学习所用到的代码相关内容如下:
- 数据库:表中字段为id, name, pwd
- 实体类:id, name, pwd
UserMapper.xml:
1
2
3<select id="getUserById" resultType="User" parameterType="int">
select * from mybatis.user where id = #{id}
</select>通过这种UserMapper.xml的配置可以实现通过Id取用户信息的需求。
假设现在我保持其它不变,更改实体类为: id, name, password,重新启动测试。输出内容为:1
User{id=1, name='张三', password='null'}
可以看到password的输出为空。
问题分析
类型处理器会自动转译属性名,因此
select * from mybatis.user where id = #{id}
这段Sql代码的转译过后应该是select id,name,pwd from mybatis.user where id = #{id}
解决方案
别名(不推荐)
1
2
3<select id="getUserById" resultType="User" parameterType="int">
select id,name,pwd as password from mybatis.user where id = #{id}
</select>resultMap结果集映射
原来的结果是:id name pwd
实体类是: id name password1
2
3
4
5
6
7
8
9<!-- UserMap是随意取的名字,用来与下面select标签中的resultMap对应 -->
<resultMap id="UserMap" type="User">
<!-- column数据库中的字段,property实体类中的属性 -->
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id = #{id}
</select>ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。简单的语句就是我们原本的代码,直接使用Sql语句就能完成映射。