一、多表结构

二、一对一

一个学生只属于一个班级。

查询:id name age gender banjiName

<select id="selectStudentBanjiInfo" resultMap="studentMap">

    SELECT s.id,s.name,s.age,s.gender,b.id AS banjiId,b.name AS banjiName

    FROM student AS s INNER JOIN banji AS b

    ON s.banji_id=b.id

</select>





<!--    resultMap最终将结果映射到Student类上-->

    <resultMap id="studentMap" type="Student">

        <id column="id" property="id"/>

        <result column="name" property="name"/>

        <result column="age" property="age"/>

        <result column="gender" property="gender"/>

        <result column="banji_id" property="banjiId"/>

        <association property="banji" javaType="Banji">

            <id column="banjiId" property="id"/>

            <result column="banjiName" property="name"/>

        </association>

 

            </resultMap>

MyBatis中使用association标签解决一对一关联查询,association标签可以使用的属性如下:

  • property:对象属性的名称
  • javaType:对象属性的类型
  • column:数据库中字段的名称(也可能是起的别名)

测试类

@Test

public void testOne2One(){

    SqlSession sqlSession = MyBatisUtil.getSqlSession();

    List<Student> list = sqlSession.selectList("student.selectStudentBanjiInfo");

    for (Student student : list) {

        System.out.println(student);

    }

}

二、一对多

四、懒加载(延迟加载)

1.什么是懒加载

顾名思义,懒加载就是懒得加载,只有使用的时候才进行加载。其实,懒加载也叫延迟加载,主要以应用与Mybatis的关联查询,按照设置的延迟规则,推迟对延迟对关联对象的select查询,例如,我们在用Mybatis进行一对多的时候,先查询出一方,当程序需要多方数据时,mybatis会再次发出sql语句进行查询,减轻了对我们数据库的压力。Mybatis的延迟加载,只对关联对象有延迟设置。

MyBatis关联查询加载时机

1.直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句

2.侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情事,就会执行关联对象的查询

3.深度延迟:只有当真正访问关联对象的详情时,才会执行查询语句

2.全局延迟配置

在MyBatis核心配置类中添加标签

<settings>

    <!-- 延迟加载总开关 -->

    <setting name="lazyLoadingEnabled" value="true"/>

    <!-- 侵入式延迟加载开关 -->

    <setting name="aggressiveLazyLoading" value="true"/>

</settings>

(1.直接加载

直接加载:执行完主对象的查询后,马上执行对关联对象的查询语句

默认情况的延迟加载

<!-- 延迟加载总开关 -->

<setting name="lazyLoadingEnabled" value="false"/>

<!-- 侵入式延迟加载开关 -->

<setting name="aggressiveLazyLoading" value="true"/>

延迟加载的默认设置是直接加载

延迟加载默认情况下是关闭状态(false),延迟加载相当于总闸,总闸是关闭的那么侵入式延迟加载即使是true也不会起作用。

(2.侵入式延迟加载

侵入式延迟:执行完对主对象对查询后,不会执行对关联对象的查询,但当访问主对象的属性详情时,就会执行关联对象的查询

 

<!-- 延迟加载总开关 -->

<setting name="lazyLoadingEnabled" value="true"/>

<!-- 侵入式延迟加载开关 -->

<setting name="aggressiveLazyLoading" value="true"/>

未访问主对象属性

@Test

public void testSelectAll() throws IOException {

    SqlSession sqlSession = MyBatisUtils.getSqlSession();

    List<Student> list = sqlSession.selectList("student.selectAll");

    for (Student student : list) {

        //System.out.println(student);

        //student.getName();

    }

}

访问主对象属性

@Test

public void testSelectAll() throws IOException {

    SqlSession sqlSession = MyBatisUtils.getSqlSession();

    List<Student> list = sqlSession.selectList("student.selectAll");

    for (Student student : list) {

        //System.out.println(student);

        student.getName();

    }

}

3.深度延迟加载

只有当真正访问关联对象的详情时,才会执行查询语句

<!-- 延迟加载总开关 -->

<setting name="lazyLoadingEnabled" value="true"/>

<!-- 侵入式延迟加载开关 -->

<setting name="aggressiveLazyLoading" value="false"/>
@Test

public void testSelectAll() throws IOException {

    SqlSession sqlSession = MyBatisUtils.getSqlSession();

    List<Student> list = sqlSession.selectList("student.selectAll");

    for (Student student : list) {

        //System.out.println(student);

        student.getName();

        //student.getBanji().getName();//访问关联对象的属性

    }

}

 

没有访问关联对象的属性://student.getBanji().getName();

 

访问关联对象的属性:student.getBanji().getName();

 

3.部分延迟配置(在局部配置起作用)

在关联查询collection、association标签上添加 fetchType 属性,lazy表示延迟加载,eager表示立即加载,指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的配置

 <resultMap id="studentMap" type="Student">

    <id column="id" property="id"/>

    <result column="name" property="name"/>

    <result column="age" property="age"/>

    <result column="gender" property="gender"/>

    <result column="banji_id" property="banjiId"/>

    <!--<association property="banji" javaType="Banji">

        <id column="banjiId" property="id"/>

        <result column="banjiName" property="name"/>

    </association>-->

    <association property="banji" column="banji_id" fetchType="lazy"

    select="banji.selectById" javaType="Banji"/>

</resultMap>

 

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐