MyBatis(二)——多对一、一对多
文章目录
- 1. 多对一
- 1.1 在MySQL中创建student表、teacher表
- 1.2 编写实体类
- 1.3 编写接口
- 1.4 编写接口对应的配置文件
- 1.5 确定两个xml文件都绑定到了mybatis-config.xml的核心配置文件中
- 1.6 编写测试类
- 2. 一对多
1. 多对一
多个学生都关联同一个老师,以多个学生为中心
1.1 在MySQL中创建student表、teacher表
CREATE TABLE `teacher` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); CREATE TABLE `student` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,`student``student``user``teacher``tid` INT(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fktid` (`tid`),CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');
1.2 编写实体类
Teacher类:
package com.zz.pojo;import lombok.Data;@Data
public class Teacher {private int id;private String name;
}
Student类:
package com.zz.pojo;import lombok.Data;@Data
public class Student {private int id;private String name;//学生关联老师private Teacher teacher;
}
1.3 编写接口
TeacherMapper 接口为空:
package com.zz.mapper;public interface TeacherMapper {}
StudentMapper 接口:
有得到student列表的方法
package com.zz.mapper;import com.zz.pojo.Student;import java.util.List;public interface StudentMapper {//获取所有学生及学生对应老师的信息List<Student> getStudents();
}
1.4 编写接口对应的配置文件
TeacherMapper.xml 为空:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zz.mapper.TeacherMapper"></mapper>
StudentMapper.xml 配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zz.mapper.StudentMapper"><!--获取所有学生及学生对应老师的信息:1. 获取所有学生的信息2. 获取所有学生的tid,然后再去老师表中查询这个id所对应的老师--><resultMap id="StudentTeacher" type="Student"><id property="id" column="sid"/><result property="name" column="sname"/><!--数据库中的tid是一个字段,而teacher是一个对象,所以不能使用result标签这是多对一的情况,采用association标签(关联) student表关联teacher表,且这个teacher对象是Teacher类型--><association property="teacher" javaType="Teacher"><id property="id" column="tid"/><result property="name" column="tname"/></association></resultMap><select id="getStudents" resultMap="StudentTeacher">select s.id sid,s.name sname,t.name tname,t.id tidFrom student s,teacher tWHERE s.tid=t.id</select>
</mapper>
1.5 确定两个xml文件都绑定到了mybatis-config.xml的核心配置文件中
采用扫描包的方法来绑定,就不用一个个分别绑定
<mappers><!--通过扫描包来绑定--><package name="com.zz.mapper"/></mappers>
1.6 编写测试类
因为是多对一,采用学生绑定老师,所以编写学生对应的测试类
编写StudentMapperTest测试类
package com.zz.mapper;import com.zz.pojo.Student;import com.zz.utils.MyBatisUtils;import org.junit.Test;import java.util.List;public class StudentMapperTest {@Testpublic void testGetStudents(){StudentMapper mapper = MyBatisUtils.getSession().getMapper(StudentMapper.class);List<Student> students = mapper.getStudents();for (Student student : students) {System.out.println(student);}}
}
运行结果:
2. 一对多
通过老师获取学生,以老师为中心
步骤与上相同,在此只写与上面不同之处
(1)编写实体类
package com.zz.pojo;import lombok.Data;import java.util.List;@Data
public class Teacher {private int id;private String name;//老师对应多个学生 (包含:集合)private List<Student> students;
}
package com.zz.pojo;import lombok.Data;@Data
public class Student {private int id;private String name;private int tid;
}
(2)编写接口
package com.zz.mapper;import com.zz.pojo.Teacher;public interface TeacherMapper {//获取这个老师下的所有学生public Teacher getTeacher(int id);}
(3)编写接口的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zz.mapper.TeacherMapper"><resultMap id="TeacherStudent" type="Teacher"><id property="id" column="tid"/><result property="name" column="tname"/><!--如果是集合(包含关系)--><collection property="students" ofType="Student"><result property="id" column="sid"/><result property="name" column="sname"/><!--学生的tid就是老师的id--><result property="tid" column="tid"/></collection></resultMap><!--Teacher里有个list集合,所以不能使用resultType,采用resultMap--><select id="getTeacher" resultMap="TeacherStudent">select s.id sid,s.name sname,t.name tname,t.id tidFrom student s,teacher tWHERE s.tid=t.id and t.id=#{id}</select></mapper>
(4)编写测试类
package com.zz.mapper;import com.zz.pojo.Teacher;
import com.zz.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;public class TeacherMapperTest {@Testpublic void testGetTeacher(){SqlSession session = MyBatisUtils.getSession();TeacherMapper mapper = session.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher(1);System.out.println(teacher);}
}
运行结果:
总结:
- 关联 - association 【多对一】
- 集合 - collection 【一对多】
- javaType & ofType
javaType 用来指定实体类中属性的类型
ofType 用来指定映射到List或者集合中的 pojo类型,泛型中的约束类型!
MyBatis(二)——多对一、一对多相关推荐
- MyBatis级联一对一与一对多
1.概述 在一个人申请某些账号或者权限的时候,比如微信的认证流程. 会让你一步一步按要求输入,比如第一步:点击微信认证,第二步:认证联系人信息填写:最后一步:填写公众号名称.功能介绍.选择运营地区就. ...
- MyBatis二 MyBatis常见面试题
一 MyBatis是什么? MyBatis是一款优秀的持久层框架,一个半ORM (对象关系映射)框架,它支持定制化SQL.存储过程以及高级映射.MyBatis避免了几乎所有的JDBC代码和手动设置参数 ...
- mybatis实现多对多关联查询(超详细版)
mybatis实现多对多关联查询XML实现 在开发过程中,持久层架mybatis为我们封装了SQL操作,只需要提供相应的SQL语句即可查询出结果,若结合逆向工程插件便可免去写一些简单SQL的繁琐工 ...
- SpringBoot Mybatis解决使用PageHelper一对多分页问题
SpringBoot Mybatis解决使用PageHelper一对多分页问题 参考文章: (1)SpringBoot Mybatis解决使用PageHelper一对多分页问题 (2)https:// ...
- mybatis(二)xml配置文件详细说明
目录 文章目录 mybatis(二)xml配置方式详细说明 2.1.使用properties配置属性 2.1.1.引入外部properties文件或在properties标签内定义属性 2.1.1.1 ...
- mybatis映射 一对一、一对多、多对多高级映射
1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(3 ...
- mybatis关联查询之一对多,多对一,以及多对多
一.使用IDEA新建maven工程 二.引入mybatis以及相关的jar <!--版本仅供参考--><dependencies><dependency><g ...
- mybatis关联 多对多,一对多,多对一的编写
1. 准备 数据库 以及数据 /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.23 : Database - test ***************** ...
- MyBatis使用ResultMap处理一对多多对一
出现下列情况: 员工表Emp和部门表Dept是多对一的关系,员工实体类中有Dept这个属性, 但是多表连接查询的时候只能查出Dept这张表的did和dname,无法和Dept这个属性进行关联, 此时若 ...
最新文章
- 通过jQuery调用ASP.NET的AJAX
- 乐视视频 App 图标改为“欠 122 亿”,网友:我在别家分红包,却在你家随份子!...
- 混合SSVEP-P300 BCI生产双频SSVEP
- pyspark AttributeError: 'NoneType' object has no attribute 'setCallSite'
- K8S报错:controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252
- junit junit_JSON的JUnit Hamcrest Matcher
- ubuntu使用root权限登录的设置方法
- Win32动态库 Lib文件哪去了
- php本地文件打包代码,PHP实战:几行代码轻松实现PHP文件打包下载zip
- 2-1:C++快速入门之命名空间
- linux jsp连接mysql_Linux JSP连接MySQL数据库
- Oracle 11g 使用RMAN备份数据库
- Java比较两个对象属性值变化情况,用于记录日志使用
- 工作一两年后 ,你会选择什么样的公司?
- atitit opencv apiattilax总结 约500个函数 .xlsx
- Turbo码(Turbo Codes)
- Java性能调优实战-怎样才能做好性能调优?
- 考虑实时安全优化的自学习自适应交通信号控制
- python interface_面向对象编程语言中的接口(Interface)
- Java语言十五讲(总结)
热门文章
- python 遍历_Python手撕广度优先遍历
- AtCoder AGC001D Arrays and Palindrome (构造)
- java final域_final域_鲲鹏通用_TaiShan服务器代码移植参考_Java同步原语_华为云
- android textview 文字居中_Android布局优化,看这3点就够了
- 计算机三级网络技术知识点大纲,全国计算机等级考试三级网络技术考试大纲(2019年版)...
- 2021-07-01 和的平方与平方的和
- 九、Node.js中文乱码问题
- hdu 2098 分拆素数和(一个偶数拆分成两个不同素数和 拆法数量)
- BZOJ 1293 [SCOI2009]生日礼物
- 【BZOJ3172】单词(AC自动机)