场景:使用三张数据表:student学生表、teacher教师表、position职位表

一个学生可以有多为老师、一位老师可以有多个学生、但是一个老师只能有一个职位:教授、副教授、讲师;但是一个职位可以有多个老师:例如教授可以多人

这里则产生了:

一对一关系,从老师角度:老师对职位一对一

一对多关系,从职位角度:职位对老师一对多

多对多关系:查找被教授教导的所有学生(首先职位对老师一对多,老师再对学生再对多、这里便有了一对多对多)

数据表:

老师表

CREATE TABLE `tb_teacher` (`id` int(11) NOT NULL AUTO_INCREMENT,`t_no` varchar(20) DEFAULT NULL,`t_name` varchar(20) DEFAULT NULL,`position_id` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;/*Data for the table `tb_teacher` */insert  into `tb_teacher`(`id`,`t_no`,`t_name`,`position_id`) values
(1,'163314001','张文远',1),
(2,'163314002','赵传智',1),
(3,'163314003','风清扬',2),
(4,'163314004','王汇智',2),
(5,'163314005','汪思远',3);

学生表

CREATE TABLE `tb_student` (`id` int(11) NOT NULL AUTO_INCREMENT,`t_stu_name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;/*Data for the table `tb_student` */insert  into `tb_student`(`id`,`t_stu_name`) values (1,'赵依'),(2,'钱迩'),(3,'张山'),(4,'李石'),(5,'王武'),(6,'马柳');

职位表

CREATE TABLE `tb_position` (`id` int(11) NOT NULL AUTO_INCREMENT,`t_pos_name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;/*Data for the table `tb_position` */insert  into `tb_position`(`id`,`t_pos_name`) values (1,'教授'),(2,'副教授'),(3,'讲师');

最后是教师学生关系表

CREATE TABLE `tb_stu_teach` (`id` int(11) NOT NULL AUTO_INCREMENT,`t_stu_id` int(11) DEFAULT NULL,`t_teach_id` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;/*Data for the table `tb_stu_teach` */insert  into `tb_stu_teach`(`id`,`t_stu_id`,`t_teach_id`) values (1,1,1),(2,1,2),(3,1,3),(4,2,2),(5,2,3),(6,2,4),(7,3,3),(8,3,4),(9,3,5),(10,4,4),(11,4,5),(12,4,1);

最后在eclipse中的目录结构如下:

希望您明白sqlMapConfig该如何配置,以及jdbc.properties和log4j的作用。

贴出POJO中的三个实体(注意:以下的POJO都用了lombok来快速生成setter和getter等,lomok具体使用,请见此文):

Position.java

package com.pojo;import java.io.Serializable;import lombok.Data;@Data
public class Position implements Serializable {private int id;private String name;private Teacher teacher;}

Student.java

package com.pojo;import java.io.Serializable;
import java.util.List;import lombok.Data;@Data
public class Student implements Serializable {private String id;private String name;private List<Teacher> list;
}

Teacher.java

package com.pojo;import java.io.Serializable;
import java.util.List;import lombok.Data;@Data
public class Teacher implements Serializable {private int id;private String no;private String name;private List<Student> studentList;private Position pos;
}

注意:关系表不用以实体表示出来,表示外键关系的ID也不用写在实体中(一般我们也不使用外键)

再贴另一个MybatisUtil.java工具类

package com.util;import java.io.IOException;
import java.io.InputStream;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory = null;static {String resource = "sqlMapConfig.xml";// 首先要加载核心配置文件:从classpath下开始找。InputStream in;try {in = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);} catch (IOException e) {throw new RuntimeException(e.getMessage());}   }public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}public static SqlSessionFactory getSqlSessionFactory() {return sqlSessionFactory;}
}

一对一:老师对职位

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.mapper.TeacherMapper"><resultMap type="Teacher" id="teacherPositionResultMap"><id property="id" column="id"/><result property="no" column="t_no"/><result property="name" column="t_name"/><!-- association:配置的一对一属性 --><!-- property:名字javaType:类型--><association property="pos" javaType="Position"><id property="id" column="id"/><result property="name" column="t_pos_name"/></association></resultMap><!-- 一对一关联查询,查询老师及其对应的职位 --><!-- 注意:id不能相同,当多个值传入,比如包装类的时候,我们才能够用SQL片段的形式来做if判断,单个值是不行的 --><select id="queryTeacherPositionResultMapById" resultMap="teacherPositionResultMap" parameterType="Integer">SELECT *FROM tb_teacher tLEFT JOIN tb_position pON t.position_id = p.idwhere t.id = #{id}</select><select id="queryTeacherPositionResultMap" resultMap="teacherPositionResultMap">SELECT *FROM tb_teacher tLEFT JOIN tb_position pON t.`position_id` = p.id</select>
</mapper>

TeacherMapper.java接口

package com.mapper;import java.util.List;import com.pojo.Teacher;public interface TeacherMapper {public List<Teacher> queryTeacherPositionResultMap();public Teacher queryTeacherPositionResultMapById(Integer id);
}

测试一对一:

package com.test;import java.util.List;import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import com.mapper.TeacherMapper;
import com.pojo.Teacher;
import com.util.MyBatisUtil;public class TestOneToOne {@Testpublic void testOneToOne() {SqlSession sqlSession = MyBatisUtil.getSqlSession();System.err.println(sqlSession);TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);List<Teacher> list = teacherMapper.queryTeacherPositionResultMap();System.out.println(list);Teacher teacher = teacherMapper.queryTeacherPositionResultMapById(1);System.out.println(teacher);}
}

一对多:职位对老师

PositionMapper.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.mapper.PositionMapper"> <resultMap type="Position" id="positionTeacherResultMap"><id property="id" column="id"/><result property="name" column="t_pos_name"/> <!-- t_name --><!-- property同association中的一样是属性名称(javaBean中的);javaType也同association中的是类型,最后多了一个OfType,因为一对多,不像一对一是单个的!我们这里是List集合,list和List都可以。一对多其中是放的一个集合所以这个是集合的泛型的类型,这里我们的list中放的是Teacher:所以这里是Teacher。--><collection property="teacherList" javaType="list" ofType="Teacher" ><!-- 一对多出现的问题:当数据库表中,主表的主键id和明细表的 ...当表中的字段名相同时怎么办?多表联查?注意:Mybatis中做多表联查的时候,不管是一对一、一对多、一对多对多:多对多:都不能有字段重名的情况:不管是主键还是普通字段。一旦字段重名的话,就会造成数据少自动赋值,或者覆盖,甚至重复赋值!规避和解决此类问题的方法:1.尽量不要表间重名,mybatis里处理起来很麻烦!id和普通字段都是。但是在表多的时候,很难不会出现字段重名的情况。主键id最容易重名!那么就要用以下的办法了!2.在mybatis中写原生SQL进行查询的时候,查的字段尽可能的少,这也影响速率,强烈禁止使用*,用多少查多少!这样也能及时发现字段重名的情况!3.最后如果真的需要查出重名的字段,并且修改数据库字段名造成的更改过大,这里推荐的方式是给字段取别名,在写resultMap映射的时候,其中的column属性就填写SQL语句中查出字段取的别名,这样就能解决重复问题了!--><id property="id" column="t_id"/><result property="no" column="t_no"/><result property="name" column="t_name"/>    </collection></resultMap><select id="queryPositionTeacherResultMapById" resultMap="positionTeacherResultMap" parameterType="Integer"><!-- SELECT *FROM tb_position pLEFT JOIN tb_teacher tON p.id = t.position_idWHERE p.id = #{id}-->SELECT p.*, t.id t_id,t.t_name,t.t_noFROM tb_position pLEFT JOIN tb_teacher tON p.id = t.position_idWHERE p.id = #{id}</select><select id="queryPositionTeacherResultMap" resultMap="positionTeacherResultMap" ><!-- SELECT *FROM tb_position pLEFT JOIN tb_teacher tON p.id = t.position_id-->SELECT p.*, t.id t_id,t.t_name,t.t_noFROM tb_position pLEFT JOIN tb_teacher tON p.id = t.position_id</select>
</mapper>

TeacherMapper.java接口

package com.mapper;import java.util.List;import com.pojo.Position;public interface PositionMapper {public Position queryPositionTeacherResultMapById(Integer id);public List<Position> queryPositionTeacherResultMap();
}

测试一对多:

package com.test;import java.util.List;import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import com.mapper.PositionMapper;
import com.pojo.Position;
import com.util.MyBatisUtil;public class TestOneToMany {@Testpublic void testOneToMany() {SqlSession sqlSession = MyBatisUtil.getSqlSession();PositionMapper positionMapper = sqlSession.getMapper(PositionMapper.class);List<Position> list = positionMapper.queryPositionTeacherResultMap();System.out.println(list);Position pos = positionMapper.queryPositionTeacherResultMapById(1);System.out.println(pos);}
}

多对多:职位是教授的老师教授的所有学生(一对多对多:只要你愿意可以一直对多下去...)

PositionMapper.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.mapper.PositionMapper"> <resultMap type="Position" id="positionStudentResultMap"><!-- <id property="id" column="id"/> --><result property="name" column="t_pos_name"/><collection property="teacherList" javaType="list" ofType="Teacher" ><result property="name" column="t_name"/>   <collection property="studentList" javaType="list" ofType="Student"><result property="name" column="t_stu_name"/></collection></collection></resultMap><select id="selectPositionStudentByPosId" resultMap="positionStudentResultMap" parameterType="Integer">SELECT p.t_pos_name, t.t_name, s.t_stu_nameFROM tb_position pINNER JOIN tb_teacher t ON p.id = t.position_idLEFT JOIN tb_stu_teach st ON st.t_teach_id = t.idLEFT JOIN tb_student s ON s.id = st.t_stu_idWHERE p.id = #{id}</select>
</mapper>

PositionMapper.java接口

package com.mapper;import com.pojo.Position;public interface PositionMapper {public Position selectPositionStudentByPosId(Integer id);}

测试:

package com.test;import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import com.mapper.PositionMapper;
import com.pojo.Position;
import com.util.MyBatisUtil;public class TestManyToMany {@Testpublic void testManyToMany() {SqlSession sqlSession = MyBatisUtil.getSqlSession();PositionMapper positionMapper = sqlSession.getMapper(PositionMapper.class);Position pos = positionMapper.selectPositionStudentByPosId(1);System.out.println(pos);}
}

Mybatis一对一、一对多、多对多查询。+MYSQL相关推荐

  1. gorm一对一 一对多 多对多查询案例

    Student -- IDCard -- Class -- Teacher

  2. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  3. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

  4. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  5. Mybatis-Plus用纯注解完成一对多多对多查询

    Mybatis-Plus用纯注解搞定一对多&多对多查询 业务中很常见的用户-角色就属于典型的多对多关系. 假设我们需要将用户信息(包括了用户对应的角色信息)查询出来 多对多 数据表结构 use ...

  6. SQLAlchemy_定义(一对一/一对多/多对多)关系

    SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...

  7. Mybatis中的关系映射(一对一,一对多,多对多)

    在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...

  8. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一多对一/一对多,多对多{类中的定义方法}day691. 昨日内容回顾1. 单表增删改查2. 单表查询API返回QuerySet对象的:1. .all() ...

  9. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置 ----喝最烈的酒.

    1.Mybatis多表查询 1.1 一对一查询 1.1.1 一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一查询的需求:查询一个订单,与此同时查询出该订单 ...

  10. mybatis学习笔记(12)-多对多查询

    mybatis学习笔记12-多对多查询 示例 多对多查询总结 resultMap总结 本文实现多对多查询,查询用户及用户购买商品信息. 示例 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通 ...

最新文章

  1. 用“脸”打卡,抬头就能签到!
  2. OpenCV编写视频文件的实例(附完整代码)
  3. ubuntu20.04运行愤怒的小鸟
  4. 数字图像处理—亮度变换与空间滤波—亮度变换函数
  5. Xshell链接不上云服务器的解决方案
  6. Spring Boot基础学习笔记14:实现文件上传功能
  7. Chaos网络库(三)- 主循环及异步消息的实现
  8. STM32笔记之 FLASH(内存)
  9. Markowitz有效边界投资组合——利用python
  10. Chrome浏览器设置 【显示右上角 翻译语言图标】
  11. java 通过User-Agent来判断是否是移动浏览器
  12. codevs 2964 公共素数因数
  13. 【案例回顾】春节一次较波折的MySQL调优
  14. 使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)02 人脸识别 下
  15. 用Python的turtle画精灵球
  16. 刚刚,红杉沈南鹏与黑石苏世民罕见对话
  17. 华为机试2022.4.13:分发糖果
  18. 机器人搏击大赛冠军_爆冷门!菜鸟中国队力克美国三届冠军,最强机器人格斗...
  19. 剑指 Offer 09. 用两个栈实现队列
  20. 深入浅出实现Electron判断屏幕当前是否是双屏显示?

热门文章

  1. JS 验证身份证及获取地区
  2. pg和MySQL读性能_[评测]低配环境下,PostgresQL和Mysql读写性能简单对比
  3. PYTHON应用行业,PYTHON就业方向
  4. NLP自然语言处理之句法分析
  5. 一点感悟: 詹姆斯与全栈工程师
  6. C语言 #define ABS(X) (X >= 0) ? X : -X 遇到的逻辑错误
  7. 量化交易必读:国内12大量化平台全解析
  8. Axure软件的简单使用
  9. react-native 0.40.0 环境搭建踩坑全记录
  10. ECMASript 6 新特性