mybatis resultmap怎么为对象赋值的调用顺序
mybatis resultmap怎么为对象赋值的调用顺序
这篇文章主要介绍“mybatisresultmap怎么为对象赋值的调用顺序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatisresultmap怎么为对象赋值的调用顺序”文章能帮助大家解决问题。
resultmap 为对象赋值的调用顺序
写了一个mybatis的mapper映射文件,
java bean定义如下
publicclassGroupCourseResultextendsGroupResult{privateStringcid;privateStringcname;publicGroupCourseResult(intstuschool,intnian,Stringstuclass,Stringcid,Stringcname){super(stuschool,nian,stuclass);this.cid=cid;this.cname=cname;}publicStringgetCid(){returncid;}publicvoidsetCid(Stringcid){this.cid=cid;}publicStringgetCname(){returncname;}publicvoidsetCname(Stringcname){this.cname=cname;}}
部分mybatis映射文件如下
<selectid="selectFailedCourseRationByGroupIdAndCourseName"resultType="GroupCourseResult">...</select>
实体类中的属性名和查询的列名完全匹配,但是没有查询stuclass,则封装后的实体类中的stuclass属性应该为空。
然而程序运行后,stuclass属性不仅不为空,还与cname完全相同,百思不得其解,故翻了翻mybatis的源码。
在mybatis中的DefaultResultSetHandler类中,
createResultObject方法的代码如下
privateObjectcreateResultObject(ResultSetWrapperrsw,ResultMapresultMap,List<Class<?>>constructorArgTypes,List<Object>constructorArgs,StringcolumnPrefix)throwsSQLException{finalClass<?>resultType=resultMap.getType();finalMetaClassmetaType=MetaClass.forClass(resultType,reflectorFactory);finalList<ResultMapping>constructorMappings=resultMap.getConstructorResultMappings();if(hasTypeHandlerForResultObject(rsw,resultType)){returncreatePrimitiveResultObject(rsw,resultMap,columnPrefix);}elseif(!constructorMappings.isEmpty()){returncreateParameterizedResultObject(rsw,resultType,constructorMappings,constructorArgTypes,constructorArgs,columnPrefix);}elseif(resultType.isInterface()||metaType.hasDefaultConstructor()){returnobjectFactory.create(resultType);}elseif(shouldApplyAutomaticMappings(resultMap,false)){returncreateByConstructorSignature(rsw,resultType,constructorArgTypes,constructorArgs);}thrownewExecutorException("Donotknowhowtocreateaninstanceof"+resultType);}
经过调试发现,mybatis会先查找该javabean有无默认构造方法,如果有则采用设值注入,若没有,则根据javabean的有参构造方法进行设值,而在8以前的jdk版本中,我们利用反射只能获取到参数类型,不能获取到参数名称,这其中设值可能出现了匹配失误,将cname的值同时赋给了cname和stuclass。
想要解决这个问题,只须在javabean中添加默认构造方法即可。
使用resultMap时需注意的问题
如果是实体中是直接引用别的对象的具体参数字段,
直接用原始方式就行
<resultMapid="baseMap"type="com.ei.medical.modules.model.EduEducationKnowledge"><idcolumn="id"property="id"/><resultcolumn="visitNumber"property="visitNumber"/><resultcolumn="patientName"property="patientName"/><resultcolumn="sendTime"property="sendTime"/><resultcolumn="wardCode"property="wardCode"/><resultcolumn="wardName"property="wardName"/><resultcolumn="categoryCode"property="categoryCode"/><resultcolumn="title"property="title"/><resultcolumn="content"property="content"/><resultcolumn="cover"property="cover"/></resultMap><selectid="getAllBy"resultMap="baseMap">SELECTeer.visit_numberasvisitNumber,eer.patient_nameaspatientName,eer.send_timeassendTime,eek.idasid,eek.ward_codeaswardCode,eek.ward_nameaswardName,eek.category_codeascategoryCode,eek.titleastitle,eek.contentascontent,eek.coverascoverFROMedu_education_recordASeer,edu_education_knowledgeASeekWHEREeer.education_knowledge_id=eek.id</select>
如果是实体中是list集合
<resultMapid="baseMap"type="com.ei.medical.modules.model.EduEducationKnowledge"><idcolumn="id"property="id"/><resultcolumn="visitNumber"property="visitNumber"/><resultcolumn="patientName"property="patientName"/><resultcolumn="sendTime"property="sendTime"/><resultcolumn="wardCode"property="wardCode"/><resultcolumn="wardName"property="wardName"/><resultcolumn="categoryCode"property="categoryCode"/><resultcolumn="title"property="title"/><resultcolumn="content"property="content"/><resultcolumn="cover"property="cover"/><collectionproperty="pic"ofType="string"><resultcolumn="pic"/></collection></resultMap><selectid="getAllBy"resultMap="baseMap">SELECTeer.visit_numberasvisitNumber,eer.patient_nameaspatientName,eer.send_timeassendTime,eek.idasid,eek.ward_codeaswardCode,eek.ward_nameaswardName,eek.category_codeascategoryCode,eek.titleastitle,eek.contentascontent,eek.coverascoverFROMedu_education_recordASeer,edu_education_knowledgeASeekWHEREeer.education_knowledge_id=eek.id</select>
如果实体中引用的是别的对象,
使用association 标签来写
<resultMapid="baseMap"type="com.ei.medical.modules.model.EduEducationKnowledge"><idcolumn="id"property="id"/><resultcolumn="wardCode"property="wardCode"/><resultcolumn="wardName"property="wardName"/><resultcolumn="categoryCode"property="categoryCode"/><resultcolumn="title"property="title"/><resultcolumn="content"property="content"/><resultcolumn="cover"property="cover"/><associationproperty="eduEducationRecord"javaType="com.ei.medical.modules.model.EduEducationRecord"><resultcolumn="visitNumber"property="visitNumber"/><resultcolumn="patientName"property="patientName"/><resultcolumn="sendTime"property="sendTime"/></association></resultMap><selectid="getAllBy"resultMap="baseMap">SELECTeer.visit_numberasvisitNumber,eer.patient_nameaspatientName,eer.send_timeassendTime,eek.idasid,eek.ward_codeaswardCode,eek.ward_nameaswardName,eek.category_codeascategoryCode,eek.titleastitle,eek.contentascontent,eek.coverascoverFROMedu_education_recordASeer,edu_education_knowledgeASeekWHEREeer.education_knowledge_id=eek.id</select>
如果实体中是引用的别的对象的list集合,
应该使用collection标签
<resultMapid="baseMap"type="com.ei.medical.modules.model.EduEducationKnowledge"><idcolumn="id"property="id"/><resultcolumn="wardCode"property="wardCode"/><resultcolumn="wardName"property="wardName"/><resultcolumn="categoryCode"property="categoryCode"/><resultcolumn="title"property="title"/><resultcolumn="content"property="content"/><resultcolumn="cover"property="cover"/><collectionproperty="eduEducationRecordList"ofType="com.ei.medical.modules.model.EduEducationRecord"><resultcolumn="visitNumber"property="visitNumber"/><resultcolumn="patientName"property="patientName"/><resultcolumn="sendTime"property="sendTime"/></collection></resultMap><selectid="getAllBy"resultMap="baseMap">SELECTeer.visit_numberasvisitNumber,eer.patient_nameaspatientName,eer.send_timeassendTime,eek.idasid,eek.ward_codeaswardCode,eek.ward_nameaswardName,eek.category_codeascategoryCode,eek.titleastitle,eek.contentascontent,eek.coverascoverFROMedu_education_recordASeer,edu_education_knowledgeASeekWHEREeer.education_knowledge_id=eek.id</select>
tips:
使用resultMap的时候,应该直接用as后面的字段名,即自己命的名字
如果没有使用as的话,直接使用数据库中原本的名字
resultMap中各个标签的含义
tips:
在一个 resultMap 元素中,这些子元素出现的先后顺序是有严格规定的,它们从前到后依次是:constructor–>id --> result–> association–>collection -->discriminator, 不然就会报错。
关于“mybatisresultmap怎么为对象赋值的调用顺序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡编程网行业资讯频道,小编每天都会为大家更新不同的知识点。
推荐阅读
-
mybatis如何编写一个自定义插件(mybatis plus优点)
mybatisplus优点?Mybatis-Plus是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改...
-
MyBatis和jeesite多表查询的方法
MyBatis和jeesite多表查询的方法这篇文章主要介绍了My...
-
Mybatis怎么实现ResultMap结果集
-
SpringBoot MyBatis怎么快速入门
-
怎么用springboot+mybatis plus实现树形结构查询
怎么用springboot+mybatisplus实现树形结构查询...
-
springboot中怎么实现mybatis多数据源动态切换
springboot中怎么实现mybatis多数据源动态切换这篇“...
-
基于SpringBoot加载Mybatis的TypeAlias问题怎么解决
基于SpringBoot加载Mybatis的TypeAlias问题怎么解决...
-
怎么用Springboot+mybatis-plus+注解实现数据权限隔离
怎么用Springboot+mybatis-plus+注解实现数据权限隔离...
-
Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描
Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描...
-
springBoot mybatis包扫描问题怎么解决
springBootmybatis包扫描问题怎么解决这篇文章主要...