11.一对多处理

11.一对多处理

比如:一个老师拥有多个学生

对老师而言,就是一对多关系!

11.2环境搭建

参考多对一环境搭建

11.3.代码分析

11.3.1实体类

Student

@Data
public class Student {
    public int id;
    public String name;
    public int tid;

}

Teacher

@Data
public class Teacher {
    public int id;
    public String name;
    //老师的集合内包含学生
    public List<Student> students;
}

11.3.2TeacherMapper

根据结果嵌套处理

<!--根据结果嵌套处理-->
    <select id="getTeacher" resultMap="TeacherStudent">
        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 = #{tid}
    </select>
    <resultMap id="TeacherStudent" type="teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <!--简单的属性 property:实体类的属性 column:数据库中的字段
        javaType:是一个指定的属性类型
        ofType:集合中的泛型信息
        -->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>

根据查询嵌套处理

<!--按照查询嵌套处理-->
    <select id="getTeacher2" resultMap="TeacherStudent2">
        select * from mybatis.teacher where id = #{tid}
    </select>
    <resultMap id="TeacherStudent2" type="Teacher">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="students" javaType="ArrayList" ofType="Student"
                    select="getStudentByTeacherId" column="id"
        />
    </resultMap>

    <resultMap id="Student" type="Student"/>
    <select id="getStudentByTeacherId" resultMap="Student">
        select * from student where tid = #{tid}
    </select>

查询嵌套问题心得:

那里是id的而不是tid的原因,本人是这样理解的,此查询主要是通过查询老师信息以及老师这个集合内学生的信息,学生内的tid(其实与老师的id【通过主键设置】是一样的),故实质上column所返回的是老师的id(根据快捷键查看接口也能发现id跳转到了老师的实体类中)

 

11.3.3测试类

public class MyTest {
    //结果嵌套一对多测试
    @Test
    public void getTeacher(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);
        sqlSession.close();
    }
    //查询嵌套一对多测试
    @Test
    public void getTeacher2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher2 = mapper.getTeacher2(1);
        System.out.println(teacher2);
        sqlSession.close();
    }
}

IDEA快捷键读取底层源码

使用IDEA读取底层源码的快捷键集合

自己常用的两种方式:

如果是看接口的底层,就用ctrl+alt

如果是看其他的底层,就双击锁定,然后两下shift即可

如果看继承树,ctrl+h

小结

  • 关联——association【多对一】
  • 集合——collection【一对多】
  • javaType & ofType

1.javaType 用来指定实体类中属性的类型

2.ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!

注意点:

  • 保证sql的可读性,尽量保证通俗易懂
  • 注意一对多和多对一中,属性名和字段的问题
  • 如果问题不好排查错误,可以使用日志,建议使用Log4j【基本的一般够用了】

避免慢SQL 别人用1s,你用1000s

面试高频:

  • Mysql引擎
  • InnoDB底层原理
  • 索引
  • 索引优化
posted @ 2022-10-27 19:09  It小飞呀  阅读(25)  评论(0编辑  收藏  举报