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 ...
随机推荐
- Groovy学习()Groovy是啥?
Groovy是啥? groovy是英文中的一个单词,有marvelous.wonderful和excellen的意思. groovy是轻量级的,动态的,面向对象的,并且运行在JVM上的. groovy ...
- [gpio]Linux GPIO简单使用方式1-sysfs
转自:http://blog.csdn.net/drivermonkey/article/details/20132241 1.1.References 1.2.GPIO Usage from a L ...
- Android——Android Studio的一些小技巧(转)
ndroid课程---Android Studio的一些小技巧 APK瘦身 在Android Studio中我们可以开启混淆,和自动删除没有Resources文件,来达到给APP瘦身的目的,这对于 ...
- PHP——0126最初
数据库mydb 表格info,nation 实现效果 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...
- How to activate maven profile inside eclipse
How to activate maven profile inside eclipse Normally maven is use for project dependency management ...
- Jquery右下角消息提示框
找了好久,终于找到一个不错的提示框jquery,免费给大家一起用下吧(可是花了我很多积分哦),顺便重写了一下样式,原来的样式真的不敢恭维啊... 下载地址:http://files.cnblogs.c ...
- 如何远程备份sql server数据库
方法一(不使用SQLDMO): /// ///备份方法 /// SqlConnection conn = new SqlConnection("Server=.;Database=mas ...
- GUI 即人机交互图形化用户界面设计
GUI 即人机交互图形化用户界面设计.纵观国际相关产业在图形化用户界面设计方面的发展现状,许多国际知名公司早已意识到 GUI 在产品方面产生的强大增值功能,以及带动的巨大市场价值,因此在公司内部设立了 ...
- hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)
再遇攻击 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 253(37 users) Total Accepted: 56(2 ...
- C++ map修改指定key的value
对于修改C++指定key的value,网上查了很多,都说直接insert就会覆盖原来的值,是否是这样的呢? C++ Code 12345678910111213141516171819202122 ...