IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> mybatis一对多映射处理 -> 正文阅读

[Java知识库]mybatis一对多映射处理

一对多映射处理

一对多的关系,例如一个部门有多名员工,一个班级有多名学生

解决方案是:在一的方添加集合并且指定集合的泛型是多方类型【就是JavaBean类型】

// 在一的方添加集合,泛型指定为多的一方类型,并且提供getter和setter方法
    private List<Emp> emps;

    public List<Emp> getEmps() {
        return emps;
    }

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }

方式一:collection方式

collection标签的说明:

ofType是为集合指定类型

property是为哪个属性赋值

例如

<!--
ofType:设置collection标签所处理的集合属性中存储数据的类型
-->
<collection property="emps" ofType="Emp">
    <id property="eid" column="eid"></id>
    <result property="ename" column="ename"></result>
    <result property="age" column="age"></result>
    <result property="sex" column="sex"></result>
</collection>

案例:

Mapper接口

/**
     *根据部门ID查询该部门中所有员工
     */
    Dept getDeptAndEmpByID(@Param("did")Integer did);

Mapper.xml文件

<resultMap id="DeptAndEmpResultMap" type="Dept">
        <id property="did" column="did"/>
        <result property="deptName" column="dept_name"/>
        <!--
            collection:表示为集合赋值,property表示为Dept类中的emps赋值
            ofType:表示集合的类型是Emp
        -->
        <collection property="emps" ofType="Emp">
            <id property="eid" column="eid"/>
            <result property="empName" column="emp_name"/>
            <result property="age" column="age"/>
            <result property="sex" column="sex"/>
            <result property="email" column="email"/>
        </collection>
    </resultMap>
<!--
   根据部门ID查询对应的部门所有员工
   getDeptAndEmpByID(@Param("did")Integer did);
-->
    <select id="getDeptAndEmpByID" resultMap="DeptAndEmpResultMap">
        select d.did,d.dept_name,e.eid,e.emp_name,e.age,e.sex,e.email
        from dept as d inner join emp as e on d.did=e.did where d.did = #{did};
    </select>

test

// 一对多使用collection解决
    @Test
    public void testGetDeptAndEmpByID(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptAndEmpByID(1);
        System.out.println(dept);
        List<Emp> emps = dept.getEmps();
        emps.forEach(emp -> System.out.println(emp));
    }

方式二:分步查询【重点】

分步查询就是将一条sql语句,分成多步查询获取最终结果

同样需要使用association标签,标签需要这两个属性selectcolumn

标签属性说明:

select:设置分步查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名.方法名)

column:设置分布查询的条件

fetchType:当开启了全局的延迟加载之后,可通过此属性手动控制延迟加载的效果

案例:查询指定部门信息及该部门的所有员工

步骤的解释:

  1. 先是第一步查询到的did【部门id】给第二步查询的条件赋值,使用的属性是column
  2. 第二步查询到的结果给Emp对象赋值
  3. 第三步是将第二的查询到的Dept对象值赋值给指定的属性 如:<association property="emps"

注意是:select是指第二条sql的位置【位置是mapper接口的全类名.方法名

案例:查询指定部门信息及该部门的所有员工

Mapper接口

第一步:
/**
     * 分步查询第一步;
     * 根据部门ID查询部门信息及该部门所有员工
     * 先查询出该部门的ID
     * 再根据该部门ID查询该的所有员工
     */
    Dept getDeptAndEmpByStepOnt(@Param("did")Integer did);
    
 
 
 第二步:
 /**
     * 分步查询第二步:
     * 根据部门ID查询该部门对应所有员工
     */
    List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);

Mapper.xml文件

 <resultMap id="DeptAndEmpByStepOneResultMap" type="Dept">
        <id property="did" column="did"/>
        <result property="deptName" column="dept_Name"/>
        <!--
            select:设置分步查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名.方法名)
            column:设置分布查询的条件
            fetchType:当开启了全局的延迟加载之后,可通过此属性手动控制延迟加载的效果
            fetchType="lazy|eager":lazy表示延迟加载【也是默认值,一般设置该值】,eager表示立即加载
        -->
        <collection property="emps"
                    select="com.haikang.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
                    column="did"
                    fetchType="lazy"/>
    </resultMap>
<!--
    getDeptAndEmpByStepOnt(@Param("did")Integer did);
    分步查询:第一步先查询出该部门的ID
            第二步再根据该部门ID查询该部门的所有员工
-->
    <select id="getDeptAndEmpByStepOnt" resultMap="DeptAndEmpByStepOneResultMap">
        select * from dept where did = #{did};
    </select>

test

// 一对多使用分步查询
    @Test
    public void testGetDeptAndEmpByStep(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptAndEmpByStepOnt(1);
        System.out.println(dept);
        List<Emp> emps = dept.getEmps();
        emps.forEach(emp -> System.out.println(emp));
    }

总结

如果查询只是单表时,字段名与属性名不一致,使用别名解决

如果查询是多表时,使用分步查询,实现查询之间的独立性【同时也是分步查询的好处】

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:04:09  更:2022-05-05 11:05:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:59:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码