最近发现一个mybatis问题:
mybatis中如果实体类不添加构造函数select语句不报错,但是一旦添加了构造函数,没有所对应的resultMap里面的result字段就报错?
如:
A.java
class A{
private int id;
private String a;
private String b;
}
AMapper.xml
<resultMap id="aBean" type="A">
<id column="id" property="id"/>
<result column="a" property="a" />
<result column="b" property="b" />
</resultMap>
<select id="queryById" resultMap="aBean">
select *
from A
where id=#{id}
</select>
上面写法是没问题,但是下面就有问题:
A.java
class A{
private int id;
private String a;
private String b;
public A(String a){
this.a = a;
}
}
AMapper.xml
<resultMap id="aBean" type="A">
<id column="id" property="id"/>
<result column="a" property="a" />
<result column="b" property="b" />
</resultMap>
<select id="queryById" resultMap="aBean">
select *
from A
where id=#{id}
</select>
这种写法就报错,解决办法就是要填充所有resultMap里面的字段,如:
A.java
class A{
private int id;
private String a;
private String b;
public A(String a,String b){
this.a = a;
this.b = b;
}
public A(String a){
this.a = a;
}
}
请问下这是为什么???有人知道吗
结合官方文档中Object Factory 和 Result Maps 的说明,当你在
<select>
标签中要求获取a
,b
两个属性时,它又发现A
含有一个带参数的构造器,此时它会尝试将a
,b
的值作为参数调用带参构造器,然而你只声明了参数a
,那么就会创建失败了。