MyBatis的延迟加载(懒加载)

MyBatis的延迟加载(懒加载)

所谓的延迟加载是 相对立即加载的说法。 延迟加载: 只有使用到该数据(该对象)时,才会从数据库中查询出来该数据。
好处:避免频繁访问数据库,减少数据库的压力,节约资源。
缺点:因为只有在使用该数据时,才会发送查询数据库SQL,如果有大批量数据需要查询时,因为查询本身也会消耗时间,造成用户等待时间过长,体验度下降。

通过代码来进行演示

通过查询查询员工所有信息,来演示延迟加载
创建员工和部门实体类,并建立多对一的关系

员工映射文件EmployyeeMapper.xml

主要在该配置文件中

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace:命名空间,用于指定当前mapper文件中操作的SQL属于哪一个接口类下面的方法-->
<mapper namespace="com.hp.mybatis.mapper.EmployeeMapper">

    <resultMap id="base_map" type="employee">
        <id property="id" column="id"></id>
        <result property="name" column="name"></result>
        
        <!--建立和部门关系-->
        <association property="dept" javaType="dept" column="dept_id"
                     select="com.hp.mybatis.mapper.DeptMapper.findById"></association>
    </resultMap>
    <!--根据id查询员工,级联查询部门
        不使用左外链接,因为左外链接不会出现延迟加载情况
    -->
    <select id="findById" parameterType="int" resultMap="base_map">
        select id,dept_id,name from employee where id = #{emId}
    </select>

</mapper>

部门映射文件DeptMapper.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace:命名空间,用于指定当前mapper文件中操作的SQL属于哪一个接口类下面的方法-->
<mapper namespace="com.hp.mybatis.mapper.DeptMapper">

    <select id="findById" parameterType="int" resultType="dept">
        select * from dept where id = #{id}
    </select>
</mapper>

流程:在测试类中:调用EmployeeMapper接口中的findById方法,通过sqlMapConfig.xml文件找到EmployeeMapper.xml执行select查询语句,但结果集中含有部门信息需要resultMap去解析结果集,解析过程中association会引用员工的部门id去DeptMapper.xml的select查询该部门信息。查询结果如左连接一样
(当我们不需要查询该员工的部门信息时,即出现了延迟加载,默认延迟加载是禁用的,会查询出该员工的所有信息不包括部门信息)。

sqlMapConfig.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>
    <!--配置properties读取外部文件,注意:上下顺序-->
    <properties resource="com/db.properties"></properties>//数据库配置
    <!--配置开启延迟加载-->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="lazyLoadTriggerMethods" value="clone"/>
    </settings>
    
    <!--别名配置-->
    <typeAliases>
        <!--指定包名,指定后,别名默认就是包下的类名-->
        <package name="com.hp.mybatis.bean"/>
    </typeAliases>

    <!--配置环境-->
    <environments default="abc">
        <!--环境中定义了,要访问的数据库连接池,事务管理类型-->
        <environment id="abc">
            <transactionManager type="JDBC"></transactionManager>
            <!--数据库连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${db.driverName}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--当前包需要和mapper接口类所在包同名,并且当前包需要一级一级创建-->
        <package name="com.hp.mybatis.mapper"/>
    </mappers>

</configuration>

第一次看可能有点迷茫,多看看黄色字体的文字就可以简单理解。

发布了68 篇原创文章 · 获赞 7 · 访问量 2527

猜你喜欢

转载自blog.csdn.net/Cui6023056/article/details/104414278
今日推荐