MyBatis中多表查询(N+1方式)

N+1查询方式
[1]什么是N+1的查询方式
如果没有N+1的方式我们想要实现多表的查询,自己书写查询的业务逻辑代码(java)
mybatis希望通过自己标签配置的方式来解决这个问题
[2]执行的操作
查询学生所在班级的信息(一对一)
查询班级中所有学生的信息(一对多)
使用的时候书写标签需要注意:
查询出来返回的是一个对象:association
查询出来返回的是一个集合:collection

总结: 业务装配方式和N+1查询方式
    共同点:执行SQL语句的条数上都是N+1条语句
    不同点:
            业务装配方式:是我们自己书写java代码的方式进行配置的
            N+1方式:通过MyBatis标签配置的方式实现的

接口
StudentMapper.java

public interface StudentMapper {

    //查询所有学生的操作
    List<Student>  selectAll();

    List<Student>  selectMore(int clazzno);
}

ClazzMapper.java

public interface ClazzMapper {

    //查询指定学生所在班级的信息
    Clazz  selectOne(int clazzno);

    //查询所有班级信息
    List<Clazz>  selectAll();
}

XML
StudentMapper.xml

    <select id="selectAll"  resultMap="rm1">

         SELECT  * from   student

    </select>

    <resultMap id="rm1" type="student">
        <!--column:数据库的列名  property:实体的属性名-->
        <!--如果数据库的列明和实体类中的属性名一致,就可以省去该标签
            但是公共字段不建议省去
        -->
        <id column="sid" property="sid"></id>
        <result column="sname" property="sname"></result>
        <result column="clazzno" property="clazzno"></result>
        <!--
           select *  from clazz  where clazzno=?
          select:执行哪一个方法
          column:希望查询的哪一列作为参数进行传递
          javaType:返回值类型
          property:把返回的结果赋值给对象中哪一个属性
        -->
        <association  select="com.bjsxt.mapper.ClazzMapper.selectOne"
                       column="clazzno" javaType="clazz" property="cla"></association>

    </resultMap>

ClazzMapper.xml

    <select id="selectAll" resultMap="rm1">

        SELECT  *  from  clazz

    </select>

    <resultMap id="rm1" type="clazz">

        <id column="clazzno" property="clazzno"></id>

        <result column="cname" property="cname"></result>
        <!--

        select:调用哪一个xml中方法

        column:希望那一列作为参数进行传递

        ofType:集合的泛型

        property:把返回的数据整体赋值给哪一个属性
        -->
        <collection  select="com.bjsxt.mapper.StudentMapper.selectMore"
                     column="clazzno" ofType="student"  property="li"></collection>

    </resultMap>

测试

        //[4]执行方法

        StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

        ClazzMapper  claMapper = sqlSession.getMapper(ClazzMapper.class);

        //查询所有学生所在的班级的信息

        /*List<Student> list = stuMapper.selectAll();

       for(Student  stu:list){
           System.out.println(stu);
       }*/

        //查询所有班级中学生的信息

        List<Clazz> list = claMapper.selectAll();

        for(Clazz  clazz:list){
            System.out.println(clazz);
        }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AloneDrifters

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

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

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

打赏作者

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

抵扣说明:

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

余额充值