MyBatis-一对多及多对一处理

多对一及一对多处理

多对一

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

SQL:

CREATE TABLE `teacher` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); 

CREATE TABLE `student` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  `tid` INT(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fktid` (`tid`),
  CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT 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. 导入lombok
  2. 新建实体类Teacher,Student
  3. 建立Mapper接口
  4. 建立Mapper.xml文件
  5. 在核心配置文件中绑定注册相应文件
  6. 测试查询是否能够成功

按照查询嵌套处理

<select id="getStudent" resultMap="stu">
    select * from mybatis.student
</select>
<resultMap id="stu" type="student">
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <!--复杂的属性,我们需要单独处理
        对象:使用association
        集合:collection-->
    <association column="tid" property="teacher" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="teacher">
    select * from mybatis.teacher where `id` = #{id}
</select>

按照结果嵌套处理

<!--按照结果嵌套处理-->
<select id="getStudent2" resultMap="st">
    select s.id sid,s.name sname,t.name tname
    from mybatis.student s,mybatis.teacher t
    where s.tid = t.id
</select>

<resultMap id="st" type="student">
    <result property="id" column="sid"/>
    <result property="name" column="sname"/>
    <association property="teacher" javaType="teacher">
        <result property="name" column="tname"/>
    </association>
</resultMap>

回顾Mysql多对一查询方式:

  • 子查询
  • 联表查询

一对多

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

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

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

    实体类

    @Data
    public class Student {
        private int id;
        private String name;
        private int tid;
    }
    
    @Data
    public class Teacher {
        private int id;
        private String name;
        // 一个老师拥有多个学生
        private List<Student> students;
    }
    

按照查询嵌套处理

<select id="getTeacher3" resultMap="t2">
    select * from mybatis.teacher where `id` = #{tid}
</select>
<resultMap id="t2" type="teacher">
    <collection property="students" column="tid" javaType="ArrayList" ofType="student" select="getStudentByTid"/>
</resultMap>
<select id="getStudentByTid" resultType="student">
    select * from mybatis.student where `tid` = #{tid}
</select>

按照结果嵌套处理

<select id="getTeacher2" resultMap="t">
    select s.id sid,s.name sname,t.name tname,t.id tid
    from mybatis.student s,mybatis.teacher t
    where s.tid = t.id and t.id = #{tid}
</select>
<resultMap id="t" type="teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
    <!--复杂的属性,我们需要单独处理,对象:使用association,集合:collection
        javaType=""指定属性的类型
        集合中的泛型信息,我们使用ofType获取-->
    <collection property="students" ofType="student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <result property="tid" column="tid"/>
    </collection>
</resultMap>

小结

  1. 关联-association【多对一】
  2. 集合-collection【一对多】
  3. JavaType & ofType
    1. JavaType 用来指定实体类中属性的类型
    2. ofType 用来指定映射到集合中的pojo类型(泛型中的约束类型)

注意点:

  • 保证SQL的可读性,尽量保证通俗易懂
  • 注意一对多和多对一中,属性名和字段的问题
  • 如果问题不好排查错误,可以使用日志,建议使用Log4j
posted @   家兴Java  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示