ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 什么是延迟加载 在真正使用的时候才发起查询,不用的时候不发起,按需加载. 还有是不管用不用,立即加载 一对多,多对多,通常是延迟加载 多对一,一对一,通常是立即加载 # 开启延迟加载 * lazyLoadingEnabled: 延迟加载的全局开关.当开启时,所有关联对象都会延迟加载.特定关联关系可以通过设置fetchType属性来覆盖该选项的开关状态 * aggressiveLazyLoading: 当开启时,任何方法的调用都会加载该对象的所有属性.否则,每个属性都会按需加载(参考lazyLoadTriggerMethods) 我们要在mybatis的SqlMapConfig.xml文件中添加延迟加载的配置 configuration标签下 ~~~ <!-- 开启延迟加载的支持 --> <settings> <setting name="lazyLoadingEnabled" value="true" /> <setting name="aggressiveLazyLoading" value="false" /> <!-- lazyLoadTriggerMethods:指定哪个对象的方法触发一次延迟加载。 默认值:equals,clone,hashCode,toString,可以阻挡不相干的操作触发,实现懒加载 --> <setting name="lazyLoadTriggerMethods" value="" /> </settings> ~~~ # assocation实现一对一延迟 接口 ~~~ <!-- 建立起对应关系 --> <resultMap id="accountMap" type="com.jdxia.domain.Account"> <id column="id" property="id" /> <result column="uid" property="uid" /> <result column="money" property="money" /> <!-- 关联的属性 --> <!-- select我们要填调用的select映射的全限定id, column我们要写传递给select映射的参数 --> <association property="user" javaType="com.jdxia.domain.User" select="com.jdxia.dao.IUserDao.findById" column="uid" /> </resultMap> <select id="findAll" resultMap="accountMap"> select * from account </select> ~~~ 执行 ~~~ List<Account> accountDaoAll = accountDao.findAll(); ~~~ 查看sql执行几次 ps: toString的话要看你有没有配置lazyLoadTriggerMethods这个了 # Collection实现一对多延迟 Collection结点中也有 select 属性,column 属性 ~~~ <!-- 建立起对应关系 --> <resultMap id="accountMap" type="com.jdxia.domain.Account"> <id column="id" property="id" /> <result column="uid" property="uid" /> <result column="money" property="money" /> <!-- 关联的属性 --> <!-- select我们要填调用的select映射的全限定id, column我们要写传递给select映射的参数 --> <Collection property="user" javaType="com.jdxia.domain.User" select="com.jdxia.dao.IUserDao.findById" column="uid" /> </resultMap> <select id="findAll" resultMap="accountMap"> select * from account </select> ~~~ # 多列值封装map传递 分步查询的时候通过column指定,将对应的列的数据 传递过去,我们有时需要传递多列数据。 使用`{key1=column1,key2=column2...}`的形式 key1就是你Collection里面select哪个id中的`#{}` column1代表你要从这取的值 # 不想延迟加载 在Mybatis核心配制文件中配制延迟加载后全对所有满足延迟加载的SQL进行延迟加载操作。 当某条SQL满足延迟加载条件,但又不想让其延迟加载时可以使用fetchType属性进行控制。 默认情况下fetchType的值为true,表示支持延迟加载,将fetchType值改为false即可取消延迟加载。 ~~~xml <select id="getClassAndStudentByClassID" resultMap="classAndStudentMap"> SELECT class_name, class_code FROM class WHERE class_id = #{class_id} </select> <resultMap id="classAndStudentMap" type="com.cat.pojo.ClassInfo"> <result column="class_code" property="classCode" /> <result column="class_name" property="className" /> <assosiation property="class_code" select="com.cat.mapper.StudentMapper.getStudentsByClassId" fetchType="false" /> </resultMap> ~~~ fetchType属性同样可以作用于collection标签。 `fetchType=eager/lazy`中eager立即加载,lazy延迟加载