[刘阳Java]_MyBatis_实体关系映射_第8讲
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讲的更多相关文章
- [刘阳Java]_MyBatis_注解基本用法_第10讲
MyBatis注解提出,可以说是非常好简化了MyBatis配置文件的使用.下面我们简单地来告诉大家如何使用MyBatis的注解 定义接口 package com.gxa.dao; import jav ...
- [刘阳Java]_Spring常用注解介绍_第6讲
Spring的注解是在Spring2.5的版本中引入的,目的简化XML配置.在企业开发过程中使用注解的频率非常高,但是学习注解的前提是大家一定要对Spring基于XML配置要熟悉,这是我个人建议,因为 ...
- [刘阳Java]_SpringMVC访问静态资源_第9讲
有些时候我们在使用SpringMVC的时候造成无法访问静态资源文件(如:html,js,css,image等等).其主要的原因出在web.xml文件我们设置SpringMVC前端控制器的映射路径 &l ...
- [刘阳Java]_Spring相关配置介绍_第5讲
这一节我们介绍一下Spring框架的相关常用配置 Spring依赖注入的两种方式(构造方法注入和setter方式注入) p-namespace方式配置 properties属性文件配置方式 集合对象配 ...
- [刘阳Java]_BeanNameViewResolver视图解析器_第8讲
BeanNameViewResolver:这个视图解析器跟XmlViewResolver有点类似,也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象.它要求视图bean对象都定义在Spring ...
- [刘阳Java]_ResourceBundleViewResolver视图解析器_第7讲
ResourceBundleViewResolver是根据proterties文件来找对应的视图来解析"逻辑视图".该properties文件默认是放在classpath路径下的v ...
- [刘阳Java]_InternalResourceViewResolver视图解析器_第6讲
SpringMVC在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器 InternalResourceViewResolver是SpringMVC中比较常用视图解析器. 网 ...
- [刘阳Java]_MyBatis_映射文件的resultMap标签入门_第4讲
<resultMap>:用于解决实体类中属性和表字段名不相同的问题 id:表示当前<resultMap>标签的唯一标识 result:定义表字段和实体类属性的对应关系 prop ...
- [刘阳Java]_MyBatis_映射文件的常用标签总结_第5讲
MyBatis中常用标签的总结,简单给出自己的总结 MyBatis映射文件中的标签使用介绍1.<select>:用于编写查询语句用的标签 id:表示当前<select>标签的唯 ...
随机推荐
- CVD-ALD前驱体材料
CVD-ALD前驱体材料 ALD前驱体源瓶特点是什么 ALD前驱体源瓶(起泡器)用于固态.液态及气态超纯物料类的封装,涉及微正压.常压.中低压的危险化学品,对源瓶的安全性和洁净度提出严苛的要求. ...
- 使用OneFlow搭建神经网络
使用OneFlow搭建神经网络 在 识别 MNIST 手写体数字 的例子中,通过 flow.layers 和 flow.nn 中提供的接口搭建了一个简单的 LeNet 网络.下面,将通过LeNet来介 ...
- 对端边缘云网络计算模式:透明计算、移动边缘计算、雾计算和Cloudlet
对端边缘云网络计算模式:透明计算.移动边缘计算.雾计算和Cloudlet 概要 将数据发送到云端进行分析是过去几十年的一个突出趋势,推动了云计算成为主流计算范式.然而,物联网时代设备数量和数据流量的急 ...
- Java8 中使用Stream 让List 转 Map使用总结
在使用 Java 的新特性 Collectors.toMap() 将 List 转换为 Map 时存在一些不容易发现的问题,这里总结一下备查. 空指针风险 java.lang.NullPointerE ...
- linux远程和软件包的管理
远程管理 ssh 用户名@对方IP地址 -X 在本地可以运行对方的图形程序 端口 22 [root@room9pc01 ~]# ssh root@172.25.0.11 [root@serve ...
- UF_TRNS 变换相关
Open C uf5940uf5941uf5942 矩阵乘积变换uf5943 平移变换uf5944 缩放变换uf5945 旋转变换uf5946 镜像变换uf5947 实现变换,根据变换矩阵 ...
- 【NX二次开发】开发环境搭建
1.Visual Studio 版本按照下表选择. UG版本 VS版本 NX1847-NX1872版 Visual Studio 2017 Build 19.10.25017 NX12版 Visual ...
- 【ElasticSearch】给ElasticSearch数据库配置慢查询日志
给ElasticSearch引擎配置慢查询日志,可以实时监控搜索过慢的日志.虽然ElasticSearch以快速搜索而出名,但随着数据量的进一步增大或是服务器的一些性能问题,会有可能出现慢查询的情况. ...
- centos7 安装卸载程序rpm使用方法
1.安装 rpm 包: ➢ 基本语法 rpm -ivh RPM 包全路径名称 2.卸载 rpm 包: ➢ 基本语法 rpm -e RPM 包的名称 ➢ 应用案例 删除 firefox 软件包 rpm ...
- 合宙Luat | 一文读懂LuaTask延时,看我如何从《射雕英雄传》角度分析。
武侠小说中,主人公之所以能纵横江湖,常常离不开一样可遇不可求的绝世法宝--武功秘籍.如今勇于尝试的开发者,笃定地告诉后来者:选Luat二次开发,就如同拥有了物联网开发的武功秘籍. 本期让我们通过< ...