文章目录

  • 1. 多对一
    • 1.1 在MySQL中创建student表、teacher表
    • 1.2 编写实体类
    • 1.3 编写接口
    • 1.4 编写接口对应的配置文件
    • 1.5 确定两个xml文件都绑定到了mybatis-config.xml的核心配置文件中
    • 1.6 编写测试类
  • 2. 一对多

1. 多对一

多个学生都关联同一个老师,以多个学生为中心

1.1 在MySQL中创建student表、teacher表

CREATE TABLE `teacher` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); CREATE TABLE `student` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,`student``student``user``teacher``tid` INT(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fktid` (`tid`),CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1'); 


1.2 编写实体类

Teacher类:

package com.zz.pojo;import lombok.Data;@Data
public class Teacher {private int id;private String name;
}

Student类:

package com.zz.pojo;import lombok.Data;@Data
public class Student {private int id;private String name;//学生关联老师private Teacher teacher;
}

1.3 编写接口

TeacherMapper 接口为空:

package com.zz.mapper;public interface TeacherMapper {}

StudentMapper 接口:
有得到student列表的方法

package com.zz.mapper;import com.zz.pojo.Student;import java.util.List;public interface StudentMapper {//获取所有学生及学生对应老师的信息List<Student> getStudents();
}

1.4 编写接口对应的配置文件

TeacherMapper.xml 为空:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zz.mapper.TeacherMapper"></mapper>

StudentMapper.xml 配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zz.mapper.StudentMapper"><!--获取所有学生及学生对应老师的信息:1. 获取所有学生的信息2. 获取所有学生的tid,然后再去老师表中查询这个id所对应的老师--><resultMap id="StudentTeacher" type="Student"><id property="id" column="sid"/><result property="name" column="sname"/><!--数据库中的tid是一个字段,而teacher是一个对象,所以不能使用result标签这是多对一的情况,采用association标签(关联) student表关联teacher表,且这个teacher对象是Teacher类型--><association property="teacher" javaType="Teacher"><id property="id" column="tid"/><result property="name" column="tname"/></association></resultMap><select id="getStudents" resultMap="StudentTeacher">select s.id sid,s.name sname,t.name tname,t.id tidFrom student s,teacher tWHERE s.tid=t.id</select>
</mapper>

1.5 确定两个xml文件都绑定到了mybatis-config.xml的核心配置文件中

采用扫描包的方法来绑定,就不用一个个分别绑定

 <mappers><!--通过扫描包来绑定--><package name="com.zz.mapper"/></mappers>

1.6 编写测试类

因为是多对一,采用学生绑定老师,所以编写学生对应的测试类
编写StudentMapperTest测试类

package com.zz.mapper;import com.zz.pojo.Student;import com.zz.utils.MyBatisUtils;import org.junit.Test;import java.util.List;public class StudentMapperTest {@Testpublic void testGetStudents(){StudentMapper mapper = MyBatisUtils.getSession().getMapper(StudentMapper.class);List<Student> students = mapper.getStudents();for (Student student : students) {System.out.println(student);}}
}

运行结果:

2. 一对多

通过老师获取学生,以老师为中心
步骤与上相同,在此只写与上面不同之处
(1)编写实体类

package com.zz.pojo;import lombok.Data;import java.util.List;@Data
public class Teacher {private int id;private String name;//老师对应多个学生 (包含:集合)private List<Student> students;
}
package com.zz.pojo;import lombok.Data;@Data
public class Student {private int id;private String name;private int tid;
}

(2)编写接口

package com.zz.mapper;import com.zz.pojo.Teacher;public interface TeacherMapper {//获取这个老师下的所有学生public Teacher getTeacher(int id);}

(3)编写接口的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zz.mapper.TeacherMapper"><resultMap id="TeacherStudent" type="Teacher"><id property="id" column="tid"/><result property="name" column="tname"/><!--如果是集合(包含关系)--><collection property="students" ofType="Student"><result property="id" column="sid"/><result property="name" column="sname"/><!--学生的tid就是老师的id--><result property="tid" column="tid"/></collection></resultMap><!--Teacher里有个list集合,所以不能使用resultType,采用resultMap--><select id="getTeacher" resultMap="TeacherStudent">select s.id sid,s.name sname,t.name tname,t.id tidFrom student s,teacher tWHERE s.tid=t.id and t.id=#{id}</select></mapper>

(4)编写测试类

package com.zz.mapper;import com.zz.pojo.Teacher;
import com.zz.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;public class TeacherMapperTest {@Testpublic void testGetTeacher(){SqlSession session = MyBatisUtils.getSession();TeacherMapper mapper = session.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher(1);System.out.println(teacher);}
}

运行结果:

总结:

  • 关联 - association 【多对一】
  • 集合 - collection 【一对多】
  • javaType & ofType
    javaType 用来指定实体类中属性的类型
    ofType 用来指定映射到List或者集合中的 pojo类型,泛型中的约束类型!

MyBatis(二)——多对一、一对多相关推荐

  1. MyBatis级联一对一与一对多

    1.概述 在一个人申请某些账号或者权限的时候,比如微信的认证流程. 会让你一步一步按要求输入,比如第一步:点击微信认证,第二步:认证联系人信息填写:最后一步:填写公众号名称.功能介绍.选择运营地区就. ...

  2. MyBatis二 MyBatis常见面试题

    一 MyBatis是什么? MyBatis是一款优秀的持久层框架,一个半ORM (对象关系映射)框架,它支持定制化SQL.存储过程以及高级映射.MyBatis避免了几乎所有的JDBC代码和手动设置参数 ...

  3. mybatis实现多对多关联查询(超详细版)

    mybatis实现多对多关联查询XML实现 ​ 在开发过程中,持久层架mybatis为我们封装了SQL操作,只需要提供相应的SQL语句即可查询出结果,若结合逆向工程插件便可免去写一些简单SQL的繁琐工 ...

  4. SpringBoot Mybatis解决使用PageHelper一对多分页问题

    SpringBoot Mybatis解决使用PageHelper一对多分页问题 参考文章: (1)SpringBoot Mybatis解决使用PageHelper一对多分页问题 (2)https:// ...

  5. mybatis(二)xml配置文件详细说明

    目录 文章目录 mybatis(二)xml配置方式详细说明 2.1.使用properties配置属性 2.1.1.引入外部properties文件或在properties标签内定义属性 2.1.1.1 ...

  6. mybatis映射 一对一、一对多、多对多高级映射

    1.数据库执行脚本 创建数据库表代码:   1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(3 ...

  7. mybatis关联查询之一对多,多对一,以及多对多

    一.使用IDEA新建maven工程 二.引入mybatis以及相关的jar <!--版本仅供参考--><dependencies><dependency><g ...

  8. mybatis关联 多对多,一对多,多对一的编写

    1. 准备 数据库 以及数据 /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.23 : Database - test ***************** ...

  9. MyBatis使用ResultMap处理一对多多对一

    出现下列情况: 员工表Emp和部门表Dept是多对一的关系,员工实体类中有Dept这个属性, 但是多表连接查询的时候只能查出Dept这张表的did和dname,无法和Dept这个属性进行关联, 此时若 ...

最新文章

  1. 通过jQuery调用ASP.NET的AJAX
  2. 乐视视频 App 图标改为“欠 122 亿”,网友:我在别家分红包,却在你家随份子!...
  3. 混合SSVEP-P300 BCI生产双频SSVEP
  4. pyspark AttributeError: 'NoneType' object has no attribute 'setCallSite'
  5. K8S报错:controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252
  6. junit junit_JSON的JUnit Hamcrest Matcher
  7. ubuntu使用root权限登录的设置方法
  8. Win32动态库 Lib文件哪去了
  9. php本地文件打包代码,PHP实战:几行代码轻松实现PHP文件打包下载zip
  10. 2-1:C++快速入门之命名空间
  11. linux jsp连接mysql_Linux JSP连接MySQL数据库
  12. Oracle 11g 使用RMAN备份数据库
  13. Java比较两个对象属性值变化情况,用于记录日志使用
  14. 工作一两年后 ,你会选择什么样的公司?
  15. atitit  opencv apiattilax总结 约500个函数 .xlsx
  16. Turbo码(Turbo Codes)
  17. Java性能调优实战-怎样才能做好性能调优?
  18. 考虑实时安全优化的自学习自适应交通信号控制
  19. python interface_面向对象编程语言中的接口(Interface)
  20. Java语言十五讲(总结)

热门文章

  1. python 遍历_Python手撕广度优先遍历
  2. AtCoder AGC001D Arrays and Palindrome (构造)
  3. java final域_final域_鲲鹏通用_TaiShan服务器代码移植参考_Java同步原语_华为云
  4. android textview 文字居中_Android布局优化,看这3点就够了
  5. 计算机三级网络技术知识点大纲,全国计算机等级考试三级网络技术考试大纲(2019年版)...
  6. 2021-07-01 和的平方与平方的和
  7. 九、Node.js中文乱码问题
  8. hdu 2098 分拆素数和(一个偶数拆分成两个不同素数和 拆法数量)
  9. BZOJ 1293 [SCOI2009]生日礼物
  10. 【BZOJ3172】单词(AC自动机)