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

时间:2022-08-27 23:56:57

框架应用: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

  实现结果

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

    一个学生对应了一张卡,你可以通过查询一名学生得知该学生的学生证.

一对多映射

  执行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

  结果

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

    一个年级对应多名学生,你查询这些学生的年级时可以得到同一年级,又或者查询该年级时获取多个学生的名单.

多对多映射

  执行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

  结果

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

  多门课对应多个学生,不同于一对一和一对多关系,表示多对多关系时常常需要一张中间表来保存另外两张特定的表项ID.你查询一门课可以返回学生名单,同时你查询某一学生时可以返回选课名单.

  

源码 

框架应用:Mybatis (三) - 关系映射的更多相关文章

  1. MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟&sol;懒加载

    一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...

  2. 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD

    使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...

  3. Mybatis对象关系映射 one2one&comma;one2many&comma;many2many

    MyBatis中的高级映射一般要借助select元素中的resultMap属性进行实现,通过此属性配置实现一对一,一对多等关系映射的实现 一对一映射:association 一对多映射:collect ...

  4. 第9章 MyBatis的关系映射

    在实际开发中,对数据库的操作通常涉及多张表,涉及了对象和对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关系 9.1 关联关系概述 ...

  5. mybatis的关系映射

    一.多对一的映射关系 举例:根据员工编号查询员工所在部门的部门信息 第一步,需要在多的一方也就是员工实体类中持有一的一方部门实体类的引用 第二步,在dao接口中声明方法 第三步,在mapper中实现该 ...

  6. ssh架构之hibernate&lpar;三&rpar;关系映射

    1.单向多对一 1.映射文件配置 2.model: 测试 1.查询测试 执行顺序,先查询多方,在查询一方,一方采用延迟加载 注意:如果不使用一方的数据,就关闭session,报错,同延迟加载中的报错类 ...

  7. mybatis 对象关系映射例子

    入门 http://legend2011.blog.51cto.com/3018495/908956 增删改 http://legend2011.blog.51cto.com/3018495/9130 ...

  8. &lbrack;刘阳Java&rsqb;&lowbar;MyBatis&lowbar;实体关系映射&lowbar;第8讲

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

  9. 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射

    实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系. 针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...

随机推荐

  1. Ajax异步刷新地址栏url改变(利用Html5 history&period;pushState实现)

    早些时候在博客园参阅了不少资料,然后决定入驻博客园分享自己的开发心得,最近准备转方向筹备着辞职交接工作,所以有点忙碌,搁置了一个月才匆匆写下这么一篇随笔,希望能给大家带来一点帮助吧,资料和学识有限,如 ...

  2. Text Justification &lbrack;LeetCode&rsqb;

    Problem Description:http://oj.leetcode.com/problems/text-justification/ Note: Just be careful about ...

  3. vmware workstation 网络管理

    其实在VMware Workstation下的网络管理是一个比较复杂的东西,如果你不是很了解他的网络,也许你的实验的时候,尤其是涉及到NAT转换.路由等问题的时候,你可能不知道从哪里下手,这时候你可能 ...

  4. Hql处理日期格式化问题

    1. Date date=Calendar.getInstance().getTime(); Date date1=Calendar.getInstance().getTime(); String h ...

  5. POJ - 1006 Biorhythms 周期相遇 两个思路程序

    Description Some people believe that there are three cycles in a person's life that start the day he ...

  6. ckplayer 参数设置详解

    参数   使用说明 f s=0时地为普通的视频地址s=1时是一个网址,网址里存放视频地址s=2时是一个网址,网址里输出xml格式的视频地址s=3时是一个swf文件地址,swf和播放器进行交互读取地址 ...

  7. 读阿里巴巴Java开发手册v1&period;2&period;0之编程规约有感【架构篇】

     不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么 ...

  8. &period;net视频教程代码之《提交注册内容》

    看我的视频之后感觉代码太多不好打或者容易打错的话可以来看我的这里的代码.我的视频地址是 https://www.bilibili.com/video/av12727717/ 类里面的代码: using ...

  9. 转&colon; jvm调优参数总结

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

  10. &period;NET:自定义配置节

    背景 对于编译型应用程序来说,参数化程序行为是非常有必要的,.NET有其标准的配置方法,我们可以可以扩展. 示例 代码 using System; using System.Collections; ...