• Mybatis-多表操作


    • 目录

      多表模型分类(回顾):

      一对一的数据准备

      一对一的功能实现

      一对多的数据准备

      一对多的功能实现

      多对多的数据准备

      多对多的功能实现


    • 之前学习的都是基于单表操作的
    • 而实际开发中,随着业务难度的加深,肯定需要多表操作的
    • 多表模型分类(回顾):

    • 一对一:
    • 在任意一方建立外键,关联对方的主键
    • 一对多:
    • 在多的一方建立外键,关联一的一方的主键
    • 多对多:
    • 借助中间表,中间表至少两个字段,分别关联两张表的主键
    • 一对一的数据准备

    • 一对一模型:人和身份证,一个人只有一个身份证
    • 环境准备
      1. CREATE TABLE person(
      2. id INT PRIMARY KEY auto_increment,
      3. name VARCHAR(30),
      4. age INT
      5. );
      6. INSERT INTO person VALUES (NULL,'张三',23),(NULL,'李四',24),(NULL,'王五',25);
      7. CREATE TABLE card(
      8. id INT PRIMARY KEY auto_increment,
      9. number VARCHAR(30),
      10. pid INT,
      11. CONSTRAINT kk FOREIGN KEY (pid) REFERENCES person(id)
      12. );
      13. INSERT INTO card VALUES (NULL,'12345',1),(NULL,'23456',2),(NULL,'34567',3);
      1. package demo4.bean;
      2. public class Person {
      3. private Integer id; //主键id
      4. private String name; //人的姓名
      5. private Integer age; //人的年龄
      6. public Person() {
      7. }
      8. public Person(Integer id, String name, Integer age) {
      9. this.id = id;
      10. this.name = name;
      11. this.age = age;
      12. }
      13. public Integer getId() {
      14. return id;
      15. }
      16. public void setId(Integer id) {
      17. this.id = id;
      18. }
      19. public String getName() {
      20. return name;
      21. }
      22. public void setName(String name) {
      23. this.name = name;
      24. }
      25. public Integer getAge() {
      26. return age;
      27. }
      28. public void setAge(Integer age) {
      29. this.age = age;
      30. }
      31. @Override
      32. public String toString() {
      33. return "Person{" +
      34. "id=" + id +
      35. ", name='" + name + '\'' +
      36. ", age=" + age +
      37. '}';
      38. }
      39. }
      1. package demo4.bean;
      2. public class Card {
      3. private Integer id; //主键id
      4. private String number; //身份证号
      5. private Person p; //所属人的对象
      6. public Card() {
      7. }
      8. public Card(Integer id, String number, Person p) {
      9. this.id = id;
      10. this.number = number;
      11. this.p = p;
      12. }
      13. public Integer getId() {
      14. return id;
      15. }
      16. public void setId(Integer id) {
      17. this.id = id;
      18. }
      19. public String getNumber() {
      20. return number;
      21. }
      22. public void setNumber(String number) {
      23. this.number = number;
      24. }
      25. public Person getP() {
      26. return p;
      27. }
      28. public void setP(Person p) {
      29. this.p = p;
      30. }
      31. @Override
      32. public String toString() {
      33. return "Card{" +
      34. "id=" + id +
      35. ", number='" + number + '\'' +
      36. ", p=" + p +
      37. '}';
      38. }
      39. }
      1. <typeAliases>
      2. <package name="demo4.bean"/>
      3. typeAliases>
    • 一对一的功能实现

    • 配置字段和对象属性的映射关系标签
    • id属性:唯一标识
    • type属性:实体对象类型
    • 配置主键映射关系标签
    • property属性:实体对象变量名称
    • 配置非主键映射关系标签
    • column属性:表中字段名称
    • property属性:实体对象变量名称
    • 配置被包含对象的映射关系标签
    • property属性:被包含对象的变量名
    • javaType属性:被包含对象的数据类型
    • 创建一个包,用于存放对应映射配置文件
      1. mapper
      2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      4. <mapper namespace="demo4.table01.OneToOneMapper">
      5. <resultMap id="OneToOne" type="card">
      6. <id column="cid" property="id"/>
      7. <result column="number" property="number"/>
      8. <association property="p" javaType="person">
      9. <id column="pid" property="id"/>
      10. <result column="name" property="name"/>
      11. <result column="age" property="age"/>
      12. association>
      13. resultMap>
      14. <select id="selectAll" resultMap="OneToOne">
      15. SELECT c.id cid,number,pid,name,age FROM card c,person p WHERE c.pid=p.id
      16. select>
      17. mapper>
      1. <mappers>
      2. <mapper resource="demo4/one_to_one/OneToOneMapper.xml"/>
      3. mappers>
    • 再创建一个包用于存放对应的映射接口以及测试类并测试
      1. public interface OneToOneMapper {
      2. //查询全部
      3. public abstract List selectAll();
      4. }
      1. public class Test01 {
      2. @Test
      3. public void selectAll() throws Exception{
      4. //1.加载核心配置文件
      5. InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");
      6. //2.获取SqlSession工厂对象
      7. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
      8. //3.通过工厂对象获取SqlSession
      9. SqlSession sqlSession = sqlSessionFactory.openSession(true);
      10. //4.获取StudentMapper接口的实现类对象
      11. OneToOneMapper mapper = sqlSession.getMapper(OneToOneMapper.class);
      12. //5.调用实现类的方法,接收结果
      13. List list = mapper.selectAll();
      14. //6.处理结果
      15. for(Card c : list){
      16. System.out.println(c);
      17. }
      18. //7.释放资源
      19. sqlSession.close();
      20. is.close();
      21. }
      22. }
    • 一对多的数据准备

    • 一对多模型:班级和学生,一个班级可以有多个学生
    • 环境准备
      1. CREATE TABLE classes(
      2. id INT PRIMARY KEY auto_increment,
      3. name VARCHAR(30)
      4. );
      5. INSERT INTO classes VALUES (NULL,'一班'),(NULL,'二班');
      6. CREATE TABLE student(
      7. id INT PRIMARY KEY auto_increment,
      8. name VARCHAR(30),
      9. age INT,
      10. cid INT,
      11. CONSTRAINT kkk FOREIGN KEY (cid) REFERENCES classes(id)
      12. );
      13. INSERT INTO student VALUES (NULL,'张三',23,1),(NULL,'李四',24,1),(NULL,'王五',25,2),(NULL,'赵六',26,2);
      1. public class Classes {
      2. private Integer id; //主键id
      3. private String name; //班级名称
      4. private List students;//班级中所有学生对象
      5. public Classes() {
      6. }
      7. public Classes(Integer id, String name, List students) {
      8. this.id = id;
      9. this.name = name;
      10. this.students = students;
      11. }
      12. public Integer getId() {
      13. return id;
      14. }
      15. public void setId(Integer id) {
      16. this.id = id;
      17. }
      18. public String getName() {
      19. return name;
      20. }
      21. public void setName(String name) {
      22. this.name = name;
      23. }
      24. public List getStudents() {
      25. return students;
      26. }
      27. public void setStudents(List students) {
      28. this.students = students;
      29. }
      30. @Override
      31. public String toString() {
      32. return "Classes{" +
      33. "id=" + id +
      34. ", name='" + name + '\'' +
      35. ", students=" + students +
      36. '}';
      37. }
      38. }
      1. public class Student {
      2. private Integer id; //主键id
      3. private String name;//学生姓名
      4. private Integer age;//学生年龄
      5. public Student() {
      6. }
      7. public Student(Integer id, String name, Integer age) {
      8. this.id = id;
      9. this.name = name;
      10. this.age = age;
      11. }
      12. public Integer getId() {
      13. return id;
      14. }
      15. public void setId(Integer id) {
      16. this.id = id;
      17. }
      18. public String getName() {
      19. return name;
      20. }
      21. public void setName(String name) {
      22. this.name = name;
      23. }
      24. public Integer getAge() {
      25. return age;
      26. }
      27. public void setAge(Integer age) {
      28. this.age = age;
      29. }
      30. @Override
      31. public String toString() {
      32. return "Student{" +
      33. "id=" + id +
      34. ", name='" + name + '\'' +
      35. ", age=" + age +
      36. '}';
      37. }
      38. }
    • 一对多的功能实现

    • 配置字段和对象属性的映射关系标签
    • id属性:唯一标识
    • type属性:实体对象类型
    • 配置主键映射关系标签
    • property属性:实体对象变量名称
    • 配置非主键映射关系标签
    • column属性:表中字段名称
    • property属性:实体对象变量名称
    • 配置被包含集合对象的映射关系标签
    • property属性:被包含集合对象的变量名
    • ofType属性:集合中保存的对象数据类型
    • 创建一个包,用于存放对应映射配置文件
      1. mapper
      2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      4. <mapper namespace="demo4.table02.OneToManyMapper">
      5. <resultMap id="OneToMany" type="classes">
      6. <id column="cid" property="id"/>
      7. <result column="cname" property="name"/>
      8. <collection property="students" ofType="student">
      9. <id column="sid" property="id"/>
      10. <result column="sname" property="name"/>
      11. <result column="sage" property="age"/>
      12. collection>
      13. resultMap>
      14. <select id="selectAll" resultMap="OneToMany">
      15. SELECT c.id cid,c.name cname,s.id sid,s.name sname,s.age sage FROM classes c,student s WHERE c.id=s.cid
      16. select>
      17. mapper>
      1. <mappers>
      2. <mapper resource="demo4/one_to_one/OneToOneMapper.xml"/>
      3. <mapper resource="demo4/one_to_many/OneToManyMapper.xml"/>
      4. mappers>
    • 再创建一个包用于存放对应的映射接口以及测试类
      1. public interface OneToManyMapper {
      2. //查询全部
      3. public abstract List selectAll();
      4. }
      1. @Test
      2. public void selectAll() throws Exception {
      3. //1.加载核心配置文件
      4. InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");
      5. //2.获取SqlSession工厂对象
      6. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
      7. //3.通过工厂对象获取SqlSession
      8. SqlSession sqlSession = sqlSessionFactory.openSession(true);
      9. //4.获取OneToManyMapper接口的实现类对象
      10. OneToManyMapper mapper = sqlSession.getMapper(OneToManyMapper.class);
      11. //5.调用实现类的方法,接收结果
      12. List classes = mapper.selectAll();
      13. //6.处理结果
      14. for(Classes cls : classes){
      15. System.out.println(cls.getId()+","+cls.getName());
      16. List students = cls.getStudents();
      17. for(Student student : students){
      18. System.out.println("\t"+student);
      19. }
      20. }
      21. //7.释放资源
      22. sqlSession.close();
      23. is.close();
      24. }
    • 多对多的数据准备

    • 多对多模型:学生和课程,一个学生可以选择多门课程,一个课程也可以被多个学生所选择
    • 环境准备(沿用上次的student表略微改动)
      1. CREATE TABLE course(
      2. id INT PRIMARY KEY auto_increment,
      3. name VARCHAR(30)
      4. );
      5. INSERT INTO course VALUES (NULL,'语文'),(NULL,'数学');
      6. CREATE TABLE stu_cr(
      7. id INT PRIMARY KEY auto_increment,
      8. sid INT,
      9. cid INT,
      10. CONSTRAINT kk_1 FOREIGN KEY (sid) REFERENCES student(id),
      11. CONSTRAINT kk_2 FOREIGN KEY (cid) REFERENCES course(id)
      12. );
      13. INSERT INTO stu_cr VALUES (NULL,1,1),(NULL,1,2),(NULL,2,1),(NULL,2,2);
      1. public class Course {
      2. private Integer id; //主键id
      3. private String name; //课程名称
      4. public Course() {
      5. }
      6. public Course(Integer id, String name) {
      7. this.id = id;
      8. this.name = name;
      9. }
      10. public Integer getId() {
      11. return id;
      12. }
      13. public void setId(Integer id) {
      14. this.id = id;
      15. }
      16. public String getName() {
      17. return name;
      18. }
      19. public void setName(String name) {
      20. this.name = name;
      21. }
      22. @Override
      23. public String toString() {
      24. return "Course{" +
      25. "id=" + id +
      26. ", name='" + name + '\'' +
      27. '}';
      28. }
      29. }
      1. public class Student {
      2. private Integer id; //主键id
      3. private String name;//学生姓名
      4. private Integer age;//学生年龄
      5. private List courses;//学生所选择的课程集合
      6. public Student() {
      7. }
      8. public Student(Integer id, String name, Integer age, List courses) {
      9. this.id = id;
      10. this.name = name;
      11. this.age = age;
      12. this.courses = courses;
      13. }
      14. public Integer getId() {
      15. return id;
      16. }
      17. public void setId(Integer id) {
      18. this.id = id;
      19. }
      20. public String getName() {
      21. return name;
      22. }
      23. public void setName(String name) {
      24. this.name = name;
      25. }
      26. public Integer getAge() {
      27. return age;
      28. }
      29. public void setAge(Integer age) {
      30. this.age = age;
      31. }
      32. public List getCourses() {
      33. return courses;
      34. }
      35. public void setCourses(List courses) {
      36. this.courses = courses;
      37. }
      38. @Override
      39. public String toString() {
      40. return "Student{" +
      41. "id=" + id +
      42. ", name='" + name + '\'' +
      43. ", age=" + age +
      44. ", courses=" + courses +
      45. '}';
      46. }
      47. }
    • 多对多的功能实现

    • 配置字段和对象属性的映射关系标签
    • id属性:唯一标识
    • type属性:实体对象类型
    • 配置主键映射关系标签
    • property属性:实体对象变量名称
    • 配置非主键映射关系标签
    • column属性:表中字段名称
    • property属性:实体对象变量名称
    • 配置被包含集合对象的映射关系标签
    • property属性:被包含集合对象的变量名
    • ofType属性:集合中保存的对象数据类型
    • 创建一个包,用于存放对应映射配置文件
      1. mapper
      2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      4. <mapper namespace="demo4.table03.ManyToManyMapper">
      5. <resultMap id="ManyToMany" type="student">
      6. <id column="sid" property="id"/>
      7. <result column="sname" property="name"/>
      8. <result column="sage" property="age"/>
      9. <collection property="courses" ofType="course">
      10. <id column="cid" property="id"/>
      11. <result column="cname" property="name"/>
      12. collection>
      13. resultMap>
      14. <select id="selectAll" resultMap="ManyToMany">
      15. SELECT sc.sid,s.name sname,s.age sage,sc.cid,c.name cname FROM student s,course c,stu_cr sc WHERE sc.sid=s.id AND sc.cid=c.id
      16. select>
      17. mapper>
      1. <mappers>
      2. <mapper resource="demo4/one_to_one/OneToOneMapper.xml"/>
      3. <mapper resource="demo4/one_to_many/OneToManyMapper.xml"/>
      4. <mapper resource="demo4/many_to_many/ManyToManyMapper.xml"/>
      5. mappers>
    • 再创建一个包用于存放对应的映射接口以及测试类
      1. public interface ManyToManyMapper {
      2. //查询全部
      3. public abstract List selectAll();
      4. }
      1. @Test
      2. public void selectAll() throws Exception {
      3. //1.加载核心配置文件
      4. InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");
      5. //2.获取SqlSession工厂对象
      6. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
      7. //3.通过工厂对象获取SqlSession
      8. SqlSession sqlSession = sqlSessionFactory.openSession(true);
      9. //4.获取ManyToManyMapper接口的实现类对象
      10. ManyToManyMapper mapper = sqlSession.getMapper(ManyToManyMapper.class);
      11. //5.调用实现类的方法,接收结果
      12. List students = mapper.selectAll();
      13. //6.处理结果
      14. for (Student student : students) {
      15. System.out.println(student.getId()+","+student.getName()+","+student.getAge());
      16. List courses = student.getCourses();
      17. for(Course course : courses){
      18. System.out.println("\t"+course);
      19. }
      20. }
      21. //7.释放资源
      22. sqlSession.close();
      23. is.close();
      24. }
  • 相关阅读:
    深入浅出-多进程编程
    linux之管道符详解
    直播间自动点赞第一章:MouseEvent 实现根据坐标X,Y自动点击浏览器的效果
    独立站必看攻略
    猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#
    strlen函数使用与模拟实现【进阶版】
    BSAD检验比特币泡沫生成的时间点
    〈西游记〉中所有插曲、主题曲
    优炫数据库获“2022能源企业信息化产品技术创新”案例
    15:00面试,15:08就出来了,问的问题有点变态。。。
  • 原文地址:https://blog.csdn.net/weixin_59624686/article/details/126209106