属性名和字段名不一致的问题
image.png

解决方法
1.起别名

  1. <select id="getUserById" parameterType="int" resultType="User">
  2. <!-- select * from mybatis.user where id = #{id}-->
  3. select name, id ,pwd as password from mybatis.user where id = #{id}
  4. </select>

2.resultMap

resultMap

结果集映射

  1. <mapper namespace="com.yuanzi.dao.UserDao">
  2. <resultMap id="UserMap" type="User">
  3. <!-- column数据库中的字段, property实体类中的属性-->
  4. <!-- 字段名一致时,需要显示设置-->
  5. <!-- <result column="id" property="id"/>-->
  6. <!-- <result column="name" property="name"/>-->
  7. <result column="pwd" property="password"/>
  8. </resultMap>
  9. <select id="getUserById" parameterType="int" resultMap="UserMap">
  10. select * from mybatis.user where id = #{id}
  11. <!-- select name, id ,pwd as password from mybatis.user where id = #{id}-->
  12. </select>
  13. </mapper>

image.png

元素的结构

元素包含了一些子元素,结构如下:

<resultMap id="UserMap" type="User">
    <constructor><!-- 类再实例化时用来注入结果到构造方法 -->
        <idArg/><!-- ID参数,结果为ID -->
        <arg/><!-- 注入到构造方法的一个普通结果 -->  
    </constructor>
    <id/><!-- 用于表示哪个列是主键 -->
    <result/><!-- 注入到字段或JavaBean属性的普通结果 -->
    <association property=""/><!-- 用于一对一关联 -->
    <collection property=""/><!-- 用于一对多、多对多关联 -->
    <discriminator javaType=""><!-- 使用结果值来决定使用哪个结果映射 -->
        <case value=""/><!-- 基于某些值的结果映射 -->
    </discriminator>
</resultMap>
  • 元素的 type 属性表示需要的 POJO,id 属性是 resultMap 的唯一标识。
  • 子元素 用于配置构造方法(当 POJO 未定义无参数的构造方法时使用)。
    • 子元素 用于表示哪个列是主键。
    • 子元素 用于表示POJO和数据表普通列的映射关系。
    • 子元素 用在级联的情况下。关于级联的问题比较复杂


一条查询 SQL 语句执行后将返回结果,而结果可以使用 Map 存储,也可以使用 POJO 存储。

使用 Map 存储结果集

任何 select 语句都可以使用 Map 存储结果,示例代码如下:

<!-- 查询所有用户信息存到Map中 -->
<select id="selectAllUserMap" resultType="map">
    select * from user
</select>

测试上述 SQL 配置文件的过程如下:

首先在 com.dao.UserDao 接口中添加以下接口方法。
public List<Map<String,Object>> selectAllUserMap();
然后在 com.controller 包的 UserController 类中调用接口方法,具体代码如下。

// 查询所有用户信息存到Map中
List<Map<String, Object>> lmp = userDao.selectAllUserMap();
for (Map<String, Object> map : lmp) {
    System.out.println(map);
}

上述 Map 的 key 是 select 语句查询的字段名(必须完全一样),而 Map 的 value 是查询返回结果中字段对应的值,一条记录映射到一个 Map 对象中。Map 用起来很方便,但可读性稍差,有的开发者不太喜欢使用 Map,更多时候喜欢使用 POJO 的方式。

使用POJO存储结果集

有的开发者喜欢使用 POJO 的方式存储结果集,一方面可以使用自动映射,例如使用 resultType 属性,但有时候需要更为复杂的映射或级联,这时候就需要使用 元素

在 SQL 映射文件 UserMapper.xml 中配置