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 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Mybatis学习之一对多的处理 -> 正文阅读

[大数据]Mybatis学习之一对多的处理

Mybatis学习之一对多的处理

在阅读本文前请阅读:添加链接描述

一对多的理解

一个老师拥有多个学生,如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)

工具类的编写

package com.peihj.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

// 工具类
public class MybatisUtils {

    private static SqlSessionFactory sqlSessionFactory; // 提升作用阈

    // 获取SqlSessionFactory对象
    static {
        try {
            String resource = "mybatis-config.xml";

            InputStream inputStream = Resources.getResourceAsStream(resource);
            System.out.println("inputStream"+inputStream);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
    // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:

    public static SqlSession getSqlSession(){
        // SqlSession sqlSession = sqlSessionFactory.openSession();

        return sqlSessionFactory.openSession();
    }
}

实体类编写

实体类编写之Students

package com.peihj.pojo;

import lombok.Data;

@Data
public class Student1 {
    private String name;
    private int id;
    // 多个学生可以是同一个老师,即多对一
    private int tid;
}

实体类编写之Teachers

package com.peihj.pojo;

import lombok.Data;

import java.util.List;

@Data // /GET,SET,ToString,有参,无参构造
public class Teacher1 {
    private int id;
    private String name;
    private List<Student1> students;
}

编写接口

通过老师的id去查询对应的学生集合

package com.peihj.dao;

import com.peihj.pojo.Teacher1;

public interface TeacherMapper1 {

    // 通过id获取该老师对象下的所有的学生
    public Teacher1 getTeacher(int id);

    public Teacher1 getTeacher2(int id);
}

按结果嵌套处理

编写接口对应的Mapper配置文件

    <select id="getTeacher" resultMap="TeacherStudent">
        select s.id sid,s.name sname,t.id tid,t.name tname from student s ,teacher t where t.id = s.tid and t.id = #{id}
    </select>
    <resultMap id="TeacherStudent" type="Teacher1">
        <result property="name" column="tname"/>
        <result property="id" column="tid"/>
        <!--因为他是一个集合所有我们需要使用collection-->
        <collection property="students" ofType="com.peihj.pojo.Student1">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
        </collection>
    </resultMap>
</mapper>

思路:
1. 从学生表和老师表中查出学生id,学生姓名,老师姓名
2. 对查询出来的操作做结果集映射
3. 集合的话,使用collection,JavaType和ofType都是用来指定对象类型的,JavaType是用来指定pojo中属性的类型,ofType指定的是映射到list集合属性中pojo的类型。

通过SQL语句进行查询,并通过resultMap进行联系,将SQL语句用到的参数(sid,sname,tid,tname)在参数。

将Mapper文件注册到MyBatis-config文件中

 <mappers>
        <!--加载sql文件的映射文件-->
        <!--如果使用注解开发,这里就别设置了,不然冲突还报错-->
<!--        <mapper resource="com/peihj/dao/UserMapper.xml"/>-->
        <!--使用class绑定接口-->
        <mapper resource="com/peihj/dao/TeacherMapper1.xml"/>
    </mappers>

编写测试类

 @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        TeacherMapper1 teacherMapper1 = sqlSession.getMapper(TeacherMapper1.class);

        Teacher1 studentList = teacherMapper1.getTeacher(1);

        System.out.println(studentList);
    }

按查询嵌套处理

TeacherMapper接口编写方法

package com.peihj.dao;

import com.peihj.pojo.Teacher1;

public interface TeacherMapper1 {

    // 通过id获取该老师对象下的所有的学生
    public Teacher1 getTeacher(int id);

    public Teacher1 getTeacher2(int id);
}

编写接口对应的Mapper配置文件

注意我们利用方法1,通过结果嵌套处理,是不需要配置javatype的,但是通过查询嵌套处理是需要配置javatype(该复杂参数是啥类型),column是该外键与另外一个表的连接纽带,这里是id。

<select id="getTeacher2" resultMap="TeacherStudent2">
        select * from teacher where id = #{id}
    </select>
    <resultMap id="TeacherStudent2" type="Teacher1">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <!--column是一对多的外键 , 写的是一的主键的列名,再本项目就是指代id-->
        <collection property="students" ofType="Student1" javaType="ArrayList" column="id" select="searchstudent"/>
    </resultMap>

    <select id="searchstudent" resultType="Student1">
        select * from student where student.tid = #{id}
    </select>

将Mapper文件注册到MyBatis-config文件中

测试类

@Test
    public void test1(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        TeacherMapper1 teacherMapper1 = sqlSession.getMapper(TeacherMapper1.class);
        Teacher1 teacher2 = teacherMapper1.getTeacher2(1);
        System.out.println(teacher2);
    }

参考

https://www.bilibili.com/video/BV1NE411Q7Nx?p=21&t=1575.0

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:49:32  更:2022-05-01 15:49:38 
 
开发: 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 1:29:05-

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