我只在类中定义了一个参数化的构造方法。当参数个数和映射个数不同时,查询仍然可以正确。
我正在做一个一对多的关联查询。当 ArrayList 未写入构造函数时,一切正常。
public class Classes {
private int classId;
private String className;
private ArrayList<Person> people;
public Classes(int classId, String className) {
this.classId = classId;
this.className = className;
}
@Override
public String toString() {
return "classes{" +
"classId=" + classId +
", className='" + className + '\'' +
", people=" + people +
'}';
}}
映射器.xml
<select id="queryPersonById" resultType="com.cztcode.mybatis.Person">
select * from person where id=#{id}
</select>
<resultMap id="class_people_map" type="Classes">
<id property="classId" column="class_id"/>
<result property="className" column="class_name"/>
<collection property="people" ofType="Person" >
<id property="id" column="id"/>
<result property="age" column="age"/>
<result property="name" column="name"/>
</collection>
</resultMap>
数据库查询结果
classes{classId=1, className='A', people=[Person{id=0, name='Shi', age=23, card=null}, Person{id=1, name='Li', age=18, card=null}]}
这个查询的结果是正确的,但很奇怪。因为我没有定义无参数构造函数。
但是如果我这样写:</p>
public class Classes {
private int classId;
private String className;
private ArrayList<Person> people;
public Classes(int classId, String className, ArrayList<Person> people) {
this.classId = classId;
this.className = className;
this.people = people;
}
@Override
public String toString() {
return "classes{" +
"classId=" + classId +
", className='" + className + '\'' +
", people=" + people +
'}';
}}
我会报错:</p>
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.cztcode.mybatis.Classes with invalid types (int,String,ArrayList) or values (1,A,0). Cause: java.lang.IllegalArgumentException: argument type mismatch
### The error may exist in PersonMapper.xml
### The error may involve com.cztcode.mapper.PersonMapper.queryAllClassAndPeople
### The error occurred while handling results
### SQL: select * from class,person where class.class_id=person.class and class.class_id=?
### Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.cztcode.mybatis.Classes with invalid types (int,String,ArrayList) or values (1,A,0). Cause: java.lang.IllegalArgumentException: argument type mismatch
我不明白为什么会这样。如果我写一个参数化的构造函数,它不会自动提供一个无参数的构造函数。mybatis在映射的时候会创建一个对象,但是不知道mybatis是怎么创建的。
如果我定义了一个构造函数而不写一个无参构造函数,那么mybatis创建对象的时候会调用哪个方法呢?如果是无参构造函数,我定义有参构造函数的时候应该不会报错,但实际上他报错,类型不匹配。
把不匹配类型的参数去掉就成功了,也就是说创建对象的时候自动调用了参数化的构造函数,不是很清楚。
刚学会用mybatis,不知道为什么会这样