在一对一和一对多的实现 我们了解了 mybatis 如何实现一对一和一对多,它的实现方案是通过写一个SQL取出两张表结合在一起的所有数据,然后mybatis稍作处理进行返回。还有一种实现方案是,写两个单独的 SQL ,通过id等业务字段进行关联,然后分别执行,得到最终结果。这种方案,还有一个优势,就是支持延迟加载。
数据准备
user表和blog表的默认内容如下:
项目结构
使用 IDEA 创建 gradle 项目,最终结构如下:
根据id查询博客及其所属用户信息
在 BlogMapper 接口中新增方法:
在 BlogMapper.xml 中增加映射:
findById 方法是和 对应的。 的SQL 只是从 blog表中读取数据,它的resultMap属性值是blogResult,对应。而中的使用了select和column属性:
selecct对应的值是findOwnerOfBlog,意思是找,column的值是user_id,意思是将user_id 的值传到中。
在 Main 类中编写示例代码:
执行结果:
可以看到两个SQL依次执行。
如何设置延迟加载
上面的示例中,在我们未获取 user 信息时,就已经把user信息取出来了。如何做到,用到再加载,也就是延迟加载呢?
很简单,在 mybatis-config.xml 加入:
再次执行上面的示例代码,结果是:
注意,INFO [main] - id:1, title:标题1, content:文本1和INFO [main] - user: User(id=1, name=letian, email=letian@111.com, password=123, blogs=null)之间,mybatis输出了查找用户信息的日志,这就是延迟加载。