resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能
延迟加载resultMap
使用association中的select指定延迟加载去执行的statement的id
实例:查询订单关联用户,用户信息延迟加载
全局配置:SqlMapConfig.xml中添加
<settings>
<!-- 打开延迟加载得开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 将积极加载改为消极加载 即按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
mapper中的配置:
<mapper namespace="dancheng.mybatis.mapper.OrdersMapperCustom">
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE id=#{value}
</select>
<!-- 延迟加载的resultMap -->
<resultMap type="dancheng.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap">
<!-- 对订单信息进行映射配置 -->
<id column="id" property="id"/>
<result column="user_id" property="userId" />
<result column="number" property="number" />
<result column="createtime" property="createtime" />
<result column="note" property="note" />
<!-- 对用户信息进行延迟加载 -->
<association property="user" javaType="dancheng.mybatis.po.User" select="findUserById" column="user_id">
</association>
</resultMap>
<!-- 查询订单关联用户,用户信息需要延迟加载 -->
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
SELECT * FROM orders
</select>
</mapper>
接口定义:
public interface OrdersMapperCustom {
public List<Orders> findOrdersUserLazyLoading() throws Exception;
}
Test:
public class OrdersMapperCustomTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindOrdersUserLazyLoading() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
List<Orders> ordersList = ordersMapperCustom.findOrdersUserLazyLoading();
System.out.println(ordersList);
sqlSession.close();
}
}