1

我只在类中定义了一个参数化的构造方法。当参数个数和映射个数不同时,查询仍然可以正确。

我正在做一个一对多的关联查询。当 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,不知道为什么会这样

4

0 回答 0