1. 程式人生 > >mybatis中標籤的巢狀使用

mybatis中標籤的巢狀使用

mybatis中和標籤的巢狀使用

實現功能

  • 為了解決A實體類的其中一個私有屬性b,對應的是另一個實體類B的物件,查詢A的所有資訊;

需求

  通過mybatis框架:查詢年級表下的所有班級的詳細資訊。

需求分析

  首先需要建立兩個實體類分別對應兩個表,年級表中有一個私有屬性為班級表的實體類集合;

表和表資料展示

  • tb_grade表
    在這裡插入圖片描述
  • tb_grade表
    在這裡插入圖片描述

第一步:開始新建mybatis專案

第二步:新建實體類

  • 新建兩個實體類,跟資料庫的表形成對應關係;
    年級表中的私有屬性有一個是班級表的集合;
//資料庫中外來鍵體現關係,實體類中,把班級的集合放入年級實體中體現關係(一對多)
    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()));
                    }
                }
            }
        }
    }
}


  • 測試結果:
    在這裡插入圖片描述