这篇文章主要介绍“mybatis resultmap怎么为对象赋值的调用顺序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis resultmap怎么为对象赋值的调用顺序”文章能帮助大家解决问题。
写了一个mybatis的mapper映射文件,
public class GroupCourseResult extends GroupResult {
private String cid;
private String cname;
public GroupCourseResult(int stuschool, int nian, String stuclass, String cid, String cname) {
super(stuschool, nian, stuclass);
this.cid = cid;
this.cname = cname;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
}
<select id="selectFailedCourseRationByGroupIdAndCourseName" resultType="GroupCourseResult">
...
</select>
实体类中的属性名和查询的列名完全匹配,但是没有查询stuclass,则封装后的实体类中的stuclass属性应该为空。
然而程序运行后,stuclass属性不仅不为空,还与cname完全相同,百思不得其解,故翻了翻mybatis的源码。
在mybatis中的DefaultResultSetHandler类中,
private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, List<Class<?>> constructorArgTypes, List<Object> constructorArgs, String columnPrefix)
throws SQLException {
final Class<?> resultType = resultMap.getType();
final MetaClass metaType = MetaClass.forClass(resultType, reflectorFactory);
final List<ResultMapping> constructorMappings = resultMap.getConstructorResultMappings();
if (hasTypeHandlerForResultObject(rsw, resultType)) {
return createPrimitiveResultObject(rsw, resultMap, columnPrefix);
} else if (!constructorMappings.isEmpty()) {
return createParameterizedResultObject(rsw, resultType, constructorMappings, constructorArgTypes, constructorArgs, columnPrefix);
} else if (resultType.isInterface() || metaType.hasDefaultConstructor()) {
return objectFactory.create(resultType);
} else if (shouldApplyAutomaticMappings(resultMap, false)) {
return createByConstructorSignature(rsw, resultType, constructorArgTypes, constructorArgs);
}
throw new ExecutorException("Do not know how to create an instance of " + resultType);
}
经过调试发现,mybatis会先查找该javabean有无默认构造方法,如果有则采用设值注入,若没有,则根据javabean的有参构造方法进行设值,而在8以前的jdk版本中,我们利用反射只能获取到参数类型,不能获取到参数名称,这其中设值可能出现了匹配失误,将cname的值同时赋给了cname和stuclass。
想要解决这个问题,只须在javabean中添加默认构造方法即可。
如果是实体中是直接引用别的对象的具体参数字段,
<resultMap id="baseMap" type="com.ei.medical.modules.model.EduEducationKnowledge">
<id column="id" property="id"/>
<result column="visitNumber" property="visitNumber"/>
<result column="patientName" property="patientName"/>
<result column="sendTime" property="sendTime"/>
<result column="wardCode" property="wardCode"/>
<result column="wardName" property="wardName"/>
<result column="categoryCode" property="categoryCode"/>
<result column="title" property="title"/>
<result column="content" property="content"/>
<result column="cover" property="cover"/>
</resultMap>
<select id="getAllBy" resultMap="baseMap">
SELECT
eer.visit_number as visitNumber,
eer.patient_name as patientName,
eer.send_time as sendTime,
eek.id as id,
eek.ward_code as wardCode,
eek.ward_name as wardName,
eek.category_code as categoryCode,
eek.title as title,
eek.content as content,
eek.cover as cover
FROM
edu_education_record AS eer,
edu_education_knowledge AS eek
WHERE
eer.education_knowledge_id=eek.id
</select>
<resultMap id="baseMap" type="com.ei.medical.modules.model.EduEducationKnowledge">
<id column="id" property="id"/>
<result column="visitNumber" property="visitNumber"/>
<result column="patientName" property="patientName"/>
<result column="sendTime" property="sendTime"/>
<result column="wardCode" property="wardCode"/>
<result column="wardName" property="wardName"/>
<result column="categoryCode" property="categoryCode"/>
<result column="title" property="title"/>
<result column="content" property="content"/>
<result column="cover" property="cover"/>
<collection property="pic" ofType="string">
<result column="pic"/>
</collection>
</resultMap>
<select id="getAllBy" resultMap="baseMap">
SELECT
eer.visit_number as visitNumber,
eer.patient_name as patientName,
eer.send_time as sendTime,
eek.id as id,
eek.ward_code as wardCode,
eek.ward_name as wardName,
eek.category_code as categoryCode,
eek.title as title,
eek.content as content,
eek.cover as cover
FROM
edu_education_record AS eer,
edu_education_knowledge AS eek
WHERE
eer.education_knowledge_id=eek.id
</select>
如果实体中引用的是别的对象,
<resultMap id="baseMap" type="com.ei.medical.modules.model.EduEducationKnowledge">
<id column="id" property="id"/>
<result column="wardCode" property="wardCode"/>
<result column="wardName" property="wardName"/>
<result column="categoryCode" property="categoryCode"/>
<result column="title" property="title"/>
<result column="content" property="content"/>
<result column="cover" property="cover"/>
<association property="eduEducationRecord" javaType="com.ei.medical.modules.model.EduEducationRecord">
<result column="visitNumber" property="visitNumber"/>
<result column="patientName" property="patientName"/>
<result column="sendTime" property="sendTime"/>
</association>
</resultMap>
<select id="getAllBy" resultMap="baseMap">
SELECT
eer.visit_number as visitNumber,
eer.patient_name as patientName,
eer.send_time as sendTime,
eek.id as id,
eek.ward_code as wardCode,
eek.ward_name as wardName,
eek.category_code as categoryCode,
eek.title as title,
eek.content as content,
eek.cover as cover
FROM
edu_education_record AS eer,
edu_education_knowledge AS eek
WHERE
eer.education_knowledge_id=eek.id
</select>
如果实体中是引用的别的对象的list集合,
<resultMap id="baseMap" type="com.ei.medical.modules.model.EduEducationKnowledge">
<id column="id" property="id"/>
<result column="wardCode" property="wardCode"/>
<result column="wardName" property="wardName"/>
<result column="categoryCode" property="categoryCode"/>
<result column="title" property="title"/>
<result column="content" property="content"/>
<result column="cover" property="cover"/>
<collection property="eduEducationRecordList" ofType="com.ei.medical.modules.model.EduEducationRecord">
<result column="visitNumber" property="visitNumber"/>
<result column="patientName" property="patientName"/>
<result column="sendTime" property="sendTime"/>
</collection>
</resultMap>
<select id="getAllBy" resultMap="baseMap">
SELECT
eer.visit_number as visitNumber,
eer.patient_name as patientName,
eer.send_time as sendTime,
eek.id as id,
eek.ward_code as wardCode,
eek.ward_name as wardName,
eek.category_code as categoryCode,
eek.title as title,
eek.content as content,
eek.cover as cover
FROM
edu_education_record AS eer,
edu_education_knowledge AS eek
WHERE
eer.education_knowledge_id=eek.id
</select>
tips:
使用resultMap的时候,应该直接用as后面的字段名,即自己命的名字
如果没有使用as的话,直接使用数据库中原本的名字
resultMap中各个标签的含义
tips:
在一个 resultMap 元素中,这些子元素出现的先后顺序是有严格规定的,它们从前到后依次是:constructor–>id --> result–> association–>collection -->discriminator, 不然就会报错。
关于“mybatis resultmap怎么为对象赋值的调用顺序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。