MyBatis既然是一个ORM框架,则它也有像Hibernate那样的一对多,多对多,多对一的实体关系映射功能。下面我们就来介绍一下如何使用MyBatis的实体关系映射

1.MyBatis实体关系映射,对于我个人来讲常用的有下面两种

  • 多对一:在子表的映射文件中添加association
  • 一对多:在父表的映射文件中添加collection

2.MyBatis中多对一的案例

  • 先创建两张表
CREATE TABLE `student` (
`sid` int(11) default NULL,
`sname` varchar(10) default NULL,
`t_id` int(11) default NULL
) ; CREATE TABLE `teacher` (
`t_id` int(11) NOT NULL,
`t_name` varchar(20) default NULL,
PRIMARY KEY (`t_id`)
) ;
  • 创建实体类
package com.gxa.pojo;

public class Teacher {
private intt_id;
private String t_name;
public intgetT_id() {
return t_id;
}
public void setT_id(intt_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;
}
} package com.gxa.pojo; public class Student {
private intsid;
private String sname;
private Teacher teacher;
public intgetSid() {
return sid;
}
public void setSid(intsid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
  • 创建StudentMapper.xml文件,在此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.gxa.mapper.StudentMapper">
<resultMap type="com.gxa.pojo.Student" id="Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
<association property="teacher" javaType="com.gxa.pojo.Teacher">
<id property="t_id" column="t_id"/>
<result property="t_name" column="t_name"/>
</association>
</resultMap> <select id="getStudent" resultMap="Student">
select * from student a, teacher b where a.t_id = b.t_id and sid = 123
</select>
</mapper>
  • 完成多对一关系的代码测试
package com.gxa.test;

import java.io.IOException;
import java.io.Reader; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import com.gxa.pojo.Student; public class Test03 {
private static SqlSessionFactorysqlSessionFactory;
private static Reader reader; static {
try {
reader = Resources.getResourceAsReader("config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
} @Test
public void m01() {
SqlSessionsqlSession = sqlSessionFactory.openSession();
String sql = "com.gxa.mapper.StudentMapper.getStudent";
Student student = sqlSession.selectOne(sql);
System.out.println(student.getSname() + " === " + student.getTeacher().getT_name());
sqlSession.close();
}
}

3.MyBatis一对多的案例

  • 修改Student和Teacher这两个实体类
package com.gxa.pojo;

public class Student {
private intsid;
private String sname;
private Teacher teacher;
public intgetSid() {
return sid;
}
public void setSid(intsid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
} package com.gxa.pojo; import java.util.List; public class Teacher {
private intt_id;
private String t_name;
private List<Student> student;
public List<Student>getStudent() {
return student;
}
public void setStudent(List<Student> student) {
this.student = student;
}
public intgetT_id() {
return t_id;
}
public void setT_id(intt_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;
}
}
  • 创建TeacherMapper的映射文件,在此文件的<resultMap>标签中加入<collection>
<?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.gxa.mapper.TeacherMapper">
<resultMap type="com.gxa.pojo.Teacher" id="Teacher">
<id property="t_id" column="t_id"/>
<result property="t_name" column="t_name"/>
<collection property="student" ofType="com.gxa.pojo.Student">
<id property="sid" column="sid"/>
<result property="sname" column="sname"/>
</collection>
</resultMap> <select id="getTeacher" resultMap="Teacher">
select * from teacher a,student b where a.t_id = b.t_id and a.t_id = 1
</select>
</mapper>
  • 测试
package com.gxa.test;

import java.io.IOException;
import java.io.Reader;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import com.gxa.pojo.Student;
import com.gxa.pojo.Teacher; public class Test03 {
private static SqlSessionFactorysqlSessionFactory;
private static Reader reader; static {
try {
reader = Resources.getResourceAsReader("config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
} @Test
public void m01() {
SqlSessionsqlSession = sqlSessionFactory.openSession();
String sql = "com.gxa.mapper.StudentMapper.getStudent";
Student student = sqlSession.selectOne(sql);
System.out.println(student.getSname() + " === " + student.getTeacher().getT_name());
sqlSession.close();
} @Test
public void m02() {
SqlSessionsqlSession = sqlSessionFactory.openSession();
String sql = "com.gxa.mapper.TeacherMapper.getTeacher";
Teacher teacher = sqlSession.selectOne(sql);
List<Student> student = teacher.getStudent();
for (Student s : student) {
System.out.println(teacher.getT_name() + "====" + s.getSname());
}
sqlSession.close();
}
}

[刘阳Java]_MyBatis_实体关系映射_第8讲的更多相关文章

  1. [刘阳Java]_MyBatis_注解基本用法_第10讲

    MyBatis注解提出,可以说是非常好简化了MyBatis配置文件的使用.下面我们简单地来告诉大家如何使用MyBatis的注解 定义接口 package com.gxa.dao; import jav ...

  2. [刘阳Java]_Spring常用注解介绍_第6讲

    Spring的注解是在Spring2.5的版本中引入的,目的简化XML配置.在企业开发过程中使用注解的频率非常高,但是学习注解的前提是大家一定要对Spring基于XML配置要熟悉,这是我个人建议,因为 ...

  3. [刘阳Java]_SpringMVC访问静态资源_第9讲

    有些时候我们在使用SpringMVC的时候造成无法访问静态资源文件(如:html,js,css,image等等).其主要的原因出在web.xml文件我们设置SpringMVC前端控制器的映射路径 &l ...

  4. [刘阳Java]_Spring相关配置介绍_第5讲

    这一节我们介绍一下Spring框架的相关常用配置 Spring依赖注入的两种方式(构造方法注入和setter方式注入) p-namespace方式配置 properties属性文件配置方式 集合对象配 ...

  5. [刘阳Java]_BeanNameViewResolver视图解析器_第8讲

    BeanNameViewResolver:这个视图解析器跟XmlViewResolver有点类似,也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象.它要求视图bean对象都定义在Spring ...

  6. [刘阳Java]_ResourceBundleViewResolver视图解析器_第7讲

    ResourceBundleViewResolver是根据proterties文件来找对应的视图来解析"逻辑视图".该properties文件默认是放在classpath路径下的v ...

  7. [刘阳Java]_InternalResourceViewResolver视图解析器_第6讲

    SpringMVC在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器 InternalResourceViewResolver是SpringMVC中比较常用视图解析器. 网 ...

  8. [刘阳Java]_MyBatis_映射文件的resultMap标签入门_第4讲

    <resultMap>:用于解决实体类中属性和表字段名不相同的问题 id:表示当前<resultMap>标签的唯一标识 result:定义表字段和实体类属性的对应关系 prop ...

  9. [刘阳Java]_MyBatis_映射文件的常用标签总结_第5讲

    MyBatis中常用标签的总结,简单给出自己的总结 MyBatis映射文件中的标签使用介绍1.<select>:用于编写查询语句用的标签 id:表示当前<select>标签的唯 ...

随机推荐

  1. 深入浅出Promise

    Abstract Promise的意思是承诺(在红宝书中翻译为期约),新华字典:(动)对某项事务答应照办. Promise最早出现在Commn JS,随后形成了Promise/A规范. Promise ...

  2. cmodel模拟器开发

    cmodel模拟器开发 对于一个公司来说,产品的设计周期就是生命线,一般来说都会在设计功能级仿真的c-model后直接转向RTL设计. 在目前的技术下,做cycle-by-cycle的设计和直接RTL ...

  3. 活动识别API服务开发

    活动识别API服务开发 要使用华为活动识别服务API,需要确保设备已经下载并安装了HMS Core(APK),并将Location Kit的SDK集成到项目中. 指定应用权限 在Android Q以下 ...

  4. GPU与显卡

    GPU与显卡 一.什么是GPU? GPU这个概念是由Nvidia公司于1999年提出的.GPU是显卡上的一块芯片,就像CPU是主板上的一块芯片.那么1999年之前显卡上就没有GPU吗?当然有,只不过那 ...

  5. linux用户组添加和权限的设置

    1.useradd  添加用户 useradd [选项]... 用户名 -u 用户id.-d 家目录路径.-s 登录Shell(解释器).-G 附加组 /sbin/nologin  :禁止用户登陆系统 ...

  6. 《CNN Image Retrieval in PyTorch: Training and evaluati-ng CNNs for Image Retrieval in PyTorch》代码思路解读

    这是一个基于微调卷积神经网络的图像检索的代码实现,这里我就基于代码做一个实现思路的个人解读,如果有不对的地方或者不够详细的地方,欢迎大家指出. 代码的GitHub地址:filipradenovic/c ...

  7. C# 24点游戏求解算法

    经常跟儿子玩24点,有时候比较难算的,算一会儿,两人算不出来,就收了,当作没法算. 以我的数学能力,一般来说,算不出来的,大概率确实是算不出来的. 但是遇到比较变态的,当作算不出来是可能的,所以一直想 ...

  8. 性能分析之用户数(线程数)/响应时间/TPS的关系

    最近在写一些东西的时候,把一些内容整理了一下. 在考虑压力工具中的用户数(有些工具中称为线程数,本文后续都用"用户数"来说明).响应时间.TPS三者之间的关系时,想到之前也有人问起 ...

  9. ES6中的Module与Interator

    小编今天在用Vue做项目的时候,发现组件中有import和export,刚好今天看到相关的语法介绍和一些实例,下面小编就和大家一起进步.对于模块化规范,在es6出现之前,有以下三种规范,分别是Comm ...

  10. SpringCloud-OAuth2(三):进阶篇

    上篇文章讲了SpringCloud OAuth 的实战篇,但是在微服务环境下,常常会有一个认证中心. 而普通服务接收到请求后,判断token是否有效并不是自己处理的,因为token的管理统一交给认证中 ...