mybatis查询结果resultMap映射vo源码分析

概述

mybatis是一个常用的持久层框架;通常搭配mysql使用;
在将查询结果映射成一个复杂vo的时候,通常会用到resultMap,在其中嵌套associationcollection等操作;将一个复杂查询拆分成简单查询;

vo中的变量有时候会定义初始值,那么当mybatis中查询结果为null的时候,会覆盖这个初始值吗;

mybatis版本:3.5.10
mysql版本:8.0.32

源码分析

映射结果集入口
org.apache.ibatis.executor.resultset.ResultSetHandler

public interface ResultSetHandler {
   // 处理结果集,生成相应的结果对象集合
  <E> List<E> handleResultSets(Statement stmt) throws SQLException;
   // 处理结果集,返回游标对象
  <E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;
   // 处理储存过程的输出参数 
  void handleOutputParameters(CallableStatement cs) throws SQLException;
}

进入实现类
org.apache.ibatis.executor.resultset.DefaultResultSetHandler

结果集的处理方法
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleResultSets

捞一张网图
在这里插入图片描述

一般都只会返回一个结果集,再进一步观察,里面调用的都是handleRowValues方法,在该方法中区分了嵌套ResultMap普通ResultMap(包括普通的resultType也会转成ResultMap,只是框架自动帮你转了)

org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleResultSet
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleRowValues

handleRowValuesForSimpleResultMap:处理简单的结果集映射
handleRowValuesForNestedResultMap:处理嵌套的结果集映射(resultMap> 声明时 是否包含 association、collection、case 关键字)

在最后映射的时候都是调用了
如果开启了自动映射,对实例进行自动赋值
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#applyAutomaticMappings

对用户主动声明的属性进行映射
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#applyPropertyMappings

在赋值的时候可以看到图中判断;
configuration.isCallSettersOnNulls()代表配置中null值是否调用set方法,顾名思义;

我的配置中set为true;

#mybatis plus 设置
mybatis-plus:
  configuration:
    # 返回类型为Map,显示null对应的字段
    call-setters-on-nulls: true

在这里插入图片描述

所以如果返回vo中想要在查询结果为null时,不覆盖vo的值;

  1. 改配置
  2. vo字段类型改为基础类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值