Mybatis联表查询

一、1对1查询

1、数据库建表

假设一个老师带一个学生

CREATE TABLE teacher(
t_id INT PRIMARY KEY,
t_name VARCHAR(30)
);
CREATE TABLE student(
s_id INT PRIMARY KEY,
s_name VARCHAR(30),
t_id INT ,
FOREIGN KEY(t_id) REFERENCES teacher(t_id)
);
INSERT INTO teacher VALUES(1, "wanglaoshi");
INSERT INTO student VALUES(1, "zhangsan", 1);
2、TeacherMapper.xml配置
<?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.mybatis.mapper.TeacherMapper">
<!-- 关联查询中你需要告诉 MyBatis 如何加载关联。MyBatis 在这方面会有两种不同的方式: -->
<!-- 1、嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 -->
<resultMap type="com.mybatis.model.Student" id="Student1">
<id column="s_id" property="id"></id>
<result column="s_name" property="name"></result>
<association property="teacher" javaType="com.mybatis.model.Teacher">
<id column="t_id" property="id"></id>
<result column="t_name" property="name"></result>
</association>
</resultMap> <select id="selectStudent1" resultMap="Student1">
select * from student s, teacher t where t.t_id = s.t_id and s.s_id = #{id}
</select>
<!-- 2、嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型 -->
<resultMap type="com.mybatis.model.Student" id="Student2">
<id column="s_id" property="id"></id>
<result column="s_name" property="name"></result>
<association column="t_id" property="teacher" select="selectTeacher"></association>
</resultMap> <select id="selectStudent2" resultMap="Student2">
select * from student s, teacher t where t.t_id = s.t_id and s.s_id = #{id}
</select> <select id="selectTeacher" resultType="com.mybatis.model.Teacher">
select t_id id, t_name name from teacher t where t.t_id = #{id}
</select>
</mapper>
3、在Configuration.xml中注册TeacherMapper.xml
 <mappers>
<!-- 注册UserMapper.xml文件 -->
<mapper resource="com/mybatis/mapper/UserMapper.xml"/>
<!-- 注册TeacherMapper.xml文件 -->
<mapper resource="com/mybatis/mapper/TeacherMapper.xml"/>
<!-- 注册UserMapperI接口 -->
<mapper class="com.mybatis.mapper.UserMapperI"/>
</mappers>
4、编写JavaBean
public class Teacher {
//主键
private String id;
//姓名
private String name;
//学生
private Student student;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
public class Student {
//主键
private String id;
//姓名
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5、单元测试代码
public class DbTest4 {

    private SqlSessionFactory sqlSessionFactory;

    @Before
public void init() throws IOException {
//通过mybatis提供的资源加载类加载配置文件
Reader reader = Resources.getResourceAsReader("Configuration.xml");
//获取SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactroyBuilder = new SqlSessionFactoryBuilder();
//根据XML配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactroyBuilder.build(reader);
this.sqlSessionFactory = sqlSessionFactory;
} @Test
public void queryStudent1() {
SqlSession session = sqlSessionFactory.openSession(true);
try {
Teacher teacher = session.selectOne("com.mybatis.mapper.TeacherMapper.selectTeacher1", 1);
System.out.println(JsonUtils.objectToJsonString(teacher));
} finally {
session.close();
}
} @Test
public void queryStudent2() {
SqlSession session = sqlSessionFactory.openSession(true);
try {
Teacher teacher = session.selectOne("com.mybatis.mapper.TeacherMapper.selectTeacher2", 1);
System.out.println(JsonUtils.objectToJsonString(teacher));
} finally {
session.close();
}
}
}
6、输出结果

嵌套结果:

嵌套查询

二、1对多查询

1、数据库建表
CREATE TABLE task(
task_id INT PRIMARY KEY,
description VARCHAR(50),
score DOUBLE,
s_id INT,
FOREIGN KEY(s_id) REFERENCES student(s_id)
);
INSERT INTO task VALUES(1, "数学作业", "100", 1);
INSERT INTO task VALUES(2, "英语作业", "98", 1);
2、TeacherMapper.xml配置
<?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.mybatis.mapper.TeacherMapper">
<resultMap type="com.mybatis.model.Teacher" id="Teacher">
<id column="t_id" property="id"></id>
<result column="t_name" property="name"></result>
<association property="student" javaType="com.mybatis.model.Student">
<id column="s_id" property="id"></id>
<result column="s_name" property="name"></result>
<collection property="tasks" ofType="com.mybatis.model.Task">
<id column="task_id" property="id"></id>
<result column="description" property="description"></result>
<result column="score" property="score"></result>
</collection>
</association>
</resultMap> <select id="selectTeacher" resultMap="Teacher">
select * from student s, teacher t, task e where t.t_id = s.t_id and e.s_id = s.s_id and t.t_id = #{id}
</select>
</mapper>
3、编写JavaBean
public class Teacher {
//主键
private String id;
//姓名
private String name;
//学生
private Student student;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
public class Student {
//主键
private String id;
//姓名
private String name;
//作业集合
private List<Task> tasks;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Task> getTasks() {
return tasks;
}
public void setTasks(List<Task> tasks) {
this.tasks = tasks;
}
}
public class Task {
//主键
private String id;
//描述
private String description;
//分数
private double score;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
4、单元测试代码
public class DbTest5 {

    private SqlSessionFactory sqlSessionFactory;

    @Before
public void init() throws IOException {
//通过mybatis提供的资源加载类加载配置文件
Reader reader = Resources.getResourceAsReader("Configuration.xml");
//获取SqlSessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactroyBuilder = new SqlSessionFactoryBuilder();
//根据XML配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactroyBuilder.build(reader);
this.sqlSessionFactory = sqlSessionFactory;
} @Test
public void queryStudent() {
SqlSession session = sqlSessionFactory.openSession(true);
try {
Teacher teacher = session.selectOne("com.mybatis.mapper.TeacherMapper.selectTeacher", 1);
System.out.println(JsonUtils.objectToJsonString(teacher));
} finally {
session.close();
}
}
}
5、输出结果

Mybatis入门(四)------联表查询的更多相关文章

  1. mybatis一对多联表查询的两种常见方式

    1.嵌套结果查询(部分代码如下) sql语句接上: 注释:class表(c别名),student表teacher(t别名)teacher_id为class表的字段t_id为teacher表的字段,因为 ...

  2. MyBatis联表查询

    MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...

  3. mybatis 联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  4. MyBatis学习存档(5)——联表查询

    之前的数据库操作都是基于一张表进行操作的,若一次查询涉及到多张表,那该如何进行操作呢? 首先明确联表查询的几个关系,大体可以分为一对一和一对多这两种情况,接下来对这两种情况进行分析: 一.建立表.添加 ...

  5. mybatis之联表查询

    今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springM ...

  6. Mybatis框架-联表查询显示问题解决

    需求:查询结果要求显示用户名,用户密码,用户的角色 因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表smbms_role表中,这时我们就需要联表查询了. 这里需要在User实体类中添加 ...

  7. Spring Hibernate JPA 联表查询 复杂查询(转)

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  8. Spring Hibernate JPA 联表查询 复杂查询

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  9. FreeSql (十七)联表查询

    FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnect ...

随机推荐

  1. python socket函数详解

    关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄得清楚.通透,并记录下来, ...

  2. vector 赋初始值的问题

    这个,输出为1 这个,啥都输不出来. 据说是因为没有初始化. 其实我搜了一下 vector<vector<int> > A;//正确的定义方式 vector<vector ...

  3. pycharm 退出虚拟环境

    pycharm 内置虚拟环境 venv 如果要退出就直接 deactivate 命令就行 运行的话直接在命令行输python3  文件名

  4. PHP tmpfile() 函数

    定义和用法 tmpfile() 函数以读写(w+)模式创建一个具有唯一文件名的临时文件. 语法 tmpfile() 提示和注释 注释:临时文件会在文件关闭后(用 fclose())或当脚本结束后自动被 ...

  5. PHP str_getcsv() 函数

    定义和用法 str_getcsv() 函数解析 CSV 格式字段的字符串,并返回一个包含所读取字段的数组. 语法 str_getcsv(string,separator,enclosure,escap ...

  6. bzoj 4278 [ONTAK2015]Tasowanie

    给出两个字符串 A B 让我们对其二路归并 求出能够归并出的最小字典序. 考虑后缀数组 不难发现我们将B直接连在A上会出现问题 问题是 A串剩下的和B串完全相同了 那么此时比大小就会用到B的部分 这是 ...

  7. mit-6.828 Lab01:Booting a PC Part2 理论知识

    Part 2 目录 Part 2 学习理论知识 反汇编 扇区 BIOS 启动过程总结 Boot loader启动过程总结 A20 gate 读boot/boot.S 和 boot/boot.c源码 - ...

  8. Hadoop学习之常用输入输出格式总结

    目的 总结一下常用的输入输出格式. 输入格式 Hadoop可以处理很多不同种类的输入格式,从一般的文本文件到数据库. 开局一张UML类图,涵盖常用InputFormat类的继承关系与各自的重要方法(已 ...

  9. jmeter中使用jdbc参数化

    以读取mysql数据库为例 1.下载一个mysql驱动包,最好去mysql官网下载 下载网址:https://dev.mysql.com/downloads/connector/j/ Select O ...

  10. this.getClass().getResource(String) 路径问题

    this.getClass().getResource(String) 路径问题    这里的默认当前路径是该类所在目录: this.getClass() 说明了一切!! 找到类,就找文件:很显然和类 ...