MyBatis:resultMap

问题背景

之前学习所用到的代码相关内容如下:

  • 数据库:表中字段为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 password

    1
    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语句就能完成映射。