一对一关联

创建表和数据:创建一张教师表和班级表,这里假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系。

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框架学习总结-表的关联查询的更多相关文章

  1. 【Mybatis】MyBatis之表的关联查询(五)

    本章介绍Mybatis之表的关联查询 一对一关联 查询员工信息以及员工的部门信息 1.准备表employee员工表,department部门表 CREATE TABLE `employee` ( `i ...

  2. 多张表进行关联查询---->删除某个数据的时候出现还有子记录的提示

    多张表进行关联查询的时候,当某张表里面的一个字段在另外一张表有定义,就相当于一张表是另外一张表的子表:比如现在开发所遇到的一个问题: 这个是在删除sys_user表的里面的数据的时候出现的问题,因为s ...

  3. Mongoose 多表(N个表)关联查询aggregate

    Mongoose 多表(N个表)关联查询概述 需求:文章(article),文章分类(articlecate),用户(user)这三个表之间的关系,一篇文章对应文章分类表中的某个类型,对应着用户表中的 ...

  4. mybatis 使用接口增删改查和两表一对一关联查询

    导包 总配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...

  5. Mybatis学习总结四(关联查询)

    一.一对一查询 实例:查询所有订单信息,关联查询下单用户信息. Method1:使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息. public class Order ...

  6. mybatis基础系列(四)——关联查询、延迟加载、一级缓存与二级缓存

    关本文是Mybatis基础系列的第四篇文章,点击下面链接可以查看前面的文章: mybatis基础系列(三)——动态sql mybatis基础系列(二)——基础语法.别名.输入映射.输出映射 mybat ...

  7. MyBatis初级实战之五:一对一关联查询

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. Mybatis之旅第六篇-关联查询

    一.引言 通过动态SQL我们可以进行复杂SQL的编写,但之前的例子都是单表查询,在实际开发中,当然不可能都是单表,很多时候我们需要进行关联多表查询(有些公司为了性能还是尽量的使用单表查询),表与表之间 ...

  9. mybatis 使用resultMap实现表间关联

    AutoMapping auto mapping,直译过来就是自动映射,工作原理大概如下: 假设我们有一张表,表名为person,包含id,name,age,addr这4个字段 mysql> d ...

随机推荐

  1. spark读取gz文件

    spark 1.5.1是支持直接读取gz格式的压缩包的,和普通文件没有什么区别: 使用spark-shell进入spark shell 交互界面: 输入命令: sc.textFile("\h ...

  2. 计算机网络——OSI、TCP/IP协议族详解

    一.OSI七层协议体系结构域TCP/IP四层体系结构对比 ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是 ...

  3. git学习(二):git config命令

    不同的git config操作不同的参数文件 git config --global // 配置用户目录下的.gitconfig那文件 git config --system // 配置系统级配置文件 ...

  4. c#用picturebox显示多页TIF

    //引用 using System.Drawing; using System.Drawing.Imaging; //以下是方法 private Bitmap myImage = null; priv ...

  5. oozie中时间EL表达式

    EL表达式: 常量表示形式 含义说明 ${coord:minutes(int n)} 返回日期时间:从一开始,周期执行n分钟 ${coord:hours(int n)} 返回日期时间:从一开始,周期执 ...

  6. Farey Sequence(欧拉函数)

    题意:给出式子F F中分子分母互质,且分子小于分母 例: F2 = {1/2} F3 = {1/3, 1/2, 2/3} F4 = {1/4, 1/3, 1/2, 2/3, 3/4} F5 = {1/ ...

  7. 使用pjsip传输已经编码的视频

    http://blog.chinaunix.net/uid-15063109-id-4445165.html ————————————————————————————————————————————— ...

  8. windows 10 搭建go环境

    1. 到 https://golang.org/ 下载go 的msi安装包.安装后 GOROOT 已经自动帮你设置好. 2.设置GOPATH 不能跟 GOROOT 同一个目录.到系统环境变量里新增一个 ...

  9. 【linux】硬盘分区

    fdisk -l fdisk /dev/sda d--删除分区 n-新建分区 p--主分区 e--扩展分区 t--改变分区格式 82为swap分区 w--保存退出 http://www.blogjav ...

  10. 有用的Python代码片段

    我列出的这些有用的Python代码片段,为我节省了大量的时间,并且我希望他们也能为你节省一些时间.大多数的这些片段出自寻找解决方案,查找博客和StackOverflow解决类似问题的答案.下面所有的代 ...