Mybatis中的resultType和resultMap 区别

Mybatis中的resultType和resultMap

是mybatis 中返回类型一定用到的,但不会同时出现。mybatis返回类型肯定是map结构,然后根据返回类型是map还是对象类型,再转换。

在给对象设置属性的时候,两个方法肯定会调用。

private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap) throws SQLException {
    final ResultLoaderMap lazyLoader = new ResultLoaderMap();
    Object resultObject = createResultObject(rsw, resultMap, lazyLoader, null);
    if (resultObject != null && !typeHandlerRegistry.hasTypeHandler(resultMap.getType())) {
      final MetaObject metaObject = configuration.newMetaObject(resultObject);
      boolean foundValues = resultMap.getConstructorResultMappings().size() > 0;
      if (shouldApplyAutomaticMappings(resultMap, !AutoMappingBehavior.NONE.equals(configuration.getAutoMappingBehavior()))) {
        foundValues = applyAutomaticMappings(rsw, resultMap, metaObject, null) || foundValues;
      }
      foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, null) || foundValues;
      foundValues = lazyLoader.size() > 0 || foundValues;
      resultObject = foundValues ? resultObject : null;
      return resultObject;
    }
    return resultObject;
  }
private boolean applyAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, String columnPrefix) throws SQLException {
    final List<String> unmappedColumnNames = rsw.getUnmappedColumnNames(resultMap, columnPrefix);
    <span style="font-size:24px;"> //<span style="color:#FF6666;">unmappedColumnNames是配置文件中未配的resultMap中的属性,下面是自动映射规则,去设值</span></span>

    boolean foundValues = false;
    for (String columnName : unmappedColumnNames) {
      String propertyName = columnName;
      if (columnPrefix != null && columnPrefix.length() > 0) {
        // When columnPrefix is specified,
        // ignore columns without the prefix.
        if (columnName.toUpperCase(Locale.ENGLISH).startsWith(columnPrefix)) {
          propertyName = columnName.substring(columnPrefix.length());
        } else {
          continue;
        }
      }

   <span style="font-size:18px;color:#FF6666;">  //这个自动映射属性的规则,很普通,根据映射出的属性,利用反射查找该对象,是否存在此属性,以便设值</span>
     final String property = metaObject.findProperty(propertyName, configuration.isMapUnderscoreToCamelCase());
      if (property != null && metaObject.hasSetter(property)) {
        final Class<?> propertyType = metaObject.getSetterType(property);
        if (typeHandlerRegistry.hasTypeHandler(propertyType)) {
          final TypeHandler<?> typeHandler = rsw.getTypeHandler(propertyType, columnName);
          final Object value = typeHandler.getResult(rsw.getResultSet(), columnName);
          if (value != null || configuration.isCallSettersOnNulls()) { // issue #377, call setter on nulls
            if (value != null || !propertyType.isPrimitive()) {
              metaObject.setValue(property, value);
            }
            foundValues = true;
          }
        }
      }
    }
    return foundValues;
  }
private boolean applyPropertyMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, ResultLoaderMap lazyLoader, String columnPrefix)
      throws SQLException {
    final List<String> mappedColumnNames = rsw.getMappedColumnNames(resultMap, columnPrefix);
<span style="font-size:24px;color:#FF0000;">//mappedColumnNames 是配置文件中配置resultMap中对应的映射,如果不配,此方法体就不会执行,走上面那该自动映射规则去映射属性(非常智能,但这个智能属性对应,不怎么特殊,也没提供自动映射拓展点</span>

     boolean foundValues = false;
    final List<ResultMapping> propertyMappings = resultMap.getPropertyResultMappings();
    for (ResultMapping propertyMapping : propertyMappings) {
      final String column = prependPrefix(propertyMapping.getColumn(), columnPrefix);
      if (propertyMapping.isCompositeResult()
          || (column != null && mappedColumnNames.contains(column.toUpperCase(Locale.ENGLISH)))
          || propertyMapping.getResultSet() != null) {
        Object value = getPropertyMappingValue(rsw.getResultSet(), metaObject, propertyMapping, lazyLoader, columnPrefix);
        final String property = propertyMapping.getProperty(); // issue #541 make property optional
        if (value != NO_VALUE && property != null && (value != null || configuration.isCallSettersOnNulls())) { // issue #377, call setter on nulls
          if (value != null || !metaObject.getSetterType(property).isPrimitive()) {
            metaObject.setValue(property, value);
          }
          foundValues = true;
        }
      }
    }
    return foundValues;
  }
时间: 2024-10-12 08:10:07

Mybatis中的resultType和resultMap 区别的相关文章

MyBatis中关于resultType和resultMap的区别

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值.

Mybatis中的resultType和resultMap

一.概述 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值. ①当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给r

[转]MyBatis中resultType与resultMap区别

MyBatis中关于resultType和resultMap的具体区别如下: MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap.resultType是直接表示返回类型的(对应着我们的model对象中的实体):resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系):resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个

MyBatis Review——使用resultType和resultMap实现一对一查询

例如: 查询订单信息,关联查询创建订单的用户信息. 查询语句: SELECT orders.*, USER .username ,USER .sex, USER .address FROM orders, USER WHERE orders.user_id = USER .id 查询结果: 1,使用resultType接受输出结果 用户信息: 订单信息: 用于接收结果的pojo: 为了将查询结果映射到pojo中,pojo必须包括所有查询列名.在原始orders对象不能接受所有查询字段的时候,定义

Mybatis中#{}和${}传参的区别及#和$的区别小结

最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果

Mybatis中$和#取数据的区别

Mybatis配置中,取出map入参的数据一般有两种方式#{key}和${key},下面是这两种取值的区别: 以同样的语句做对比: <select id="geUserByParam1" resultType="Map" parameterType="Map"> select * from t_user t where t.name=#{name} and t.password=#{password} </select>

resultType和resultMap区别,对一个数据库查询方法的分析

先看一段mybatis的代码 <resultMap id="BaseResultMap" type="com.example.tsfunproj.entity.BaseDataMap"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="MAP_CODE" property=

关于mybatis中的#{},和${} 的区别

使用过mybatis的都知道,mybatis的xml文件中对参数赋值的方式有两种,一种#{},另一种${} ,下面我就来说说两种区别 #{}会在你将要传入参数的位置用一个?替换,在执行sql的时候在将参数插入,可以防止sql注入(mybatis在处理#{}实际上是采用PreparedStatement预编译处理,先将带有?的sql 进行编译,在执行的时候在赋值,赋值之后不会进行编译,而sql注入是发生在编译阶段的),安全性很高,执行效率也要快一些 ${}属于一种静态文本替换,相当与sql拼接,无

mybatis中#{}和${}传参的区别

使用#传入参数是,sql语句解析是会加上'',比如 select * from table where name = #{name} , 传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李', 就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧, #{}传参能防止sql注入,如果在mapper文件中中,你用 select * from table where name = ${name} 那么解析出来的sql就是 sel