Серия MyBatis (8) — Вложенное сопоставление наборов результатов MyBatis|Вызов августовского обновления

задняя часть MyBatis
Серия MyBatis (8) — Вложенное сопоставление наборов результатов MyBatis|Вызов августовского обновления

Статьи по Теме

Краткое содержание серии MyBatis:Серия MyBatis


предисловие

  • Сначала посмотрите на официальный сайт для описания набора результатов

    • image-20210720142547793.png
  • Обычно чаще всего мы используем результат, но на практике мы можем столкнуться со сложными типами ассоциаций! В это время необходимо использоватьassociationа такжеcollection

  • Ниже приведены предварительные условия

  • студенческий стол

    • CREATE TABLE `student` (
        `id` int(10) NOT NULL,
        `name` varchar(20) DEFAULT NULL,
        `tid` int(10) DEFAULT NULL,
        PRIMARY KEY (`id`),
        KEY `fktid` (`tid`),
        CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      
  • учительский стол

    • CREATE TABLE `teacher` (
        `id` int(10) NOT NULL,
        `name` varchar(20) DEFAULT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8
      
  • добавить тестовые данные

    • image-20210720150033094.png
    • image-20210720150200345.png
  • класс сущности

    • @Data
      public class Student {
          private Integer id;
          private String name;
          //需要关联一个老师类
          private Teacher teacher;
      }
      
    • @Data
      public class Teacher {
          private int id;
          private String name;
      }
      
  • Остальное можно согласовать с предыдущей статьей! Разнообразие способов выбрать из ~

Один, многие к одному

  • Во-первых, давайте опросим студентов как обычно и попробуем увидеть результаты:

    • public interface StudentMapper {
              List<Student> getStudent();
      }
      
    •     <select id="getStudent" resultType="Student">
              select * from student
          </select>
      
    •     @Test
          public void getStudent(){
              SqlSession session = MybatisUtils.getSession();
              StudentMapper mapper = session.getMapper(StudentMapper.class);
              List<Student> students = mapper.getStudent();
              students.forEach(student -> {
                  System.out.println(student);
              });
              session.close();
          }
      
  • Результаты:

    • image-20210730102419710.png
  • Результат очевиден, в запросе, если есть такой специальный вложенный класс, нормальный возврат равен нулю. Далее мы будем использовать вложенное отображение для решения этой проблемы.

①, вложенность запроса (подзапрос)

  • Примечание. Может быть только один resultMap и resultType. не может существовать одновременно.

  • Изменить файл mapper.xml

    •     <select id="getStudent" resultMap="Student">
              select * from student
          </select>
      
          <resultMap id="Student" type="com.dy.pojo.Student">
              <result property="id" column="id"></result>
              <result property="name" column="name"></result>
              <!--对象使用assiociation-->
              <!--集合用collection-->
              <association property="teacher" column="tid"
                           javaType="com.dy.pojo.Teacher"
                           select="getTeacher"></association>
          </resultMap>
      
          <select id="getTeacher" resultType="com.dy.pojo.Teacher">
              select * from teacher where id = #{tid};
          </select>
      
      
  • Результаты:

    • image-20210730103403595.png
    • image-20210730103654594.png
  • Хороший! Идеальное решение проблемы!

②, вложение результатов (запрос к объединенной таблице)

  • mapper.xml:

    •     <select id="getStudent2" resultMap="Student">        select s.id sid,s.name sname,t.name tname        from student s,teacher t where s.tid=t.id;    </select>    <resultMap id="Student" type="com.dy.pojo.Student">        <result property="id" column="sid"></result>        <result property="name" column="sname"></result>        <association property="teacher" javaType="com.dy.pojo.Teacher">            <result property="name" column="tname"></result>        </association>    </resultMap>
      
  • Результаты:

    • image-20210730105013436.png

Два, один ко многим

  • Основная предпосылка:

    • @Data@Alias("Teacher2")public class Teacher2 {    private int id;    private String name;    private List<Student1> studentList;}
      
    • @Datapublic class Student1 {    private Integer id;    private String name;    private int tid;}
      

    ①, вложение результатов (запрос к объединенной таблице)

    • mapper.xml

      •     <select id="getTeacher" resultMap="Teacher2">        select s.id sid, s.name sname, t.name tname, t.id tid        from student s, teacher t        where s.tid = t.id and t.id = #{id};    </select>    <resultMap id="Teacher2" type="com.dy.pojo2.Teacher2">        <result property="id" column="tid"></result>        <result property="name" column="tname"></result>        <!--集合中的泛型信息,我们用oftype获取-->        <collection property="studentList" ofType="com.dy.pojo2.Student1">            <result property="id" column="sid"></result>            <result property="name" column="sname"></result>        </collection>    </resultMap>
        
    • Результаты:

      • image-20210730112430923.png

②, вложенность запроса (подзапрос)

  • mapper.xml

    •     <select id="getTeacher2" resultMap="Teacher2">        select * from teacher where id = #{id}    </select>    <resultMap id="Teacher2" type="com.dy.pojo2.Teacher2">        <collection property="studentList" column="id" javaType="ArrayList"                    ofType="com.dy.pojo2.Student1"                    select="getStudentByTeacherId"></collection>    </resultMap>    <select id="getStudentByTeacherId" resultType="com.dy.pojo2.Student1">        select * from student where tid = #{id}    </select>
      
  • Результаты:

    • image-20210730112812602.png
  • Идеально!

3. Резюме

  • Ассоциация - ассоциация многие-к-одному

  • коллекция - коллекция один ко многим

  • javaType & ofType

    • JavaType используется для указания типа атрибута в объекте.
    • ofType сопоставляется с типами в списке, типы ограничений в дженериках
  • будь осторожен:

    • Обеспечьте читабельность sql, постарайтесь сделать так, чтобы его было легко понять
    • Если проблема не проста для устранения ошибок, используйте журнал
    • следует четко различать resultMap и resultType!

Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~

Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, пожалуйста, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрять блоггеров ~ хахах