Mybatis学习笔记——day05

我不是女神ヾ 2022-12-30 15:58 296阅读 0赞

文章目录

  • Mybatis
    • 10、多对一处理
      • 10.1测试环境搭建
      • 10.2按照查询嵌套处理
      • 10.3按照结果嵌套处理
    • 11、一对多处理
      • 11.1环境搭建
      • 11.2按照结果嵌套处理
      • 11.3按照查询嵌套处理
      • 小结

Mybatis

参考视频:B站狂神,写这个只是方便个人复习,怎么写是我自己的事,我能看懂就行,没要求非要让你看!白嫖还挑刺,是很没有风度的事情。希望做个有风度的“五好青年”!


10、多对一处理

多对一:

在这里插入图片描述

  • 多个学生,对应一个老师
  • 对于学生这边而言, 关联 … 多个学生,关联一个老师 【多对一】
  • 对于老师而言, 集合 , 一个老师,有很多学生 【一对多】

在这里插入图片描述

SQL:

  1. CREATE TABLE `teacher` ( `id` INT ( 10 ) NOT NULL, `name` VARCHAR ( 30 ) DEFAULT NULL, PRIMARY KEY ( `id` ) ) ENGINE = INNODB DEFAULT CHARSET = utf8;
  2. INSERT INTO teacher ( `id`, `name` )
  3. VALUES
  4. ( 1, '秦老师' );
  5. CREATE TABLE `student` (
  6. `id` INT ( 10 ) NOT NULL,
  7. `name` VARCHAR ( 30 ) DEFAULT NULL,
  8. `tid` INT ( 10 ) DEFAULT NULL,
  9. PRIMARY KEY ( `id` ),
  10. KEY `fktid` ( `tid` ),
  11. CONSTRAINT `fktid` FOREIGN KEY ( `tid` ) REFERENCES `teacher` ( `id` )
  12. ) ENGINE = INNODB DEFAULT CHARSET = utf8;
  13. INSERT INTO `student` ( `id`, `name`, `tid` )
  14. VALUES
  15. ( '1', '小明', '1' );
  16. INSERT INTO `student` ( `id`, `name`, `tid` )
  17. VALUES
  18. ( '2', '小红', '1' );
  19. INSERT INTO `student` ( `id`, `name`, `tid` )
  20. VALUES
  21. ( '3', '小张', '1' );
  22. INSERT INTO `student` ( `id`, `name`, `tid` )
  23. VALUES
  24. ( '4', '小李', '1' );
  25. INSERT INTO `student` ( `id`, `name`, `tid` )
  26. VALUES
  27. ( '5', '小王', '1' );

10.1测试环境搭建

  1. 导入lombok
  2. 新建实体类 Teacher,Student
  3. 建立Mapper接口
  4. 建立Mapper.XML文件
  5. 在核心配置文件中绑定注册我们的Mapper接口或者文件!【方式很多,随心选】
  6. 测试查询是否能够成功!

在这里插入图片描述

10.2按照查询嵌套处理

  • StudentMapper接口

    package com.github.subei.dao;

    import com.github.subei.pojo.Student;

    import java.util.List;

    public interface StudentMapper {

    1. // 查询所有的学生的信息,以及对应老师的信息
    2. public List<Student> getStudent();

    }

  • StudentMapper.xml文件

    <?xml version=”1.0” encoding=”UTF-8” ?>
    <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd">





  • 测试类

    import com.github.subei.dao.StudentMapper;
    import com.github.subei.dao.TeacherMapper;
    import com.github.subei.pojo.Student;
    import com.github.subei.pojo.Teacher;
    import com.github.subei.utils.MybatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;

    import java.util.List;

    public class MyTest {

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

    }

在这里插入图片描述

  • 修改xml文件

    <?xml version=”1.0” encoding=”UTF-8” ?>
    <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd">
















在这里插入图片描述

10.3按照结果嵌套处理

  1. <!--按照结果嵌套处理-->
  2. <select id="getStudent2" resultMap="StudentTeacher2">
  3. select s.id sid,s.name sname,t.name tname
  4. from student s,teacher t
  5. where s.tid = t.id;
  6. </select>
  7. <resultMap id="StudentTeacher2" type="Student">
  8. <result property="id" column="sid"/>
  9. <result property="name" column="sname"/>
  10. <association property="teacher" javaType="Teacher">
  11. <result property="name" column="tname"/>
  12. </association>
  13. </resultMap>

在这里插入图片描述

回顾Mysql 多对一查询方式:

  • 子查询
  • 联表查询

11、一对多处理

  • 比如:一个老师拥有多个学生!
  • 对于老师而言,就是一对多的关系!

11.1环境搭建

  1. 环境搭建,和刚才一样。

在这里插入图片描述

实体类

  1. package com.github.subei.pojo;
  2. import lombok.Data;
  3. @Data
  4. public class Student {
  5. private int id;
  6. private String name;
  7. private int tid;
  8. }
  9. package com.github.subei.pojo;
  10. import lombok.Data;
  11. import java.util.List;
  12. @Data
  13. public class Teacher {
  14. private int id;
  15. private String name;
  16. // 一个老师拥有多个学生
  17. private List<Student> students;
  18. }
  • 测试一下,编写TeacherMapper接口

    package com.github.subei.dao;

    import com.github.subei.pojo.Teacher;

    import java.util.List;

    public interface TeacherMapper {

    1. // 获取老师
    2. List<Teacher> getTeacher();

    }

  • 编写xml文档

    <?xml version=”1.0” encoding=”UTF-8” ?>
    <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd">




  • 编写测试文档

    import com.github.subei.dao.TeacherMapper;
    import com.github.subei.pojo.Teacher;
    import com.github.subei.utils.MybatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;

    import java.util.List;

    public class MyTest {

    1. @Test
    2. public void FTest(){
    3. SqlSession sqlSession = MybatisUtils.getSqlSession();
    4. TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    5. List<Teacher> teacherList = mapper.getTeacher();
    6. for (Teacher teacher : teacherList){
    7. System.out.println(teacher);
    8. }
    9. sqlSession.close();
    10. }

    }

在这里插入图片描述

11.2按照结果嵌套处理

  • 修改接口文档

    package com.github.subei.dao;

    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;

    import com.github.subei.pojo.Teacher;

    import java.util.List;

    public interface TeacherMapper {

    1. // 获取老师

    // List getTeacher();

    1. // 获取指定老师下的所有的学生及老师信息
    2. Teacher getTeacher(@Param("tid") int id);

    }

  • 修改xml文档

    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. <!--复杂的属性,需要单独处理 对象: association 集合: collection javaType="" 指定属性的类型! 集合中的泛型信息,我们使用ofType获取 -->
    10. <collection property="students" ofType="Student">
    11. <result property="id" column="sid"/>
    12. <result property="name" column="sname"/>
    13. <result property="tid" column="tid"/>
    14. </collection>
    15. </resultMap>
  • 测试文档

    import com.github.subei.dao.TeacherMapper;
    import com.github.subei.pojo.Teacher;
    import com.github.subei.utils.MybatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;

    import java.util.List;

    public class MyTest {

    1. @Test
    2. public void FTest(){
    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. }

    }

在这里插入图片描述

11.3按照查询嵌套处理

  1. Teacher getTeacher2(@Param("tid") int id);
  2. <select id="getTeacher2" resultMap="TeacherStudent2">
  3. select * from mybatis.teacher where id = #{tid}
  4. </select>
  5. <resultMap id="TeacherStudent2" type="Teacher">
  6. <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
  7. </resultMap>
  8. <select id="getStudentByTeacherId" resultType="Student">
  9. select * from mybatis.student where tid = #{tid}
  10. </select>
  11. @Test
  12. public void TTest(){
  13. SqlSession sqlSession = MybatisUtils.getSqlSession();
  14. TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
  15. Teacher teacher = mapper.getTeacher2(1);
  16. System.out.println(teacher);
  17. sqlSession.close();
  18. }

在这里插入图片描述

小结

  1. 关联 - association 【多对一】
  2. 集合 - collection 【一对多】
  3. javaType & ofType

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

注意点:

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

面试高频:

  • Mysql引擎
  • InnoDB底层原理
  • 索引
  • 索引优化!

发表评论

表情:
评论列表 (有 0 条评论,296人围观)

还没有评论,来说两句吧...

相关阅读