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. Learning in the Frequency Domain 解读

    论文:Learning in the Frequency Domain, CVPR 2020 代码:https://github.com/calmevtime/DCTNet 实际的图像尺寸比较大,无法 ...

  2. [Abp vNext 源码分析] - 23. 二进制大对象系统(BLOB)

    一.简介 ABP vNext 在 v 2.9.x 版本当中添加了 BLOB 系统,主要用于存储大型二进制文件.ABP 抽象了一套通用的 BLOB 体系,开发人员在存储或读取二进制文件时,可以忽略具体实 ...

  3. Django学习路27_HTML转义

    谨慎使用 自动渲染语法 {{code|safe}} urls.py 中添加对应的函数 url(r'getcode',views.getcode) 在 views.py 中添加 def getcode( ...

  4. PHP pclose() 函数

    定义和用法 pclose() 函数关闭由 popen() 打开的进程. 如果失败,该函数返回 FALSE. 语法 pclose(pipe) 参数 描述 pipe 必需.规定由 popen() 打开的进 ...

  5. PHP move_uploaded_file() 函数

    定义和用法 move_uploaded_file() 函数把上传的文件移动到新位置. 如果成功该函数返回 TRUE,如果失败则返回 FALSE. 语法 move_uploaded_file(file, ...

  6. PHP xml_set_notation_decl_handler() 函数

    定义和用法 xml_set_notation_decl_handler() 函数规定当解析器在 XML 文档中找到符号声明时被调用的函数. 如果成功,该函数则返回 TRUE.如果失败,则返回 FALS ...

  7. 【HNOI2009】最小圈 题解(SPFA判负环+二分答案)

    前言:模拟赛考试题,不会做,写了个爆搜滚蛋仍然保龄. --------------------- 题目链接 题目大意:给定一张有向图,求一个环,使得这个环的长度与这个环的大小(所含结点个数)的比值最小 ...

  8. Kafka 错误信息 java.io.IOException: Can't resolve address: VM_0_15_centos:9092

    kafka   安装完成之后 代码运行的时候,运行完成报这个错误 java.io.IOException: Can't resolve address: VM_0_15_centos:9092 解决办 ...

  9. Java入门到实践系列(1)——Java简介

    一.Java的发展历史 Java是由SUN公司的开发人员James Gosling及其领导的一个开发小组与1995年开发并推出的一门高级编程语言.经过二十几年的发展已经成为最受程序员欢迎.使用最为普遍 ...

  10. python4.3内置函数

    常见的内置函数 a=[12,31,31,232,34,32,43,54,36]max1=max(a)#最大函数print(max1)min1=min(a)#最小函数print(min1)sum1=su ...