Почему Mybatis не должен предоставлять метод построения параметров?

Я только определил в классе параметризованный метод построения. Если количество параметров и количество сопоставлений различны, запрос все еще может быть правильным.

Я выполняю запрос ассоциации "один ко многим". Когда 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 +
            '}';
}}

Mapper.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}]}

Результат этого запроса правильный, но странный. Потому что я не определял конструктор без параметров.


Но если я напишу так :

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

Я получу ошибку :

 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, не знаю, почему это происходит

0 ответов

Другие вопросы по тегам