运维开发网

mybatis的延迟加载如何实现?

运维开发网 https://www.qedev.com 2020-04-07 08:25 出处:51CTO 作者:熊熊爬楼梯
mybatis的延迟加载就是按需查询,在需要的时候进行查询。有两张表:图书表(book):图书类型表(category):他们之间通过类型id进行关联,现在我要显示图书类型名,点击类型名再显示该类型下的所有图书。我们可以这样做在类型实体类里面添加一个属性存放该类型下的图书public class Category {     private int cid;     private String

mybatis的延迟加载如何实现?

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

有两张表:

图书表(book):

mybatis的延迟加载如何实现?

图书类型表(category):

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

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

延迟加载如何实现?

mybatis的延迟加载如何实现?

1.  Category实体类同上

2.  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属性。

0

精彩评论

暂无评论...
验证码 换一张
取 消