mybatis-復雜查詢(一對多,多對一)


一、多對一(例如多個學生對應一個老師)

1、學生實體

package com.me.domain;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
}
View Code

2、老師實體

package com.me.domain;

import lombok.Data;

@Data
public class Teacher {
    private int id;
    private String name;
}
View Code

方法一:按查詢嵌套處理

1、 StudentMapper-getStudentList:

    <select id="getStudentList" resultMap="studentTea">
        select * from student
    </select>
    <resultMap id="studentTea" type="com.me.domain.Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        
        <association property="teacher" column="tid" javaType="com.me.domain.Teacher" select="getTeacher"/>

    </resultMap>
    <select id="getTeacher" resultType="com.me.domain.Teacher">
        select * from teacher where id = #{tid}
    </select>
View Code

2、測試

 @org.junit.Test
    public void getStudentList(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getStudentList();
        for (Student student : studentList) {
            System.out.println(student.toString());
        }
        sqlSession.close();
    }
View Code

3、結果

 

 方法二、案結果嵌套處理(聯表查詢)

1、 StudentMapper-getStudentList2:

   <select id="getStudentList2" resultMap="studentTea2">
        select s.id sid ,s.name sname ,t.id tid ,t.name tname
        from student s,teacher t
        where s.tid = t.id
    </select>
    <resultMap id="studentTea2" type="com.me.domain.Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="com.me.domain.Teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>
View Code

2、測試

@org.junit.Test
    public void getStudentList2(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getStudentList2();
        for (Student student : studentList) {
            System.out.println(student.toString());
        }
        sqlSession.close();
    }
View Code

3、結果

 

 二、一對多(一個老師有多個學生)

1、學生實體

package com.me.domain;

import lombok.Data;

@Data
public class Student2 {
    private int id;
    private String name;
    private int tid;
}
View Code

2、老師實體

package com.me.domain;

import lombok.Data;

import java.util.List;

@Data
public class Teacher2 {
    private int id;
    private String name;
    private List<Student2> students;
}
View Code

方法一:按查詢嵌套處理

1、 TeacherMapper-getTeacher2:

    <select id="getTeacher2" resultMap="teacherStu2">
        select * from teacher where id = #{id}
    </select>
    <resultMap id="teacherStu2" type="com.me.domain.Teacher2" >
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="students" javaType="ArrayList" ofType="com.me.domain.Student2" select="getStudentByTid" column="id"/>
    </resultMap>


    <select id="getStudentByTid" resultType="com.me.domain.Student2">
        select * from student where tid = #{id}
    </select>
View Code

2、測試

 @org.junit.Test
    public void getTeacher2(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher2 teacher = mapper.getTeacher2(1);
        System.out.println(teacher.toString());
        sqlSession.close();
    }
View Code

3、結果

 

  方法二、案結果嵌套處理(聯表查詢)

1、 TeacherMapper-getTeacher:

    <select id="getTeacher" resultMap="teacherStu">
        select s.id sid ,s.name sname ,t.id tid ,t.name tname
        from student s, teacher t
        where s.tid = t.id and t.id =#{id}
    </select>
    <resultMap id="teacherStu" type="com.me.domain.Teacher2">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="com.me.domain.Student2">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>
View Code

2、測試

@org.junit.Test
    public void getTeacher(){
        SqlSession sqlSession =  MyBatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher2 teacher = mapper.getTeacher(1);
        System.out.println(teacher.toString());
        sqlSession.close();
    }
View Code

3、結果

 三、小結

1、集合--collection【一對多】

2、關聯--association【多對一】

3、javaType:用來指定實體類中屬性的類型

4、ofType:用來指定映射到List或集合中的實體類型,泛型中的約束類型。


免責聲明!

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



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