[MyBatis]-14 多表关联查询 业务装配模式


prtyaa
prtyaa 2023-12-27 16:21:49 65752
分类专栏: 资讯

这里演示的是多对一

多:学生

一:班级

多个学生一个班级,通过查询学生后再查询班级

业务装配模式,实际上就是mapper层做单表查询操作,在service层做手动装配,实现关联查询的结果

思路:

①首先实体之间的关系,学生之于班级是多对一

所以在学生的实体类从传入一个Class对象用于封装班级信息

②然后分别定义学生的查询操作和班级的查询操作

③在service层中创建两个mapper对象,进行业务装配,首先先查询学生的所有信息,学生的所有信息中包含了班级的id,再用查到的学生信息中的班级id去做班级的查询,最后封装进学生对象,最后在测试类中直接调用方法进行查询

这么做的好处是分开查询,结构清晰,但是代码和逻辑量就稍大一些

 

根据上面的思路我们一层一层的屡

pojo层

定义实体类Clazz

具体操作就是常规的

继承Serializable接口,

无参有参构造方法,

重写hashCode和equals方法,toString方法,

提供公有的set和get方法

定义实体类Student

具体操作就是常规的

继承Serializable接口,

无参有参构造方法,

重写hashCode和equals方法,toString方法,

提供公有的set和get方法

还有插入Class 用于封装查询班级信息

public class Student  implements Serializable {

    private int id;
    private String name;
    private int age;
    private String gender;
    private int cid;
    private Clazz clazz;//用于封装班级信息
}

Mapper层

studentMapper.interface

public interface StudentMapper {

    List<Student> selAll();

}

studentMapper.xml

<mapper namespace="com.lin.mapper.StudentMapper">

    <select id="selAll" resultType="student">
        select * from t_student;
    </select>
</mapper>

ClazzMapper.interface

public interface ClazzMapper {
    Clazz selById(int id);

}

ClazzMapper.xml

parameterType:因为传入的是参数是int类型所以就是用int mybatis 会自动处理参数类型

<mapper namespace="com.lin.mapper.ClazzMapper">

    <select id="selById" resultType="Clazz" parameterType="int" >
        select * from t_class where id=#{0}
    </select>
</mapper>

service层


studentService.interface

public interface StudentService {

    List<Student> selAll();
}

studentServiceImpl.class

这里是业务装配的重中之重,思路整理

先查询学生的所有信息再利用学生信息中包含的班级id查询到班级信息,之后再封装回学生的集合中

这里是手动进行了组装,所以称之为业务装配

public class StudentServiceImpl implements StudentService {
    @Override
    public List<Student> selAll() {
       //获取session对象
        SqlSession session = MyBatisUtil.getSession();
        //获取到学生mapper
        StudentMapper stuMapper = session.getMapper(StudentMapper.class);
        //获取到班级mapper
        ClazzMapper claMapper = session.getMapper(ClazzMapper.class);
       //查询学生信息并且存进list集合中
        List<Student> list = stuMapper.selAll();
        //为每一个student 组装班级信息
        for (Student student : list) {
           //根据查询到的学生信息中的班级信息查询学生班级的具体信息
            Clazz clazz = claMapper.selById(student.getCid());
          //封装进学生属性中
            student.setClazz(clazz);
        }
        session.close();
        //返回集合
        return list;
    }
}

测试类

public class TestQuery {

    public static void main(String[] args) {
        //创建service对象
        StudentService service = new StudentServiceImpl();
       //调用其中查询方法获取集合
        List<Student> list = service.selAll();
       //遍历集合获取学生对象
        for (Student student : list) {
            System.out.println(student);
        }
    }
}

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=31580
赞同 0
评论 0 条
prtyaaL1
粉丝 1 发表 2554 + 关注 私信
上周热门
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1487
银河麒麟打印带有图像的文档时出错  1405
银河麒麟添加打印机时,出现“server-error-internal-error”  1194
统信操作系统各版本介绍  1116
统信桌面专业版【如何查询系统安装时间】  1114
统信桌面专业版【全盘安装UOS系统】介绍  1068
麒麟系统也能完整体验微信啦!  1026
统信【启动盘制作工具】使用介绍  672
统信桌面专业版【一个U盘做多个系统启动盘】的方法  616
信刻全自动档案蓝光光盘检测一体机  526
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!