mybatis--自定义结果集(一对多/多对一)

Posted 祈欢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis--自定义结果集(一对多/多对一)相关的知识,希望对你有一定的参考价值。

1.数据表

## 一对多数据表
## 创建班级表
create table t_clazz(
    `id` int primary key auto_increment,
    `name` varchar(50)
);

## 插入班级信息
insert into t_clazz(`name`) values(javaEE20170228);
insert into t_clazz(`name`) values(javaEE20170325);
insert into t_clazz(`name`) values(javaEE20170420);
insert into t_clazz(`name`) values(javaEE20170515);

## 创建学生表
create table t_student(
    `id` int primary key auto_increment,
    `name` varchar(50),
    `clazz_id` int,
    foreign key(`clazz_id`) references t_clazz(`id`)
);

## 插入班级信息
insert into t_student(`name`,`clazz_id`) values(stu0228_1,1);
insert into t_student(`name`,`clazz_id`) values(stu0228_2,1);
insert into t_student(`name`,`clazz_id`) values(stu0228_3,1);
insert into t_student(`name`,`clazz_id`) values(stu0325_1,2);
insert into t_student(`name`,`clazz_id`) values(stu0325_2,2);
insert into t_student(`name`,`clazz_id`) values(stu0420_1,3);

2.Student类和Clazz类

public class Student {
    private Integer id;
    private String name;
}
public class Clazz {
    private Integer id;
    private String name;
    private List<Student> stus;}

3.ClazzMapper接口

public interface ClazzMapper {
    /**
     * 根据班级id的信息,直接查询出班级信息,以及这个班的全部学生信息。
     */
    public Clazz queryClazzByIdForSample(Integer id);

}

4.ClazzMapper.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.cn.mapper.ClazzMapper">

    <resultMap type="com.cn.pojo.Clazz" id="queryClazzByIdForSample_resultMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!-- 
            collection 标签是专门用来配置集合属性的标签
                property属性设置你要配置哪个集合属性
                ofType 属性设置这个集合中每个元素的具体类型
         -->
        <collection property="stus" ofType="com.cn.pojo.Student">
            <id column="stu_id" property="id"/>
            <result column="stu_name" property="name"/>
        </collection>
    </resultMap>

<!--         /** -->
<!--      * 根据班级id的信息,直接查询出班级信息,以及这个班的全部学生信息。 -->
<!--      */ -->
<!--     public Clazz queryClazzByIdForSample(Integer id); -->
    <select id="queryClazzByIdForSample" resultMap="queryClazzByIdForSample_resultMap">
        select
            t_clazz.*,t_student.id stu_id,t_student.name stu_name
        from 
            t_clazz left join t_student
        on 
            t_clazz.id = t_student.clazz_id
        where 
            t_clazz.id = #{id}    
    </select>
    
</mapper>

 

5.一对多的懒加载

ClazzMapper接口

/**
     * 根据班级id查询班级信息(只查班级)
     */
    public Clazz queryClazzByIdForTwoStep(Integer id);

 

StudentMapper接口

 

public interface StudentMapper {
    /**
     * 根据班级编号查询本班所有学生信息
     */
    public List<Student> queryStudentsByClazzId(Integer clazzId);

}

 

StudentMapper.xml配置文件:

 

<mapper namespace="com.cn.mapper.StudentMapper">

<!--     /** -->
<!--      * 根据班级编号查询本班所有学生信息 -->
<!--      */ -->
<!--     public List<Student> queryStudentsByClazzId(Integer clazzId); -->
    <select id="queryStudentsByClazzId" resultType="com.cn.pojo.Student">
        select id,name from t_student where clazz_id = #{clazzId}
    </select>
    
</mapper>

 

ClazzMapper.xml配置文件:

<resultMap type="com.cn.pojo.Clazz" id="queryClazzByIdForTwoStep_resultMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!-- 
            collection 标签是专门用来配置集合属性的(它可以通过调用一个select查询得到需要集合)。
                property属性设置你要配置哪个集合属性
                select 属性设置你要调用哪个查询
                column 将哪个列的值传递给查询做为参数
         -->
        <collection property="stus" column="id"
            select="com.cn.mapper.StudentMapper.queryStudentsByClazzId" />
    </resultMap>
    
<!--         /** -->
<!--      * 根据班级id查询班级信息(只查班级) -->
<!--      */ -->
<!--     public Clazz queryClazzByIdForTwoStep(Integer id); -->
    <select id="queryClazzByIdForTwoStep" resultMap="queryClazzByIdForTwoStep_resultMap">
        select id,name from t_clazz where id = #{id}
    </select>

 

 

 

以上是关于mybatis--自定义结果集(一对多/多对一)的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 一对多和多对一

mybatis的一对多和多对一

MyBatis一对多,多对一,多对多

Mybatis按结果嵌套处理实现多对一处理和一对多处理

李文杰老师给大家分享一篇干货Mybatis 一对一,一对多,多对一,多对多的理解

mybatis(原理,一对多,多对一查询)