Mybatis源码分析--返回值ResultType和ResultMap

来源:互联网 发布:手机验钞灯软件2.0 编辑:程序博客网 时间:2024/05/16 17:08

这一篇博客我们来介绍一下Mybatis执行sql语句返回的结果值的到实体对象的映射机制。首先ResultType和ResultMap的使用方式是不同的。

ResultType的使用方式:

resultType的值为实体类

<select id="getUser" parameterType="int" resultType="com.tianjunwei.learn.learn1.entity.User">         select * from users where id=#{id} </select>
ResultMap的使用方式:

首先要定义resultMap的对应关系

<resultMap type="com.tianjunwei.learn.learn1.entity.User" id="user">         <id column="id" property="id" javaType="int" jdbcType="INTEGER"></id>     <result column="name" property="names" javaType="string" jdbcType=VARCHAR/>     <result column="age" property="age" javaType="int" jdbcType="INTEGER"/></resultMap>
接下来直接使用id值resultMap="user"

<select id="getById" parameterType="int" resultMap="user">     select * from users where id=#{id} and 1=1</select>

以上就完成了resultType和resultMap的使用。其实mybatis的默认实现机制是首先会自动使用resultType模式,当表中的字段值和实体中的名称不一致时再使用ResultMap方式,如上面的实体User中的names和表中字段name中的对应关系,所以使用resultType方式实体类中User的names属性值为空,而使用resultMap方式实体类中就会有值。

当强制使用resultMap而不是ResultType是需要进行如下配置:增加了autoMapping=false,默认值为null

<resultMap type="com.tianjunwei.learn.learn1.entity.User" id="user" autoMapping="false">         <id column="id" property="id" javaType="int" jdbcType="INTEGER"></id>     <result column="name" property="names" javaType="string" jdbcType="VARCHAR"/>     <result column="age" property="age" javaType="int" jdbcType="INTEGER"/>     </resultMap>

接下来我们介绍一下其实现机制:

其具体实现是在DefaultResultSetHandler中,在获取每行数据时会根据resultType或者resultMap来给对象赋值,返回resultObject。

private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {    final ResultLoaderMap lazyLoader = new ResultLoaderMap();    Object resultObject = createResultObject(rsw, resultMap, lazyLoader, null);    if (resultObject != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {      final MetaObject metaObject = configuration.newMetaObject(resultObject);      boolean foundValues = !resultMap.getConstructorResultMappings().isEmpty();  //判断是否可以使用resultType,如果不做任何额外设置,返回true      if (shouldApplyAutomaticMappings(resultMap, false)) {        foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;      }  //使用resultMap方式      foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, null) || foundValues;      foundValues = lazyLoader.size() > 0 || foundValues;      resultObject = foundValues ? resultObject : null;      return resultObject;    }    return resultObject;  }




1 0
原创粉丝点击