[劉陽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();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM