文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mybatis resultmap怎么为对象赋值的调用顺序

2023-06-29 00:59

关注

这篇文章主要介绍“mybatis resultmap怎么为对象赋值的调用顺序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis resultmap怎么为对象赋值的调用顺序”文章能帮助大家解决问题。

resultmap 为对象赋值的调用顺序

写了一个mybatis的mapper映射文件,

java bean定义如下

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;    }}

部分mybatis映射文件如下

<select id="selectFailedCourseRationByGroupIdAndCourseName" resultType="GroupCourseResult">      ...  </select>

实体类中的属性名和查询的列名完全匹配,但是没有查询stuclass,则封装后的实体类中的stuclass属性应该为空。

然而程序运行后,stuclass属性不仅不为空,还与cname完全相同,百思不得其解,故翻了翻mybatis的源码。

在mybatis中的DefaultResultSetHandler类中,

createResultObject方法的代码如下

  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时需注意的问题

如果是实体中是直接引用别的对象的具体参数字段,

直接用原始方式就行

    <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>

如果是实体中是list集合

    <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>

如果实体中引用的是别的对象,

使用association 标签来写

    <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集合,

应该使用collection标签

<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中各个标签的含义

mybatis resultmap怎么为对象赋值的调用顺序

tips:

在一个 resultMap 元素中,这些子元素出现的先后顺序是有严格规定的,它们从前到后依次是:constructor&ndash;>id --> result&ndash;> association&ndash;>collection -->discriminator, 不然就会报错。

关于“mybatis resultmap怎么为对象赋值的调用顺序”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯