网站公司图片,湖南网站营销推广,浙江广厦建设职业技术学院网站,美丽乡村网站建设概述
mybatis是一个常用的持久层框架#xff1b;通常搭配mysql使用#xff1b; 在将查询结果映射成一个复杂vo的时候#xff0c;通常会用到resultMap#xff0c;在其中嵌套association和collection等操作#xff1b;将一个复杂查询拆分成简单查询#xff1b;
在vo中的变…概述
mybatis是一个常用的持久层框架通常搭配mysql使用 在将查询结果映射成一个复杂vo的时候通常会用到resultMap在其中嵌套association和collection等操作将一个复杂查询拆分成简单查询
在vo中的变量有时候会定义初始值那么当mybatis中查询结果为null的时候会覆盖这个初始值吗;
mybatis版本3.5.10 mysql版本:8.0.32
源码分析
映射结果集入口 org.apache.ibatis.executor.resultset.ResultSetHandler
public interface ResultSetHandler {// 处理结果集生成相应的结果对象集合E ListE handleResultSets(Statement stmt) throws SQLException;// 处理结果集返回游标对象E CursorE 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的值
改配置将vo字段类型改为基础类型