Mybatis框架学习总结-表的关联查询
一对一关联
创建表和数据:创建一张教师表和班级表,这里假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系。
CREATE TABLE teacher(
t_id INT PRIMARY KEY AUTO_INCREMENT,
t_name VARCHAR(20)
);
CREATE TABLE class(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(20),
teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id); INSERT INTO teacher(t_name) VALUES('teacher1');
INSERT INTO teacher(t_name) VALUES('teacher2'); INSERT INTO class(c_name, teacher_id) VALUES('class_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('class_b', 2);
定义实体类:
1.Teacher类,Teacher类时teacher表对应的实体类。
package com.fpc.Entity;
public class Teacher {
    private int t_id;
    private String t_name;
    public int getT_id() {
        return t_id;
    }
    public void setT_id(int t_id) {
        this.t_id = t_id;
    }
    public String getT_name() {
        return t_name;
    }
    public void setT_name(String t_name) {
        this.t_name = t_name;
    }
    @Override
    public String toString() {
        return "Teacher [t_id:" + t_id + ", t_name:" + t_name + "]";
    }
}
2.Classes类,Classes类是class表对应的实体类
package com.fpc.Entity;
public class Classes {
    private int c_id;
    private String c_name;
    private Teacher teacher;
    public int getC_id() {
        return c_id;
    }
    public void setC_id(int c_id) {
        this.c_id = c_id;
    }
    public String getC_name() {
        return c_name;
    }
    public void setC_name(String c_name) {
        this.c_name = c_name;
    }
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    @Override
    public String toString() {
        return "Class [t_id:" + c_id + ", t_name:" + c_name + ",teacher:"+ teacher + "]";
    }
}
3.定义sql映射文件classMapper.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.fpc.Mapping.classMapper"> <resultMap type="com.fpc.Entity.Classes" id="ClassResultMap">
<id property="c_id" column="t_id"/>
<id property="c_name" column="c_name"/>
<association property="teacher" column="teacher_id" javaType="com.fpc.Entity.Teacher">
<id property="t_id" column="t_id"/>
<id property="t_name" column="t_name"/>
</association>
</resultMap> <select id="getClass" resultMap="ClassResultMap">
select * from class c ,teacher t where c_id=#{id} and c.teacher_id=t.t_id
</select>
</mapper>
在conf.xm文件中注册classMapper.xml文件:
<mapper resource="com/fpc/Mapping/classMapper.xml"/>
4.编写单元测试代码
String statement1 = "com.fpc.Mapping.classMapper.getClass";
Classes class1 = session.selectOne(statement1,2);
System.out.println(class1);
运行结果:

MyBatis一对一关联查询总结
MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:
- property:对象属性的名称
 - javaType:对象属性的类型
 - column:所对应的外键字段名称
 - select:使用另一个查询封装的结果
 
一对多关联
根据classId查询对应的班级信息,包括学生,老师
1.创建表和数据:基于上面一对一关联查询演示中,已经创建了班级表和教师表,因此这里只要再创建一张学生表就可以了:
CREATE TABLE student(
s_id INT PRIMARY KEY AUTO_INCREMENT,
s_name VARCHAR(20),
class_id INT
);
INSERT INTO student(s_name,class_id) VALUES("student_a",1);
INSERT INTO student(s_name,class_id) VALUES("student_b",1);
INSERT INTO student(s_name,class_id) VALUES("student_c",2);
INSERT INTO student(s_name,class_id) VALUES("student_d",2);
创建的结果:

2.定义实体类Student:
package com.fpc.Entity;
public class Student {
    //定义属性,和student表中的字段对应
    private int id; //id ===> s_id;
    private String name; // name ===> s_name
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + " , name= " + name + "]";
    }
}
2.修改Classes类,添加一个List<Student>属性,使用一个List<Student>集合属性表示班级拥有的学生,如下:
package com.fpc.Entity;
import java.util.List; public class Classes {
private int c_id;
private String c_name; private Teacher teacher; private List<Student> students;
public int getC_id() {
return c_id;
}
public void setC_id(int c_id) {
this.c_id = c_id;
}
public String getC_name() {
return c_name;
}
public void setC_name(String c_name) {
this.c_name = c_name;
} public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Class [t_id:" + c_id + ", t_name:" + c_name + ",teacher:"+ teacher + ", students = " + students +"]";
}
}
3.修改sql映射文件classMapper.xml
添加如下的SQL映射信息:
<?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.fpc.Mapping.classMapper"> <resultMap type="com.fpc.Entity.Classes" id="ClassResultMap">
<id property="c_id" column="t_id"/>
<id property="c_name" column="c_name"/>
<association property="teacher" column="teacher_id" javaType="com.fpc.Entity.Teacher">
<id property="t_id" column="t_id"/>
<id property="t_name" column="t_name"/>
</association> <!-- ofType指定students集合中的对象类型 -->
<collection property="students" ofType="com.fpc.Entity.Student">
<id property="id" column="s_id"/>
<id property="name" column="s_name"/>
</collection>
</resultMap> <select id="getClass" resultMap="ClassResultMap">
select * from class c ,teacher t ,student s where c_id=#{id} and c.teacher_id=t.t_id and s.class_id=c.c_id
</select>
</mapper>
4.编写单元测试代码:
String resource = "conf.xml"; // InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
String statement = "com.fpc.Mapping.userMapper.getUser";
SqlSession session = sessionFactory.openSession(); String statement1 = "com.fpc.Mapping.classMapper.getClass";
Classes class1 = session.selectOne(statement1,1);
System.out.println(class1);
运行结果:

MyBatis一对多关联查询总结
Mybatis中使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型
Mybatis框架学习总结-表的关联查询的更多相关文章
- 【Mybatis】MyBatis之表的关联查询(五)
		
本章介绍Mybatis之表的关联查询 一对一关联 查询员工信息以及员工的部门信息 1.准备表employee员工表,department部门表 CREATE TABLE `employee` ( `i ...
 - 多张表进行关联查询---->删除某个数据的时候出现还有子记录的提示
		
多张表进行关联查询的时候,当某张表里面的一个字段在另外一张表有定义,就相当于一张表是另外一张表的子表:比如现在开发所遇到的一个问题: 这个是在删除sys_user表的里面的数据的时候出现的问题,因为s ...
 - Mongoose 多表(N个表)关联查询aggregate
		
Mongoose 多表(N个表)关联查询概述 需求:文章(article),文章分类(articlecate),用户(user)这三个表之间的关系,一篇文章对应文章分类表中的某个类型,对应着用户表中的 ...
 - mybatis 使用接口增删改查和两表一对一关联查询
		
导包 总配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...
 - Mybatis学习总结四(关联查询)
		
一.一对一查询 实例:查询所有订单信息,关联查询下单用户信息. Method1:使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息. public class Order ...
 - mybatis基础系列(四)——关联查询、延迟加载、一级缓存与二级缓存
		
关本文是Mybatis基础系列的第四篇文章,点击下面链接可以查看前面的文章: mybatis基础系列(三)——动态sql mybatis基础系列(二)——基础语法.别名.输入映射.输出映射 mybat ...
 - MyBatis初级实战之五:一对一关联查询
		
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
 - Mybatis之旅第六篇-关联查询
		
一.引言 通过动态SQL我们可以进行复杂SQL的编写,但之前的例子都是单表查询,在实际开发中,当然不可能都是单表,很多时候我们需要进行关联多表查询(有些公司为了性能还是尽量的使用单表查询),表与表之间 ...
 - mybatis 使用resultMap实现表间关联
		
AutoMapping auto mapping,直译过来就是自动映射,工作原理大概如下: 假设我们有一张表,表名为person,包含id,name,age,addr这4个字段 mysql> d ...
 
随机推荐
- 浏览器中F5和CTRL F5的行为区别
			
前言 在印象中,浏览器中的F5和刷新按钮是一样的效果,都是对当前页面进行刷新:Ctrl-F5的行为也是刷新页面,但是会清除浏览器缓存,这在前端调试时候会常用.二者真正的区别是什么呢?在stackove ...
 - C++中变量做数组长度
			
在Java中,这是完全可以的,比如我们运行如下程序: package cn.darrenchan.storm; import java.util.Arrays; public class Test { ...
 - libcurl库的编译
			
终于弄懂了libcurl库的编译,记下来免得忘记. 下载地址: libcurl库:http://curl.haxx.se/latest.cgi?curl=zip openssl安装包:http ...
 - JQuery EasyUI DataGrid动态合并(标题)单元) 一
			
JS: /** * EasyUI DataGrid根据字段动态合并单元格 * @param fldList 要合并table的id * @param fldList 要合并的列,用逗号分隔(例如:&q ...
 - boost 互斥体和锁
			
1.共享资源是一个自动锁住的房间,互斥体是钥匙,进入房间必须取钥匙,离开房间应该还钥匙.这就对应着互斥体的lock(取钥匙)和unlock(还钥匙). 2.考虑下面的场景:还钥匙的时候出现异常,会发生 ...
 - 第二百七十九节,MySQL数据库-pymysql模块操作数据库
			
MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...
 - commit命令
			
git commit -m "测试提交"
 - 如何在ChemDraw中缩短双键长度
			
双键是化学绘图软件ChemDraw在绘制化学图形的过程中会遇到各种各样的化学结构.而双键就是一种常见的化学基础结构,有的用户希望自己绘制的图形更加的美观,希望可以调整双键的长度并且不影响到其他的结构. ...
 - [转]这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)
			
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
 - PostgreSQL的.NET驱动程序Npgsql中参数对象的一个Bug
			
最近将公司的项目从SqlServer移植到PostgreSQL数据库上来,在调用数据库的存储过程(自定义函数)的时候,发现一个奇怪的问题,老是报函数无法找到. 先看一个PgSQL存储过程: CREAT ...