mybatis中<resultMap>和<collection>标签的嵌套使用

版权声明:A_芦瑞华_i_DO.欢迎转载 https://blog.csdn.net/weixin_43067223/article/details/84106692

mybatis中和标签的嵌套使用


实现功能

  • 为了解决A实体类的其中一个私有属性b,对应的是另一个实体类B的对象,查询A的所有信息;
  • A和B分别对应两站表,A和B之间有外键关系,通过b属性将两张表关联起来。

需求

  通过mybatis框架:查询年级表下的所有班级的详细信息。

需求分析

  1. 首先需要创建两个实体类分别对应两个表,年级表中有一个私有属性为班级表的实体类集合;
  2. 然后创建接口,接口里面写查询的方法。
  3. 配置mybatis-config.xml文件连接数据库。
  4. 配置mapper.xml文件,编写sql语句。使用<resultMap>和<collection>标签。
  5. 编写测试类,运行程序。

表和表数据展示

  • tb_grade表
    在这里插入图片描述
  • tb_grade表
    在这里插入图片描述

第一步:开始新建mybatis项目

前两天的帖子,此处省略。
参考请看:https://blog.csdn.net/weixin_43067223/article/details/84028712

第二步:新建实体类

  • 新建两个实体类,跟数据库的表形成对应关系;
    年级表中的私有属性有一个是班级表的集合;
//数据库中外键体现关系,实体类中,把班级的集合放入年级实体中体现关系(一对多)
    private List<Classes> classesList;
  • Classes–>tb_class
package com.aaa.mb.entity;

import java.util.Date;

/**
 * className:Classes
 * discription:Classes实体类,对应数据库表的tb_class
 * author:luRuiHua
 * createTime:2018-11-15 16:31
 */
public class Classes {
    //私有属性
    private Integer classId;
    private String className;
    private Integer gradeId;
    private Integer classsNum;
    private Date beginTime;
    private Date endTime;
    //生成get和set方法
    public Integer getClassId() {
        return classId;
    }

    public void setClassId(Integer classId) {
        this.classId = classId;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public Integer getGradeId() {
        return gradeId;
    }

    public void setGradeId(Integer gradeId) {
        this.gradeId = gradeId;
    }

    public Integer getClasssNum() {
        return classsNum;
    }

    public void setClasssNum(Integer classsNum) {
        this.classsNum = classsNum;
    }

    public Date getBeginTime() {
        return beginTime;
    }

    public void setBeginTime(Date beginTime) {
        this.beginTime = beginTime;
    }

    public Date getEndTime() {
        return endTime;
    }

    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }
}

    • Grade–>tb_grade
package com.aaa.mb.entity;

import java.util.Date;
import java.util.List;

/**
 * className:Grade
 * discription:Grade的实体类,对应数据库的tb_grade表
 * author:luRuiHua
 * createTime:2018-11-15 16:33
 */
public class Grade {
    //私有属性
    private Integer gradeId;
    private String gradeName;
    private Date addTime;

    //数据库中外键体现关系,实体类中,把班级的集合放入年级实体中体现关系(一对多)
    private List<Classes> classesList;
    //生成get和set方法
    public Integer getGradeId() {
        return gradeId;
    }

    public void setGradeId(Integer gradeId) {
        this.gradeId = gradeId;
    }

    public String getGradeName() {
        return gradeName;
    }

    public void setGradeName(String gradeName) {
        this.gradeName = gradeName;
    }

    public Date getAddTime() {
        return addTime;
    }

    public void setAddTime(Date addTime) {
        this.addTime = addTime;
    }

    public List<Classes> getClassesList() {
        return classesList;
    }

    public void setClassesList(List<Classes> classesList) {
        this.classesList = classesList;
    }
}

第三步:创建dao层接口

package com.aaa.mb.dao;

import com.aaa.mb.entity.Grade;

import java.util.List;

/**
 * className:GradeDao
 * discription:tb_grade表的接口
 * author:luRuiHua
 * createTime:2018-11-15 17:54
 */
public interface GradeDao {
    /**
     * 查询tb_grade连接tb_class表
     * @return
     */
    List<Grade> getGradeList();
}

第四步:新建mapper.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.aaa.mb.dao.GradeDao">
    <!--查询年级表底下的所有班级的详细信息-->
    <!--查询List<Grade>集合-->
    <select id="getGradeList" resultMap="getGradeAndClasses">
        select g.gradename,c.classname,c.classnum,c.begintime,c.endtime
        from tb_grade g
        join tb_class c
        on g.gradeid = c.gradeid
    </select>
    <!--查询到所有的Grade对象-->
    <resultMap id="getGradeAndClasses" type="com.aaa.mb.entity.Grade">
        <id column="gradeid" property="gradeId"></id>
        <result column="gradename" property="gradeName"></result>
        <result column="addtime" property="addTime"></result>
        <!--查询到所有的Grade底下的Classes对象-->
        <collection property="classesList" ofType="com.aaa.mb.entity.Classes">
            <id column="classid" property="classId"></id>
            <result column="classname" property="className"></result>
            <result column="gradeid" property="gradeId"></result>
            <result column="classsnum" property="classsNum"></result>
            <result column="begintime" property="beginTime"></result>
            <result column="endtime" property="endTime"></result>
        </collection>
    </resultMap>
</mapper>

代码解析

  1. namespace对应dao层接口的限定名
<mapper namespace="com.aaa.mb.dao.GradeDao">
  1. <select>标签中的id属性–>dao层接口的方法名称
    resultMap属性–>返回值类型是一个集合,该集合还可以嵌套集合(必须跟底下的标签里面的 id属性相对应

  2. 这里具体到这个方法,getGradeList方法的返回值类型为List<Grade>,起名字时候resultMasp属性可以自己定义,但是必须给<resultMap>标签里面的id属性名相同;

<select id="getGradeList" resultMap="getGradeAndClasses">
  1. <resultMap>标签里面的type属性为List集合里面的对象的限定名;
<resultMap id="getGradeAndClasses" type="com.aaa.mb.entity.Grade">
  1. <collection>标签里面的property属性为自己起的名字,这里意思为Grade类中的代表Classes类的私有属性的集合,因为一个年级底下对应的很多班级;ofType属性为每一个Classes对象的限定名;
<collection property="classesList" ofType="com.aaa.mb.entity.Classes">
<id column="classid" property="classId"></id>
  1. <id>标签中的column属性为表中的字段名(不区分大小写),property属性为本类的私有属性所设置的变量名;
<result column="classname" property="className"></result>

步骤五:配置连接池mybatis-config.xml

  • 连接数据库,并且配置mapper/GradeDaoMapper.xml;
  • 代码展示:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--环境配置,可以配置多个环境链接不同的数据源-->
    <environments default="development">
        <environment id="development">
            <!--事务管理器  JDBC 自定处理事务  MANAGERD 事务交给容器管理-->
            <transactionManager type="JDBC"/>
            <!--数据源配置,链接数据库的4要素 POOLED 使用链接池-->
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
                <property name="username" value="scott"/>
                <property name="password" value="luruihua"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/GradeDaoMapper.xml"/>
    </mappers>
</configuration>

最后一步:测试

import com.aaa.mb.dao.GradeDao;
import com.aaa.mb.entity.Classes;
import com.aaa.mb.entity.Grade;
import com.aaa.mb.util.SqlSessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.text.SimpleDateFormat;
import java.util.List;

/**
 * className:test
 * discription:
 * author:luRuiHua
 * createTime:2018-11-15 19:08
 */
public class test {
    @Test
    public void getGradeAndClasses() {
        //通过SqlSessionFactoryUtil获取sqlSession对象
        SqlSession sqlSession = SqlSessionFactoryUtil.getSession();
        //sqlSession的gatMapper方法获取接口
        GradeDao gradeDao = sqlSession.getMapper(GradeDao.class);
        //拿到List<Grade>集合
        List<Grade> gradeList = gradeDao.getGradeList();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        if (gradeList != null && gradeList.size() > 0) {
            //遍历List<Grade>集合,获取Grade对象
            for (Grade grade : gradeList) {
                System.out.println("年级名称为:" + grade.getGradeName() + ",该年级创建的时间为:" + simpleDateFormat.format(grade.getAddTime()));
                //获取该年级(Grade)下的所有班级
                List<Classes> classesList = grade.getClassesList();
                if (classesList != null && classesList.size() > 0) {
                    for (Classes classes : classesList) {
                        System.out.println("-----" + grade.getGradeName() + "下的班级数量为:" + classesList.size());
                        System.out.println("--------班级名称为:" + classes.getClassName() + ",班级人数为:" + classes.getClasssNum() + ",开班时间为:" + simpleDateFormat.format(classes.getBeginTime()));
                    }
                }
            }
        }
    }
}


  • 测试结果:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43067223/article/details/84106692