MyBatis之两表关联查询
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之两表关联查询相关推荐
- MyBatis实现中间表关联查询
MyBatis实现中间表关联查询 通常构建数据多对多模型的关系时,我们需要再建立一张中间表来关联另外两张表. 下面介绍一下,怎么用MyBatis来实现中间表关联查询并封装到实体类对象中. 现在有三张表 ...
- Mybatis的多表关联查询(多对多)
Mybatis的多表关联查询(多对多) 项目目录结构 实现 Role 到 User 多对多 业务要求 用户与角色的关系模型 编写角色实体类 编写 Role 持久层接口 实现的 SQL 语句 编写映射文 ...
- rails 两表关联查询_Rails中的单表继承与多态关联:找到适合您的方法
rails 两表关联查询 by Haley Mnatzaganian 通过海利·姆纳扎卡尼安 Rails中的单表继承与多态关联:找到适合您的方法 (Single-table inheritance v ...
- asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
本文我们将继续分享介绍Spring Boot在整合Mybatis开发企业级应用时其他典型的业务场景,即Mybatis是如何实现多表关联查询时将查询结果集与对象进行映射的,主要的内容包含"一对 ...
- SQL两表关联查询(两表会了,三表,四表都小意思)
2019独角兽企业重金招聘Python工程师标准>>> 这几天在php群里吹牛逼,看到一个sql表关联查询问题,以前就想写,一直没总觉,实话说,我去年这个时候一表查询都不会,说来惭愧 ...
- php三表关联查询,SQL两表关联查询(两表会了,三表,四表都小意思)
这几天在php群里吹牛逼,看到一个sql表关联查询问题,以前就想写,一直没总觉,实话说,我去年这个时候一表查询都不会,说来惭愧,闲话不多说,正题开始: 首先是news表 下面是newscate表 // ...
- 为什么两表关联查询时唯一索引没有生效
如题,两张表,关联查询的字段都用设置了唯一索引,因为关联查询时LEFT JION,所以左连接的唯一索引不生效我能理解,但为什么右连接的表的唯一索引也没生效呢,以下附上执行计划截图 结帖:两表排序规则不 ...
- 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表 ...
- F005MyBatis学习笔记-MyBatis的多表关联查询
一. 概述 1.一对一 举例:身份证号对人,一个身份证好只能对应一个人,一个人也只能对应一个身份证号,这就是一对一: 特例:Mybatis将多对一看做是一对一: 2.多对多 举例:学生对老师,一个老师 ...
最新文章
- [Linux]core文件调试方法
- 命令行参数实现10万行小字典程序并输出查找时间
- 03-instancing 工程分析详解
- aggregations 详解1(概述)
- cad线性标注命令_CAD线性标注命令的使用方法
- Win10电脑资源管理器怎么打开?五种打开方式详解
- php弹出式搜索,使用PHP进行Spotlight搜索
- 途胜怎样与android手机互联,现代途胜车载蓝牙怎么连接,途胜手机互联映射教程...
- PDF不能编辑怎么办,如何去掉编辑权限
- 长江游艇俱乐部租金问题
- Qt之如何读取Excel表格数据
- python 算法 小试牛刀
- larry wall
- termux获取sd卡读写权限_索尼发布“世界最快”USB-C Hub及TOUGH SF-M系列SD卡
- 【EasyExcel】后台开发如何利用EasyExcel优雅的操作Excel
- MST6M182平台OSD制作
- Oracle删除用户drop user报错解决方案
- 3d游戏项目实训一周总结 2
- JS刷新页面总和!多种JS刷新页面代码!
- 【MySQL】MySQL架构