多对多关系

一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系。所谓多对多关系,其实是由两个互反的一对多关系组成。即多对多关系都会通过一个中间表来建立,例如选课表。学生对于选课表来说是一对多,课程对于选课表来说也是一对多。

创建数据库表

学生表我们之前已经创建了t_student,这里就不再重新创建了,下面创建一个课程表

CREATE TABLE `t_course` (
  `id` INT NOT NULL,
  `name` VARCHAR(20) NULL,
  PRIMARY KEY (`id`));

选课表:

CREATE TABLE `learnmybatis`.`t_student_course` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `sid` INT NULL,
  `cid` INT NULL,
  PRIMARY KEY (`id`));

初始化数据:

INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1001', 'SpringMVC');
INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1002', 'mybatis');
INSERT INTO `learnmybatis`.`t_course` (`id`, `name`) VALUES ('1003', 'Spring');

INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1001');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1002');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('1', '1003');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('3', '1001');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('3', '1002');
INSERT INTO `learnmybatis`.`t_student_course` (`sid`, `cid`) VALUES ('4', '1001');

创建javabean

创建Course类

package com.monkey1024.bean;

import java.util.List;

public class Course {

    private int id;

    private String name;

    private List<Student> students;

    //省略getter、setter和toString
}

在之前的Student类中添加List属性表示课程:

 private List<Course> courses;

创建mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.monkey1024.dao.CourseDao">

    <resultMap id="courseMapper" type="Course">

        <id property="id" column="cid"/>
        <result property="name" column="cname"/>
        <collection property="students" ofType="Student">
            <id property="id" column="sid"/>
            <result property="name" column="sname"/>
        </collection>
    </resultMap>

    <select id="selectCourseStudent" resultMap="courseMapper">
        SELECT
            c.id cid, c.name cname, s.id sid, s.name sname
        FROM
            t_course c,
            t_student s,
            t_student_course sc
        WHERE
            c.id = #{id}
            AND s.id = sc.sid
            AND c.id = sc.cid;
    </select>
</mapper>

上面sql语句是三张表的关联查询,在collection中表示查询出的学生数据,这里其实可以看做是一对多的查询,因为我们指定了课程编号。

创建Dao

package com.monkey1024.dao;

import com.monkey1024.bean.Course;

public interface CourseDao {

    Course selectCourseStudent(int id);
}

创建测试类

package com.monkey1024.test;

import com.monkey1024.bean.Course;
import com.monkey1024.bean.Employee;
import com.monkey1024.dao.CourseDao;
import com.monkey1024.dao.EmployeeDao;
import com.monkey1024.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class CourseTest01 {

    private SqlSession sqlSession;

    private CourseDao courseDao;

    /**
     * 测试时先执行该方法创建EmployeeDao对象
     */
    @Before
    public void initStudentDao(){
        sqlSession = MyBatisUtil.getSqlSession();
        //通过该方法可以获取CourseDao的对象
        courseDao = sqlSession.getMapper(CourseDao.class);
    }

    /**
     * 执行完成后需要关闭sqlSession
     */
    @After
    public void closeSession() {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }

    @Test
    public void selectCourseStudent(){
        Course course = courseDao.selectCourseStudent(1001);
        System.out.println(course);
    }

}

执行结束后可以看到将课程和选择该课程的所有学生全部查询出来了。

mybatis多对多关联查询的更多相关文章

  1. mybatis多对多关联查询——(十)

    1.需求 查询用户及用户购买商品信息. 2     sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetail. ...

  2. mybatis多对一关联

    mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可, ...

  3. mybatis实战教程二:多对一关联查询(一对多)

    多对一关联查询 一.数据库关系.article表和user表示多对一的关系 CREATE TABLE `article` ( `id` ) NOT NULL AUTO_INCREMENT, `user ...

  4. mybatis 14: 多对一关联查询

    业务背景 根据订单id查询订单的信息,以及该订单所属的客户的基本信息(不包括该客户自己的订单信息) 两张数据表 客户表 订单表 实体类 客户实体类:Customer private Integer i ...

  5. Java基础-SSM之mybatis多对多关联

    Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ...

  6. 三、mybatis多表关联查询和分布查询

    前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...

  7. NHibernate教程(11)--多对多关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  8. MyBatis 多表关联查询

    多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...

  9. mybatis一对多关联查询+pagehelper->分页错误

    mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...

随机推荐

  1. Leetcode53_Spiral_Matrix

    Spiral_Matrix https://leetcode-cn.com/problems/spiral-matrix/ //当行数只有一行: 1. n = 1; m -> 0; //当列数只 ...

  2. zz传统方法和深度学习结合的感知策略探索

    今天分享下 Pony.ai 在感知探索的过程中,使用的传统方法和深度学习方法.传统方法不代表多传统,深度学习也不代表多深度.它们都有各自的优点,也都能解决各自的问题.我们希望发挥它们的优点,并且结合起 ...

  3. luoguP3292 [SCOI2016]幸运数字(点分治做法)

    题意 考虑点分治,每次处理过重心的询问(即两点在重心的不同子树中). 求出每个点到重心的线性基,之后对过重心的询问合并两点线性基求解. code: #include<bits/stdc++.h& ...

  4. [PHP] laravel5.5 搭建流程

    1.nginx 配置 server {    listen       80;    server_name  laravel5-test.d.com; charset utf-8; location ...

  5. ReverseInteger:实现int整数的反转

    原文链接 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 ...

  6. 物联网架构成长之路(35)-利用Netty解析物联网自定义协议

    一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...

  7. Element-ui上传图片按顺序展示

    背景 不知道你上传图片的时候有没有过这样的情况,批量上传多张图片,可能因为图片大小或者网络问题,导致图片返回的顺序和上传时的顺序不一样.因为我们公司是做电商的,即使我们的支持拖动排序,运营还是希望图片 ...

  8. Neo4j 第十一篇:Cypher函数

    Cypher函数是对图进行查询和操作的重要工具. 一,谓词函数 谓词函数返回true或者false,主要用于检查是否存在或满足特定的条件. 1,Exists 如果指定的模式存在于图中,或者特定的属性存 ...

  9. VS2013(InstallShield2015LimitedEdition)打包程序详解

    VS2012没有自带打包工具,所以要先下载并安装一个打包工具.我采用微软提供的打包工具:  InstallShield2015LimitedEdition.下载地址:https://msdn.micr ...

  10. Winform中设置ZedGraph的曲线为散点图

    场景 Winform中设置ZedGraph的曲线符号Symbol以及对应关系: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...