Статьи по Теме
Краткое содержание серии MyBatis:Серия MyBatis
предисловие
-
Сначала посмотрите на официальный сайт для описания набора результатов
-
Обычно чаще всего мы используем результат, но на практике мы можем столкнуться со сложными типами ассоциаций! В это время необходимо использовать
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
-
-
добавить тестовые данные
-
класс сущности
-
@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(); }
-
-
Результаты:
-
Результат очевиден, в запросе, если есть такой специальный вложенный класс, нормальный возврат равен нулю. Далее мы будем использовать вложенное отображение для решения этой проблемы.
①, вложенность запроса (подзапрос)
-
Примечание. Может быть только один 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>
-
-
Результаты:
-
Хороший! Идеальное решение проблемы!
②, вложение результатов (запрос к объединенной таблице)
-
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>
-
-
Результаты:
Два, один ко многим
-
Основная предпосылка:
-
@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>
-
-
Результаты:
-
②, вложенность запроса (подзапрос)
-
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>
-
-
Результаты:
-
Идеально!
3. Резюме
-
Ассоциация - ассоциация многие-к-одному
-
коллекция - коллекция один ко многим
-
javaType & ofType
- JavaType используется для указания типа атрибута в объекте.
- ofType сопоставляется с типами в списке, типы ограничений в дженериках
-
будь осторожен:
- Обеспечьте читабельность sql, постарайтесь сделать так, чтобы его было легко понять
- Если проблема не проста для устранения ошибок, используйте журнал
- следует четко различать resultMap и resultType!
Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~
Если вы думаете, что я блогеры хорошо пишу! Писать нелегко, пожалуйста, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрять блоггеров ~ хахах