欢迎光临散文网 会员登陆 & 注册

MyBatis实体关系映射

2020-03-31 15:41 作者:汇智知了堂  | 我要投稿

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.zlt.pojo;

public class Teacher {

    private intt_id;

    private String t_name;

    public intgetT_id() {

        return t_id;

    }

    public void setT_id(int t_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.zlt.pojo;

public class Student {

    private int sid;

    private String sname;

    private Teacher teacher;

    public int getSid() {

        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.zlt.mapper.StudentMapper">

    <resultMap type="com.zlt.pojo.Student" id="Student">

        <id property="sid" column="sid"/>

        <result property="sname" column="sname"/>

        <association property="teacher" javaType="com.zlt.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.zlt.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.zlt.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.zlt.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.zlt.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.zlt.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.zlt.mapper.TeacherMapper">

    <resultMap type="com.zlt.pojo.Teacher" id="Teacher">

        <id property="t_id" column="t_id"/>

        <result property="t_name" column="t_name"/>

        <collection property="student" ofType="com.zlt.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.zlt.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.zlt.pojo.Student;

import com.zlt.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.zlt.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.zlt.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实体关系映射的评论 (共 条)

分享到微博请遵守国家法律