????????延迟加载是一种技术,它允许在真正需要数据的时候才进行加载,而不是一开始就加载所有数据。这种技术可以提高应用程序的性能,因为它可以减少数据库查询的次数,降低网络和数据库的负载。在MyBatis中,延迟加载可以通过多种方式实现,例如使用<association>
和<collection>
元素或实现ResultHandler
接口来自定义结果集的处理方式。
public interface UserDao {
? ? public List<User> findAll();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
? ? ? ? PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
? ? ? ? "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.UserDao">
? ? <resultMap type="User" id="findAllResultMap">
? ? ? ? <id column="id" property="id"></id>
? ? ? ? <result column="username" property="username"/>
? ? ? ? <result column="address" property="address"/>
? ? ? ? <result column="sex" property="sex"/>
? ? ? ? <result column="birthday" property="birthday"/>
? ? ? ? ?<!--
? ? ? ? ? property:属性名
? ? ? ? ? ofType:泛型
? ? ? ? ? select: 要调用的 select 映射的 id
? ? ? ? ? column : 传递给 select 映射的参数
? ? ? ? ? fetchType="lazy":懒加载,默认情况下是没有开启延迟加载的,局部配置
? ? ? ? ?-->
? ? ? ? <collection property="accounts" ofType="Account" fetchType="lazy"
? ? ? ? ? ? ? ? ? ? select="com.by.dao.AccountDao.findAccountById" column="id">?? ?
? ? ? ? </collection>
? ? </resultMap>? ? <select id="findAll" resultMap="findAllResultMap">
? ? ? select * from user
? ? </select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
? ? ? ? PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
? ? ? ? "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.AccountDao">
? ? <select id="findAccountById" resultType="account">
? ? ? ? select * from account where uid = #{id}
? ? </select>
</mapper>?
? ? <!-- 全局配置延迟加载策略 -->
? ? <settings>
? ? ? ? <!-- ?打开延迟加载的开关 ?-->
? ? ? ? <setting name="lazyLoadingEnabled" value="true"/>
? ? </settings>?
<br class="Apple-interchange-newline"><div></div>
? ?@Test? ?public void testFindAll() {? ? ? ?UserDao userDao = sqlSession.getMapper(UserDao.class);? ? ? ?List<User> userList = userDao.findAll();? ? ? ?for(User user : userList){? ? ? ? ? ?System.out.println(user.getUsername());//不查询account? ? ? ? ? ?System.out.println(user.getAccounts());//查询account? ? ? }? }?