框架应用:Mybatis (三) - 关系映射

你有一张你自己的学生证?(一对一)
你这一年级有多少个学生?(一对多)
班上学生各选了什么课?(多对多)
两张表以上的操作都需要联立多张表,而用SQL语句可以直接联立两张表,用工程语言则需要手动完成这些关系对接.如mybatis需要手动配置表之间的关系,作为结果.
一对一映射
创建student, cards 表
DROP TABLE students1;
DROP TABLE cards1;
CREATE TABLE cards1(
id ) PRIMARY KEY,
num )
);
CREATE TABLE students1(
id ) PRIMARY KEY,
name ),
cid ),
CONSTRAINT cid_fk FOREIGN KEY(cid) references cards1(id)
);
,');
,);
table1.sql
创建Student和Card实体类
package com.harry.entity;
import java.io.Serializable;
public class Card implements Serializable {
private Integer id;
private String num;
private Student student;
public Card() {
super();
}
public Card(Integer id, String num, Student student) {
super();
this.id = id;
this.num = num;
this.student = student;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "Card [id=" + id + ", num=" + num + ", student=" + student + "]";
}
}
Card.java
package com.harry.entity;
import java.io.Serializable;
public class Student implements Serializable {
private Integer id;
private String name;
private Card card;
public Student() {
super();
}
public Student(Integer id, String name, Card card) {
super();
this.id = id;
this.name = name;
this.card = card;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", card=" + card + "]";
}
}
Student.java
创建StudentMapper.xml和CardMapper.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="cardNamespace">
<resultMap type="com.harry.entity.Card1" id="cardMap">
<id property="id" column="id" />
<result property="num" column="num" />
</resultMap>
</mapper>
CardMapper.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="studentNamespace">
<!-- 设置返回多个结果,封装于map中 -->
<resultMap type="com.harry.entity.Student1" id="studentMap">
<id property="id" column="id" />
<result property="name" column="name"/>
<association property="card" resultMap="cardNamespace.cardMap"/>
</resultMap>
<select id="findById" parameterType="int" resultMap="studentMap">
SELECT s.id,s.name,c.id,c.num
FROM students1 s INNER JOIN cards1 c
ON s.cid = c.id
AND s.id = #{id}
</select>
</mapper>
StudentMapper.xml
创建StudentCardDao,实现查找一名学生信息时同时获取该学生的学生卡信息
package com.harry.dao;
import org.apache.ibatis.session.SqlSession;
import com.harry.entity.Student;
import com.harry.util.MybatisUtil;
public class StudentCardDao {
public Student findById(Integer id) throws Exception{
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtil.getSqlSession();
return sqlSession.selectOne("studentNamespace.findById",id);
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
MybatisUtil.closeSqlSession();
}
}
}
StudentCardDao.java
实现结果

一个学生对应了一张卡,你可以通过查询一名学生得知该学生的学生证.
一对多映射
执行table2.sql
DROP TABLE students2;
DROP TABLE grades2;
CREATE TABLE grades2(
gid ) PRIMARY KEY,
gname )
);
CREATE TABLE students2(
sid ) PRIMARY KEY,
sname ),
sgid ),
constraINT sgid_fk FOREIGN KEY(sgid) REFERENCES grades2(gid)
);
,'java');
,);
,);
table2.sql
创建两个互相映射的实体类
package com.harry.entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 班级(单方)
* @author AdmINTC
*/
public class Grade2 implements Serializable{
private Integer id;
private String name;
private List<Student2> studentList = new ArrayList<Student2>();
public Grade2(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Student2> getStudentList() {
return studentList;
}
public void setStudentList(List<Student2> studentList) {
this.studentList = studentList;
}
}
Grade2.java
package com.harry.entity;
import java.io.Serializable;
/**
* 学生(多方)
* @author AdmINTC
*/
public class Student2 implements Serializable{
private Integer id;
private String name;
private Grade2 grade;
public Student2(){}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade2 getGrade() {
return grade;
}
public void setGrade(Grade2 grade) {
this.grade = grade;
}
}
Student2.java
创建映射文件
<?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="gradeNamespace">
<resultMap type="com.harry.entity.Grade2" id="grade2Map">
<id property="id" column="gid" />
<result property="name" column="gname"/>
<collection property="studentList" resultMap="studentNamespace.student2Map"/>
</resultMap>
<select id="findGrade2ByName" parameterType="string" resultMap="grade2Map">
SELECT g.gid,g.gname,s.sid,s.sname
FROM grades2 g,students2 s
WHERE g.gid = s.sgid
AND s.sname = #{name}
</select>
</mapper>
Grade2Mapper.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="studentNamespace">
<resultMap type="com.harry.entity.Student2" id="student2Map">
<id property="id" column="sid" />
<result property="name" column="sname"/>
<association property="grade" resultMap="gradeNamespace.grade2Map"/>
</resultMap>
<select id="findAllByName" parameterType="string" resultMap="student2Map">
SELECT s.sid,s.sname,g.gid,g.gname
FROM grades2 g,students2 s
WHERE g.gid = s.sgid
AND g.gname = #{name}
</select>
</mapper>
Student2Mapper.xml
创建dao文件
package com.harry.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.harry.entity.Grade2;
import com.harry.entity.Student2;
import com.harry.util.MybatisUtil;
public class GradeStudentDao {
/**
* 查询java班级有哪些【学生】
*/
public List<Student2> findAllByName(String name) throws Exception{
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtil.getSqlSession();
return sqlSession.selectList("studentNamespace.findAllByName",name);
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
MybatisUtil.closeSqlSession();
}
}
/**
* 查询哈哈属于哪个【班级】
*/
public Grade2 findGradeByName(String name) throws Exception{
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtil.getSqlSession();
return sqlSession.selectOne("gradeNamespace.findGrade2ByName",name);
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
MybatisUtil.closeSqlSession();
}
}
}
GradeStudentDao.java
创建测试方法
@Test
public void Test1vn() throws Exception{
GradeStudentDao dao = new GradeStudentDao();
List<Student2> studentList = dao.findAllByName("java");
for(Student2 s : studentList){
System.out.println(s.getId()+":"+s.getName()+":"+s.getGrade().getId()+":"+s.getGrade().getName());
}
Grade2 grade = dao.findGradeByName("Freddie Flowers");
System.out.println(grade.getId()+":"+grade.getName());
}
MybatisTest.java
结果

一个年级对应多名学生,你查询这些学生的年级时可以得到同一年级,又或者查询该年级时获取多个学生的名单.
多对多映射
执行table3.sql
DROP TABLE middles3;
DROP TABLE students3;
DROP TABLE courses3;
CREATE TABLE students3(
sid ) PRIMARY KEY,
sname )
);
CREATE TABLE courses3(
cid ) PRIMARY KEY,
cname )
);
CREATE TABLE middles3(
sid ),
cid ),
PRIMARY KEY(sid,cid)
);
,'Janie Ferrell');
,'Audrey Lloyd');
,'java');
,'net');
,);
,);
,);
,);
SELECT * from students3;
SELECT * from courses3;
SELECT * from middles3;
table3.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="courseNamespace">
<resultMap type="com.harry.entity.Course3" id="course3Map">
<id property="id" column="cid" />
<result property="name" column="cname"/>
</resultMap>
<select id="findCourseByName" parameterType="string" resultMap="course3Map">
SELECT c.cid,c.cname
FROM students3 s,middles3 m,courses3 c
WHERE s.sid = m.sid
AND m.cid = c.cid
AND s.sname = #{name}
</select>
</mapper>
Course3Mapper.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="studentNamespace">
<resultMap type="com.harry.entity.Student3" id="student3Map">
<id property="id" column="sid" />
<result property="name" column="sname"/>
</resultMap>
<select id="findStudentByName" parameterType="string" resultMap="student3Map">
SELECT s.sid,s.sname
FROM students3 s,middles3 m,courses3 c
WHERE s.sid = m.sid
AND m.cid = c.cid
AND c.cname = #{name}
</select>
</mapper>
Student3Mapper.xml
创建dao
package com.harry.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.harry.entity.Course3;
import com.harry.entity.Student3;
import com.harry.util.MybatisUtil;
public class CourseStudentDao {
/**
* 查询哈哈选学的【课程】
*/
public List<Course3> findCourseByName(String name) throws Exception{
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtil.getSqlSession();
return sqlSession.selectList("courseNamespace.findCourseByName",name);
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
MybatisUtil.closeSqlSession();
}
}
/**
* 查询java课程有哪些【学生】
*/
public List<Student3> findStudentByName(String name) throws Exception{
SqlSession sqlSession = null;
try{
sqlSession = MybatisUtil.getSqlSession();
return sqlSession.selectList("studentNamespace.findStudentByName",name);
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
MybatisUtil.closeSqlSession();
}
}
}
CourseStudentDao.java
创建测试方法
@Test
public void Testnvm() throws Exception{
CourseStudentDao dao = new CourseStudentDao();
List<Course3> courseList = dao.findCourseByName("Janie Ferrell");
for(Course3 c : courseList){
System.out.println(c.getId()+":"+c.getName());
}
List<Student3> studentList = dao.findStudentByName("java");
for(Student3 s : studentList){
System.out.println(s.getId()+":"+s.getName());
}
}
MybatisTest.java
结果


多门课对应多个学生,不同于一对一和一对多关系,表示多对多关系时常常需要一张中间表来保存另外两张特定的表项ID.你查询一门课可以返回学生名单,同时你查询某一学生时可以返回选课名单.
附源码
框架应用:Mybatis (三) - 关系映射的更多相关文章
- MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载
一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...
- 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD
使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...
- Mybatis对象关系映射 one2one,one2many,many2many
MyBatis中的高级映射一般要借助select元素中的resultMap属性进行实现,通过此属性配置实现一对一,一对多等关系映射的实现 一对一映射:association 一对多映射:collect ...
- 第9章 MyBatis的关系映射
在实际开发中,对数据库的操作通常涉及多张表,涉及了对象和对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关系 9.1 关联关系概述 ...
- mybatis的关系映射
一.多对一的映射关系 举例:根据员工编号查询员工所在部门的部门信息 第一步,需要在多的一方也就是员工实体类中持有一的一方部门实体类的引用 第二步,在dao接口中声明方法 第三步,在mapper中实现该 ...
- ssh架构之hibernate(三)关系映射
1.单向多对一 1.映射文件配置 2.model: 测试 1.查询测试 执行顺序,先查询多方,在查询一方,一方采用延迟加载 注意:如果不使用一方的数据,就关闭session,报错,同延迟加载中的报错类 ...
- mybatis 对象关系映射例子
入门 http://legend2011.blog.51cto.com/3018495/908956 增删改 http://legend2011.blog.51cto.com/3018495/9130 ...
- [刘阳Java]_MyBatis_实体关系映射_第8讲
MyBatis既然是一个ORM框架,则它也有像Hibernate那样的一对多,多对多,多对一的实体关系映射功能.下面我们就来介绍一下如何使用MyBatis的实体关系映射 1.MyBatis实体关系映射 ...
- 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射
实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系. 针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...
随机推荐
- Zim学习笔记 (Fedora)
俗话说好记性不如烂笔头, 对于一个搞IT的人来说最好的笔毫无疑问就应该是电脑了, 但最好的本呢? 之前一直在找一款适合自己的笔记软件, 找来找去只有Zim适合自己, 当然对于有编辑器之神之美誉的ema ...
- SSE图像算法优化系列十一:使用FFT变换实现图像卷积。
本文重点主要不在于FFT的SSE优化,而在于使用FFT实现快速卷积的相关技巧和过程. 关于FFT变换,有很多参考的代码,特别是对于长度为2的整数次幂的序列,实现起来也是非常简易的,而对于非2次幂的序列 ...
- 使用Java连接Redis
下载redis的驱动包:Jedis.下载地址:https://mvnrepository.com/artifact/redis.clients/jedis/2.9.0 打开IDE,我使用的是Eclip ...
- 欠了好久的CRM帖子,双11来读。
又一年双11了,觉得天猫双11越来越没特色了. 从折扣,音符旋律到红包,今年15年却找不出往年的热度,只是商家还是一样的急,备着活动目标计划,做着库存价格打标视觉设计这种苦逼的日子. 欠了好久的CRM ...
- 函数作用域中的this问题
首先一起回顾下预解析和作用域吧: 预解析: 浏览器每读到一个script标签或function,先不执行任何代码,会先把整个代码快速的浏览一遍,然后从中 挑出 var 和 function两个关键字 ...
- [js高手之路]javascript腾讯面试题学习封装一个简易的异步队列
这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ),首先我们用闭包 ...
- Spring Cloud官方文档中文版-服务发现:Eureka服务端
官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#spring-cloud-eureka-server 文中例子我做了一些 ...
- Apache Camel之FTP组件学习
写在最前面 哎,最近提了离职,手头的活也基本上清理的差不多了.想着这个把月可以舒服的晃悠晃悠的离开,但是运维的小伙伴总是不架势,走之前还是提了个新需求. 先说下需求吧,我们的系统概括的讲就是一个接口系 ...
- 编辑sass报错:error style.scss (Line 3: Invalid GBK character "\xE5")解决办法
cmd.exe /D /C call C:/Ruby23-x64/bin/scss.bat --no-cache --update header.scss:header.css error heade ...
- 基于大数据的电影网站项目开发之CentOS的安装(一)
一.下载VMware并安装,至于安装教程从网上搜索进行参考 二.下载系统镜像文件,这里使用的是CentOS-6.5-x86_64-bin-DVD1.iso 三.安装镜像文件 运行VMware work ...