MyBatis的延迟加载(Lazy Loading)是一种优化技术,用于在需要时才加载关联对象或集合,从而提高性能和效率。以下是对MyBatis延迟加载的详细介绍:
延迟加载的基本概念
延迟加载是指在第一次访问对象的属性时才加载该对象的数据,而不是在对象创建时就立即加载所有的数据。这样可以避免不必要的数据库访问,减少系统的开销和提高性能。
<mapper namespace="com.example.UserMapper">
<resultMap id="userMap" type="com.example.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<association property="address" column="address_id" javaType="com.example.Address" fetchType="lazy">
<id property="id" column="id"/>
<result property="city" column="city"/>
</association>
</resultMap>
<select id="selectUser" resultMap="userMap">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
在上面的示例中,User类中的address属性会被设置为延迟加载。
public class MyBatisExample {
public static void main(String[] args) {
SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.selectUser(1);
System.out.println(user.getUsername()); // 此时不会加载address
System.out.println(user.getAddress().getCity()); // 访问address时才会加载address
}
}
}
aggressiveLazyLoading属性: