1. 数据库表

学生表:

教师表:

2. 需求

要求查询所有教师的信息, 包括他的学生信息.
查询结果样式:

3. 代码

实体类

pojo包下:

Student.java

package com.xxx.pojo;
public class Student {private int id;           // 学生编号private String name; // 学生姓名private int age;     // 学生年龄private int tid;     // 学生的教师编号// get/set此处略
}

Teacher.java

package com.xxx.pojo;
import java.util.List;
public class Teacher {private int id;                       // 教师编号private String name;             // 教师姓名private List<Student> students;        // 学生集合// get/set, toString此处略
}

mapper包下:

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.mapper.StudentMapper"><!--按tid查询学生--><select id="selByTid" parameterType="int" resultType="student">select * from student where tid=#{0}</select>
</mapper>

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.mapper.TeacherMapper"><!--查询所有教师包含学生信息. id和name与表中列名对应, students不对应, 要用resultMap--><select id="selTeacher" resultMap="mymap">select * from teacher</select><!--对应的mymap--><resultMap id="mymap" type="teacher"><id property="id" column="id"/><!--由于id在下面这个查询中作为参数了, 所以必须再次加载, name属性可不必再次加载--><collection property="students" select="com.xxx.mapper.StudentMapper.selByTid" column="id"/></resultMap>
</mapper>
说明:

对于Teacher实体类, 它包含id, name, 和students. 其中students与表中列名名不一致, 是一个集合.而且是包含学生信息的集合. 所以在查询教师信息的时候就必须查出这个students.
按需求分析, 要想查出所有教师的信息并包含每位教师的学生.这个学生集合可以通过学生tid属性去查, 即通过tid查出每个教师所教的学生.

 <select id="selByTid" parameterType="int" resultType="student">select * from student where tid=#{0}</select>

例如: 查询tid=2的所有学生, 就是查询教师编号id=2的那位教师(教师id为主键)
所以在查询教师的学生信息时以id为参数, 这个id是教师的id.

MyBatis配置文件: src目录下

mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!--打印日志--><setting name="logImpl" value="LOG4J"/></settings><typeAliases><!--别名, 包下所有类的别名为类名,不区分大小写--><package name="com.xxx.pojo"/></typeAliases><environments default="default"><environment id="default"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/dbname"/><property name="username" value="username"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/xxx/mapper/StudentMapper.xml"/><mapper resource="com/xxx/mapper/TeacherMapper.xml"/></mappers>
</configuration>

测试类

package com.xxx.test;import com.xxx.pojo.Teacher;
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;
import java.util.List;/*** @date 2019/8/8 16:32*/
public class TestMapper {public static void main(String[] args) throws IOException {InputStream is = Resources.getResourceAsStream("mybatis.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);SqlSession session = factory.openSession();List<Teacher> teachers = session.selectList("com.xxx.mapper.TeacherMapper.selTeacher");for (Teacher teacher : teachers) {System.out.println(teacher);}session.close();}
}

控制台打印结果

MyBatis之两表关联查询相关推荐

  1. MyBatis实现中间表关联查询

    MyBatis实现中间表关联查询 通常构建数据多对多模型的关系时,我们需要再建立一张中间表来关联另外两张表. 下面介绍一下,怎么用MyBatis来实现中间表关联查询并封装到实体类对象中. 现在有三张表 ...

  2. Mybatis的多表关联查询(多对多)

    Mybatis的多表关联查询(多对多) 项目目录结构 实现 Role 到 User 多对多 业务要求 用户与角色的关系模型 编写角色实体类 编写 Role 持久层接口 实现的 SQL 语句 编写映射文 ...

  3. rails 两表关联查询_Rails中的单表继承与多态关联:找到适合您的方法

    rails 两表关联查询 by Haley Mnatzaganian 通过海利·姆纳扎卡尼安 Rails中的单表继承与多态关联:找到适合您的方法 (Single-table inheritance v ...

  4. asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询

    本文我们将继续分享介绍Spring Boot在整合Mybatis开发企业级应用时其他典型的业务场景,即Mybatis是如何实现多表关联查询时将查询结果集与对象进行映射的,主要的内容包含"一对 ...

  5. SQL两表关联查询(两表会了,三表,四表都小意思)

    2019独角兽企业重金招聘Python工程师标准>>> 这几天在php群里吹牛逼,看到一个sql表关联查询问题,以前就想写,一直没总觉,实话说,我去年这个时候一表查询都不会,说来惭愧 ...

  6. php三表关联查询,SQL两表关联查询(两表会了,三表,四表都小意思)

    这几天在php群里吹牛逼,看到一个sql表关联查询问题,以前就想写,一直没总觉,实话说,我去年这个时候一表查询都不会,说来惭愧,闲话不多说,正题开始: 首先是news表 下面是newscate表 // ...

  7. 为什么两表关联查询时唯一索引没有生效

    如题,两张表,关联查询的字段都用设置了唯一索引,因为关联查询时LEFT JION,所以左连接的唯一索引不生效我能理解,但为什么右连接的表的唯一索引也没生效呢,以下附上执行计划截图 结帖:两表排序规则不 ...

  8. php 两表关联查询,Thinkphp连多表查询,关联2个或多个字段

    tp连表查询的问题:a表的user_id关联b表的id,a表的race_id关联c表的race_id,a表的race_id和user_id关联d表的race_id和user_id.4表关联,a表和d表 ...

  9. F005MyBatis学习笔记-MyBatis的多表关联查询

    一. 概述 1.一对一 举例:身份证号对人,一个身份证好只能对应一个人,一个人也只能对应一个身份证号,这就是一对一: 特例:Mybatis将多对一看做是一对一: 2.多对多 举例:学生对老师,一个老师 ...

最新文章

  1. [Linux]core文件调试方法
  2. 命令行参数实现10万行小字典程序并输出查找时间
  3. 03-instancing 工程分析详解
  4. aggregations 详解1(概述)
  5. cad线性标注命令_CAD线性标注命令的使用方法
  6. Win10电脑资源管理器怎么打开?五种打开方式详解
  7. php弹出式搜索,使用PHP进行Spotlight搜索
  8. 途胜怎样与android手机互联,现代途胜车载蓝牙怎么连接,途胜手机互联映射教程...
  9. PDF不能编辑怎么办,如何去掉编辑权限
  10. 长江游艇俱乐部租金问题
  11. Qt之如何读取Excel表格数据
  12. python 算法 小试牛刀
  13. larry wall
  14. termux获取sd卡读写权限_索尼发布“世界最快”USB-C Hub及TOUGH SF-M系列SD卡
  15. 【EasyExcel】后台开发如何利用EasyExcel优雅的操作Excel
  16. MST6M182平台OSD制作
  17. Oracle删除用户drop user报错解决方案
  18. 3d游戏项目实训一周总结 2
  19. JS刷新页面总和!多种JS刷新页面代码!
  20. 【MySQL】MySQL架构

热门文章

  1. android bitmap设置透明度,Android 设置图片 Bitmap任意透明度
  2. 深入探索Linux虚拟化KVM-Qemu分析之CPU虚拟化
  3. Verilog HDL语言要素
  4. linux命令——ll详解
  5. 工作流引擎WorkFlow开源项目
  6. 基于OpenWRT的软件开发流程
  7. pycharm更改整体背景颜色(黑-白)
  8. 机器人运动控制(上)
  9. java.lang.arrayindexoutofboundsexception: Index 13 out of bounds for length 13
  10. 链路追踪google dapper论文 中文