为什么要ResultMap标签
MyBatis的查询结果集都是自动映射封装的,单行查询将数据库一条数据封装成对应的Java对象。多行查询,先将每一行封装成对象,再将每个对象添加到集合中,最后返回一个List集合对象。但是:必须保证查询结果集的字段名和pojo对象的属性名相同,否则无法自动封装
问题: 如何解决查询结果集名称和pojo对象属性不同的映射封装?
解决方案:
-
使用手动映射封装 ResultMap标签
-
可以使用mybatis的驼峰命名法-也必须遵循一定规则才行
前提准备
复制《mybatis-crul(增删改查)》的代码第一种:使用手动映射ResultMap标签
修改UserMapper.xml
--说明selectByPrimaryKey方法测试没有使用resultMap,结果集名称和pojo对象属性名又不同,打印结果如何。与selectAll对比<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.mapper.UserMapper">
<!-- 单行查询 -->
<select id="selectByPrimaryKey" parameterType="int" resultType="com.mybatis.pojo.User">
select id u_id,username u_name,password u_pwd,age from user where id=#{id}
</select>
<!--
resultMap标签作用:手动映射结果集的列名和对应pojo的属性名
type:需要映射的对象的类型
id :唯一标识
-->
<resultMap type="com.mybatis.pojo.User" id="user_map">
<!--
<id property="" column="" javaType="int" jdbcType="INTEGER"/>
主键列映射
column:查询结果集中主键的列名
property:对应pojo中主键列相应的属性名称
javaType: java数据类型【可选】默认类型自动映射
jdbcType: 对应的数据库类型【可选】默认类型自动映射
-->
<id property="id" column="u_id" javaType="int" jdbcType="INTEGER"/>
<!--
<result property="" column="" javaType="int" jdbcType="INTEGER"/>
非主键列映射
column:查询结果集中主键的列名
property:对应pojo中主键列相应的属性名称
javaType: java数据类型【可选】默认类型自动映射
jdbcType: 对应的数据库类型【可选】默认类型自动映射
-->
<result property="username" column="u_name"/>
<result property="password" column="u_pwd"/>
<!-- <result property="age" column="age"/> --><!-- 相同的可以不用手动映射,mybatis会自动映射 -->
<!--
id和result从功能上没有区别,从语义上可以区分哪个是主键,哪个是非主键
-->
</resultMap>
<!-- 多行查询功能
resultType:无论是单行还是多行查询的返回数据类型都是数据表对应的pojo对象
resultMap:手动映射结果集
resultType和resultMap同一时刻只能二选一
-->
<select id="selectAll" resultMap="user_map">
select id u_id,username u_name,password u_pwd,age from user
</select>
</mapper>