mybatis的延时加载(懒加载)

本文详细介绍了MyBatis中的懒加载(延时加载)机制,包括其目的、应用场景及如何配置实现。主要针对多表联查场景下的一对一和一对多关系,通过XML映射文件中的association和collection标签进行配置。

Mybatis的延时加载(懒加载)

目的:是为了减少对数据库的使用,减少内存使用,减轻服务其压力。加快查询效率,

延时加载一般是用在了多表联查的时候,延时加载一般是通过设置配置文件来完成的,
延时加载也称之为懒加载或者按需加载,主要是应用到了级联操作

延时加载的使用

表之间的关系是一对一(使用assocation完成延时加载)

局部懒加载::在接口对应的xml文件里面的mapper里面配置xml文件

<!--配置产生级联操作-->
    <resultMap id="userMap" type="com.zhiyou100.pojo.User">
        <!--实体类和表映射-->
        <!--注意:这里  column写的是数据库里面的字段     property写的是实体类的属性-->
        <!--这里只有主键id才需要用到 id column="id" property="id"   -->
        <id column="id" property="id"></id>
        <result column="username" property="username"></result>
        <result column="age" property="age"></result>
        <result column="address" property="address"></result>
        <result column="gender" property="gender"></result>
        <result column="u_rid" property="u_rid"></result>
        <result column="u_did" property="u_did"></result>
        <!--映射级联   让user和role产生关联--><!--这一步就是让两个表产生了关联-->
        <!--因为使用一对一关联所以使用的是association标签-->
        <!--产生延时加载需要加入两个属性  一个是
  select : 填写的需要级联调用, select 对应另外表中的id值全路径  包名 + 类名 + 方法名
  column : 这里面填写的就是级联调用的  select中的id值对应的参数   参数的名称是当前表中的字段名称,或者是查询语句中的列名
  根据用户表中的角色id值  u_rid   查询角色表中的对应的角色信息
  fetchType="lazy"  表示局部不是mybatis-config.xml里面的全部开启开启延时加载  把lazy换成  eager 表示立即加载
  -->
        <association property="role" fetchType="lazy" javaType="role" select="com.zhiyou100.dao.IRoleDao.queryRoleById" column="u_rid" >
            <!--实体类和表映射-->
            <id property="roleId" column="r_id"></id>
            <result property="roleName" column="r_name"></result>
            <result property="roleDesc" column="r_desc"></result>
            <result property="roleUpdateTime" column="r_updateTime"></result>
        </association>

    </resultMap>

全局懒加载设置,在mybatis-config.xml配置

<!--这个必须写在数据源组件之后,包别名之前-->
<!--注意写的位置,如果位置不对就容易出错-->
    <settings>
        <!--开启延时加载策略-->
        <!--这是一个全局性质的加载,那么整个工程里面都会开启延时加载-->
        <!--value里面写true就表示开启懒加载,写false就表示关闭懒加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>

表与表之间的关系是一对多(使用collection实现懒加载)

局部懒加载::在接口对应的xml文件里面的mapper里面配置xml文件

 <!--使用resultMap 让实体类的属性名称和表中的字段名称保持一致-->
    <!--注意:property-->
    <resultMap id="roleMap" type="role">
        <id property="roleId" column="r_id"></id>
        <result property="roleName" column="r_name"></result>
        <result property="roleDesc" column="r_desc"></result>
        <result property="roleUpdateTime" column="r_updateTime"></result>

        <!--一对多关系查询-->
        <!--column  user表中的与role表相连外键是r_id-->
        <!--property 表示要配置呢一个属性名,明显这里是配置属性名users-->
        <!-- ofType  指的是集合中数据的类型,这里明显是user对象 -->
        <collection property="users" ofType="user" select="com.zhiyou100.dao.IUserDao.queryUserByRid" column="r_id" >
            <!--根据角色id值查询对应的所有的用户信息 操作user表的-->
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="birthday" column="birthday"></result>
            <result property="address" column="address"></result>
            <result property="gender" column="gender"></result>
        </collection>
    </resultMap>

两个实体类一个user一个role

public class User implements Serializable {
    /*
    *   两个保持一致:数据类型和名称
    * */
    private int id; // 主键 id
    private String username; // 用户名
    private Integer age;    // 年龄
    private String address; // 地址
    private String gender;  // 性别
    private Integer u_rid;
    private Integer u_did;



public class Role implements Serializable {

    private Integer roleId;
    private String roleName;
    private String roleDesc;
    private Date roleUpdateTime;

    // 角色--->用户   一对多关系
    private List<User> users;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值