mybatis怎么实现延迟加载?针对这个问题,今天小编总结这篇有关mybatis实现延迟加载的文章,可供感兴趣的小伙伴们参考借鉴,希望对大家有所帮助。

mybatis的延迟加载就是按需查询,在需要的时候进行查询。

有两张表:

图书表(book):

图书类型表(category):

他们之间通过类型id进行关联,现在我要显示图书类型名,点击类型名再显示该类型下的所有图书。

我们可以这样做在类型实体类里面添加一个属性存放该类型下的图书

public classCategory {
private intcid;
privateStringcname;
privateList<Book>books;

//省略get set
}

一次性的把图书类型和图书查询出来,Sql语句如下:

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

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

延迟加载如何实现?

1. Category实体类同上

2. UserDao.xml:

<mappernamespace="cn.xh.dao.UserDao">
<selectid="findCategoryWithLazingload"resultMap="categoryMap">
select*from category
</select>
<resultMapid="categoryMap"type="cn.xh.pojo.Category">
<idcolumn="cid"property="cid"></id>
<resultcolumn="cname"property="cname"></result>

<collectionproperty="books"column="cid"select="findBookWithLazy"></collection>
</resultMap>

<selectid="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实现延迟加载的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。