mybatis如何实现延迟加载?mybatis延迟加载实现原理详解

很多刚刚接触mybatis的人都不知道应该如何去实现延迟加载,那么具体的要怎样才能实现呢?下面就让我们一起详细的来进行一下了解。

其实mybatis延迟加载就是按需查询(也就是在需要时进行查询)。

下面有两张表,分别是图书表(book)和图书类型表(category)。

mybatis如何实现延迟加载

mybatis如何实现延迟加载

他们是通过类型id进行关联的,现在的话要显示图书类型名,点击类型名再显示这个类型下面的所有的图书。

可以在类型实体类里面添加一个属性存放这个类型下面的图书:

public class Category {
    private int cid;
    private String cname;
    private List
<Book> books;

//省略get set
}

将图书类型以及图书一次性查询出来,下面是SQL语句

 SELECT book.*,cname FROM book,category WHERE book.cid = category.cid

这样的话能够完成功能,可是,我们只需要显示图书类型,点击时,才显示这个类型的图书,假如,可以做到开始只查询类型,点击类型时再查询这个类型的图书,那么,就不需要再进行两表联查了,能够提高查询的效率,也非常的节省内存,这也就是延迟加载。

那么延迟加载究竟要怎样才能够实现呢?

Category实体类同上,UserDao.xml:

<mapper namespace="cn.xh.dao.UserDao">
    <select id="findCategoryWithLazingload" resultMap="categoryMap">
        select * from category
    </select>
    <resultMap id="categoryMap" type="cn.xh.pojo.Category">
        <id column="cid" property="cid"></id>
        <result column="cname" property="cname"></result>
        <collection property="books" column="cid" select="findBookWithLazy"></collection>
    </resultMap>
    <select id="findBookWithLazy" parameterType="int" resultType="cn.xh.pojo.Book">
        select * from book where cid = #{cid}
    </select>
</mapper>

只有在点击类型时才需要查询这个类型下面的图书,所以的话,这里没有用两表联查,而是选择了将类型表的查询语句和图书表的查询语句分开。

注意,要重点的看一下配置:

<collection property="books" column="cid" select="findBookWithLazy"></collection>

collection,association是支持延迟加载的。

select属性表示要执行的sql语句,column表示执行sql语句要传的参数,这个参数是select * from category查询出来的字段cid,property=”books”表示查询出来的结果给到books属性。

关于mybatis怎样去实现延迟加载你都了解了吗?更多相关知识,请继续通过关注奇Q工具网的常见问题栏目来进行了解吧。

推荐阅读:

hibernate与mybatis区别在哪?都有哪些优缺点?

mybatis有什么用?要怎么配置?

mybatis面试题常见问题及答案