mybatis 单框架实现一对多查询

mybatis 单框架实现一对多查询

1.1 第一步 建立数据库时,使得一个表里面存在一个集合元素(集合的数据来自于另外一个表)

1.1.1 Grade类

package entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Grade {
    private Integer gid;
    private String gname;

    public Grade(Integer gid, String gname) {
        this.gid = gid;
        this.gname = gname;
    }

    private List<Stu> stus;
}

1.1.2 Stu类

package entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Stu {
    private Integer sid;
    private String sname;
    private Integer gid;
}

1.1.3 OneToMany接口

package mapper;

import entity.Grade;

public interface OneToMany {
    Grade findById(int id);
}

1.2 在select标签中使用resultMap属性

<select id="findById" resultMap="grade_stu">
        select * from grade where gid=#{id}
</select>

1.3 使用resultMap标签

 <resultMap id="grade_stu" type="Grade">
        <id property="gid" column="gid"></id>
        <collection property="stus" column="gid" select="getStu"></collection>
 </resultMap>

1.4 本xml文件中的select标签

 <select id="getStu" resultType="Stu">
        select * from stu WHERE gid=#{id}
 </select>

1.5 测试方法

@Test
    public void t2(){
        SqlSessionFactory sf = SqlSessionFactoryUtil.sf();
        SqlSession sqlSession = sf.openSession();
        OneToMany mapper = sqlSession.getMapper(OneToMany.class);
        Grade g = mapper.findById(101);
        System.out.println(g.getGname());
        System.out.println("---------");
        List<Stu> stus = g.getStus();
       stus.forEach(System.out::println);
        sqlSession.close();
    }

1.6 测试的结果

在这里插入图片描述

1.7 总结

a 一对多就是一个表的实体类存在一个集合属性,其集合属性的数据来源是另外一个表的(通过某一字段进行关联)
如班级表和学生表,一个班级有多个学生,意味着班级表应该存在学生对象的集合属性
b select标签中resultMap属性值必须和resultMap标签id值一致
c resultMap标签中的type值是取决于最终所查的类型是什么
d 一对多查询使用的是collection标签,其中有四大属性需要配置,第一个property指的是对象属性名,第二个column指的是连接的字段
第三个select指的是查询的语句,第四个fetch指的是是否延时加载 eager指的是及时加载 lazy指的是懒加载
lazy指的是用的时候再去加载,eager不管需不需要,都会查询完所有字段的
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值