Mybatis 学习笔记1:构造方法注入

本文分析了Mybatis在进行构造方法注入时出现的异常,重点探讨了ResultMap.Builder在验证实体类构造方法时的匹配规则。通过实例展示了由于缺少'-parameters'编译选项导致的参数名不匹配问题,并提供了使用 javac -parameters 编译来解决这个问题的方法。同时,简要介绍了Java前端编译的相关内容。
摘要由CSDN通过智能技术生成

Mybatis 构造方法注入

最近阅读 Mybatis 3.5.8-SNAPSHOT 版本源码,在调试过程中遇到如下异常:

org.apache.ibatis.builder.BuilderException:
    Error in result map 'MyEmployee.empResultMap'.
    Failed to find a constructor in 'MyEmployee' by arg names [id, name, company]. 

堆栈信息如下:

Caused by: org.apache.ibatis.builder.BuilderException: Error in result map 'MyEmployee.empResultMap'. Failed to find a constructor in 'MyEmployee' by arg names [id, name, company]. There might be more info in debug log.
	at org.apache.ibatis.mapping.ResultMap$Builder.build(ResultMap.java:134)
	at org.apache.ibatis.builder.MapperBuilderAssistant.addResultMap(MapperBuilderAssistant.java:208)
	at org.apache.ibatis.builder.ResultMapResolver.resolve(ResultMapResolver.java:47)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:348)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:262)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements(XMLMapperBuilder.java:254)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:127)
	... 2 more

分析异常原因,在 ResultMap.Builder 构建 ResultMap 对象时,会调用 argNamesOfMatchingConstructor() 方法检验实体类中是否存在 constructorResultMappings 集合对应的构造方法,即检验实体类构造参数的个数、参数名、参数类型是否和 constructorResultMappings 集合的长度和集合中 resultMapping 元素的 property 属性和 javaType 属性(即 mapper.xml 文件中 constructor 元素的子元素个数、子元素的 name 属性、javaType 属性)一致,如果不一致就会抛出 BuilderException。

构造参数名不匹配
调试发现上图 157 行代码根据实体类构造方法获得的参数名集合为 [arg0, arg1, arg2],和 constructorResultMappings 参数提供的参数名集合 [id, name, company] 不一致,因此抛出异常。

MyEmployee、MyCompany 实体类如下:
注意:MyEmployee 构造方法并没有使用 @Param 注解。

public class MyEmployee {
   
    private Integer id;
    private String name;
    private MyCompany company;
    // 构造方法参数并没有使用@Param注解
    public MyEmployee(Integer id, String name, MyCompany company) {
   
        this.id = id;
        this.name = name;
        this.company = company;
    }
}

public class MyCompany {
   
    private Integer id;
    private String name;
}

MyEmployee.xml 文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MyEmployee">
    <resultMap id="empResultMap" type="MyEmployee">
        <construc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值