延迟加载又叫懒加载,也叫按需加载,也就是说先加载主信息,需要的时候,再去加载从信息。代码中有查询语句,当执行到查询语句时,并不是马上去DB中查询,而是根据设置的延迟策略将查询向后推迟。
配置之后在对关联对象进行查询时使用延迟加载。
遇到代码中查询语句,马上到DB中执行select语句进行查询。(这种只能用于多表单独查询)
将关联对象的详情(具体数据,如id、name)侵入到主加载对象,作为主加载对象的详情的一部分出现。当要访问主加载对象的详情时才会查询主表,但由于关联对象详情作为主加载对象的详情一部分出现,所以这个查询不仅会查询主表,还会查询关联表。
将关联对象的详情(具体数据,如id、name)侵入到主加载对象,作为主加载对象的详情的一部分出现。当要访问主加载对象的详情时才会查询主表,但由于关联对象详情作为主加载对象的详情一部分出现,所以这个查询不仅会查询主表,还会查询关联表。
减轻DB服务器的压力,因为我们延迟加载只有在用到需要的数据才会执行查询操作。
<settings> <setting name ="aggressiveLazyLoading" value="false"/> <!--开启延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> </settings>
我们用关联查询来实现延迟加载,假设我们现在要查出用户和用户角色。
首先我们在user中添加查询userVo的方法和xml。
<resultMap id="BaseResultMap" type="com.redstar.basemapper.pojo.User"> <id column="id" jdbcType="VARCHAR" property="id"/> <result column="name" jdbcType="VARCHAR" property="name"/> <result column="age" jdbcType="INTEGER" property="age"/> <result column="role_id" jdbcType="INTEGER" property="roleId"/> </resultMap> <resultMap id="userRoleMapSelect" type="com.redstar.basemapper.pojo.UserVo"> <association property="role" fetchType="lazy" column="{id=role_id}" select="com.redstar.basemapper.dao.RoleMapper.getRoleById"/> </resultMap> <select id="getUserVo" resultMap="userRoleMapSelect"> select * from user where id=#{userId} </select> <resultMap id="BaseResultMap" type="com.redstar.basemapper.pojo.Role"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="role_name" jdbcType="VARCHAR" property="roleName" /> </resultMap> <sql id="Base_Column_List"> id, role_name </sql> <select id="getRoleById" resultMap="BaseResultMap"> select * from role where id=#{id} </select>
测试用例
@RunWith(SpringRunner.class) @SpringBootTest public class BaseMapperApplicationTests { @Autowired private UserMapper userMapper; @Autowired private RoleMapper roleMapper; @Test public void getUserVo() { System.out.println(userMapper.getUserVo("12312232")); // System.out.println(userMapper.getUserById("12312232")); // System.out.println(roleMapper.getRoleById(1)); } }
输出结果:
UserVo{user=null, role=Role [Hash = 2140396878, id=1, roleName=admin, serialVersionUID=1]}