• 多对一和一对多的处理P21,P22


    多对一:

    按照查询嵌套处理:

    StudentMapper:(接口很简单需要返回一个List)

    1. package com.Li.dao;
    2. import com.Li.pojo.Student;
    3. import org.apache.ibatis.annotations.Select;
    4. import java.util.List;
    5. public interface StudentMapper {
    6. //查询所有学生的信息,以及对应的老师的信息.难点在于写出对的sql
    7. public List getStudent();
    8. }

    StudentMapper.xml:(难点:嵌套查询,association是对对象的处理,相当于查询了两次之后拼接在了一起)

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.Li.dao.StudentMapper">
    6. <select id="getStudent" resultMap="StudentTeacher">
    7. select * from mybatis.student
    8. select>
    9. <resultMap id="StudentTeacher" type="Student">
    10. <result property="id" column="id"/>
    11. <result property="name" column="name"/>
    12. <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    13. resultMap>
    14. <select id="getTeacher" resultType="Teacher">
    15. select * from mybatis.teacher where id = #{id}
    16. select>
    17. mapper>

    测试类增加的内容:

    1. @Test
    2. public void testStudent(){
    3. SqlSession sqlSession = MybatisUtils.getSqlSession();
    4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
    5. List studentList = mapper.getStudent();
    6. for (Student student : studentList) {
    7. System.out.println(student);
    8. }
    9. sqlSession.close();
    10. }

     成功!

    按照结果嵌套处理:

    第二种方式的接口:

    public List getStudent2();

    StudentMapper.xml:详解可以看里面的注释。

    1. "StudentTeacher2" type="Student">
    2. "id" column="sid"/>
    3. "name" column="sname"/>
    4. "teacher" javaType="Teacher">
    5. "name" column="tname"/>

    在这里做一个小小的修改就可以测试了。

     成功!

    个人感觉第二种方式比较易于理解,并且方便使用。

    如果第一种方式要连接5个表的话,还需要多写5个select分散的语句再将他们连起来。

    在做一件事的时候一定是分工明确的。sql就写sql,对应关系就搞对应关系,分工明确。实现高内聚。这样分块之后,可读性强,而且易于修改。

    问题:我没有查询老师的id为什么结果会有老师的id???

    这两种对应两种sql查询方式:

    子查询

    联表查询

    一对多:

    配置基础环境:很简单。

     创建moudule之后,复制06的这几个内容。pom.xml只需要导入一个lombox包就OK了

     修改实体类,变为一对多。以下分别是Student和Teacher

    1. package com.Li.pojo;
    2. import lombok.Data;
    3. @Data
    4. public class Student {
    5. private int id;
    6. private String name;
    7. private int tid;
    8. }
    1. package com.Li.pojo;
    2. import lombok.Data;
    3. import java.util.List;
    4. @Data
    5. public class Teacher {
    6. private int id;
    7. private String name;
    8. //一个老师拥有多个学生
    9. private List students;
    10. }

    编写这个

    这个方式是我最喜欢的处理方式。

    1. <select id="getTeacher" resultMap="TeacherStudent">
    2. SELECT s.id sid,s.name sname,t.name tname,t.id,tid
    3. from student s,teacher t
    4. where s.tid = t.id and t.id = #{tid}
    5. select>
    6. <resultMap id="TeacherStudent" type="Teacher">
    7. <result property="id" column="tid"/>
    8. <result property="name" column="tname"/>
    9. <collection property="students" ofType="Student">
    10. <result property="id" column="sid"/>
    11. <result property="name" column="sname"/>
    12. <result property="tid" column="tid"/>
    13. collection>
    14. resultMap>

    注意看注释的内容。里面有解析。

    创建测试文件:

    1. @Test
    2. public void Test(){
    3. SqlSession sqlSession = MybatisUtils.getSqlSession();
    4. TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    5. Teacher teacher = mapper.getTeacher(1);
    6. System.out.println(teacher);
    7. sqlSession.close();
    8. }

    测试成功!

     第二种方式:(个人不推荐)

    接口代码:

    1. //子查询的方式实现
    2. Teacher getTeacher2(@Param("tid") int id);

     TeacherMapper.xml:

    1. <select id="getTeacher2" resultMap="TeacherStudent2">
    2. select * from mybatis.teacher where id = #{tid}
    3. select>
    4. <resultMap id="TeacherStudent2" type="Teacher">
    5. <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
    6. resultMap>
    7. <select id="getStudentByTeacherId" resultType="Student">
    8. select * from mybatis.student where tid = #{tid}
    9. select>

    测试代码:

     

    1. @Test
    2. public void Test2(){
    3. SqlSession sqlSession = MybatisUtils.getSqlSession();
    4. TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    5. Teacher teacher = mapper.getTeacher2(1);
    6. System.out.println(teacher);
    7. sqlSession.close();
    8. }

    成功!

    小结:

    javaType:实体类中属性的类型。也就是参数的数据类型

    ofType:泛型中才会出现。值为泛型中的数据类型。如List<某某某>,那么ofType的值就是某某某。

    面试高频:

    • Mysql引擎
    • InnoDB底层原理
    • 索引
    • 索引优化
  • 相关阅读:
    机器学习 逻辑回归(1)二分类
    Gson遇上 Java泛型类型擦除
    【翻译】分布式系统
    use embeddings stored in vector db to reduce work for LLM generating response
    ComSec作业四:Diffie-Hellman
    Linux计划任务管理,网络管理
    蒙特卡洛树搜索(Monte Carlo Tree Search)揭秘
    IEDA代码模板
    一文搞定防盗链设计
    Spring和Netty整合详解
  • 原文地址:https://blog.csdn.net/m0_54842832/article/details/127774271