延迟加载概念
数据库的延迟加载是指当真正需要数据的时候,才执行数据的加载操作。这样可以避免数据库一些无谓的性能开销。
需求
查询订单信息,关联查询用户信息。其中,用户信息需要延迟加载。
设计
设置延迟加载
MyBatis默认的延迟加载是关闭的。需要在mybatis的配置文件中打开延迟加载。
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false" />
</settings>
SQL语句
首先查询订单信息,在订单信息的基础上查询用户信息。
SELECT
test . purchase . *,
(SELECT name FROM test.user WHERE test.purchase.uid = test.user.id) username,
(SELECT sex FROM test.user WHERE test.purchase.uid = test.user.id) sex
FROM
test.purchase;
POJO
订单POJO以及用户POJO
public class UserPojo {
private int id;
private String name;
private String pass;
private Date birthday;
private int sex;
private String address;
//getter & setter
}
public class OrderPojo {
private int id;
private int uid;
private String number;
private Date createtime;
private String note;
private UserPojo user;
//getter & setter
}
映射文件
- 用户映射文件
<mapper namespace="indi.latch.mybatis.dao.UserDao">
<select id="selectUserByID" parameterType="int" resultType="indi.latch.mybatis.pojo.UserPojo">
SELECT * FROM test.user
<where>
id = #{id}
</where>
</select>
</mapper>
- 订单映射文件
<resultMap id="OrderUserLazyLoadingMap" type="indi.latch.mybatis.pojo.OrderPojo">
<id column="id" property="id"></id>
<result column="uid" property="uid"></result>
<result column="number" property="number"></result>
<result column="note" property="note"></result>
<association property="user" javaType="indi.latch.mybatis.pojo.UserPojo" select="indi.latch.mybatis.dao.UserDao.selectUserByID" column="uid">
</association>
</resultMap>
<select id="selectOrderUserLazyLoading" resultMap="OrderUserLazyLoadingMap">
SELECT
purchase.id, purchase.uid, purchase.number, purchase.note
FROM
test.purchase;
</select>
接口
- 用户接口
public interface UserDao {
public UserPojo selectUserByID (int id);
}
- 订单接口
public interface OrderDao {
public List<OrderPojo> selectOrderUserLazyLoading () throws Exception;
}
测试
@Test
public void selectOrderUsersLazyLoading () throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrderDao orderDao = sqlSession.getMapper(OrderDao.class);
List<OrderPojo> orders = orderDao.selectOrderUserLazyLoading();
//此时加载对应的用户信息
for (OrderPojo order : orders) {
UserPojo user = order.getUser();
System.out.println(user.toString());
}
sqlSession.close();
}
代码
- git@code.csdn.net:xl890727/mybatisdemo.git
- https://code.csdn.net/xl890727/mybatisdemo.git
中的lazyloading分支