springboot+mybatis一对多查询+懒加载实例
更新时间:2025年11月19日 11:07:45 作者:一枚小麻瓜
文章介绍了如何在Spring Boot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局启用懒加载,或者在个别需要时关闭懒加载,文章通过代码示例和测试结果,展示了懒加载的实现过程
springboot+mybatis一对多查询+懒加载
直接上图:
- 父表

- 子表

parent相关代码
entity
public class ParentMessage implements Serializable {
private Integer id;
private String value;
private List<ChildMessage> childMessages;
get set ......
}
mapper
@Repository
public interface ParentMessageMapper {
List<ParentMessage> findAll();
ParentMessage findById(Integer id);
}
service
@Service
public class ParentMessageService {
@Autowired
ParentMessageMapper parentMessageMapper;
public List<ParentMessage> findAll(){
return parentMessageMapper.findAll();
}
}
mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.mapper.ParentMessageMapper">
<resultMap id="parentMessageMap" type="parentMessage">
<id column="id" property="id"/>
<result column="value" property="value" javaType="String"/>
<collection fetchType="eager" property="childMessages" column="id" select="com.demo.mapper.ChildMessageMapper.findByOtherId" javaType="List" typeHandler="com.demo.mybatistypehandler.ListTypeHandler"/>
</resultMap>
<select id="findAll" resultMap="parentMessageMap">
select id , value from mk_parentmessage
</select>
<select id="findById" resultType="parentMessage">
select * from mk_parentmessage;
</select>
</mapper>
child 相关代码
entity
public class ChildMessage implements Serializable {
private Integer id;
private String value;
private ParentMessage parentMessage;
}
mapper
@Repository
public interface ChildMessageMapper {
List<ChildMessage> findByOtherId(Integer id);
List<ChildMessage> findAll();
}
service
@Service
public class ChildMessagService {
@Autowired
ChildMessageMapper childMessageMapper;
public List<ChildMessage> findAll(){
return childMessageMapper.findAll();
}
}
mapper.xlm
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.demo.mapper.ChildMessageMapper">
<resultMap id="childMessageMap" type="childMessage">
<id column="id" property="id"/>
<result column="value" property="value"/>
<association property="parentMessage" column="parent_id" select="com.demo.mapper.ParentMessageMapper.findById" javaType="ParentMessage"/>
</resultMap>
<select id="findByOtherId" resultType="childMessage">
select id id, value value from mk_childmessage;
</select>
<select id="findAll" resultMap="childMessageMap">
select * from mk_childmessage;
</select>
</mapper>
Controller测试
@RestController
@RequestMapping("message")
public class MessageController {
@Autowired
ParentMessageService parentMessageService;
@Autowired
ChildMessagService childMessagService;
@GetMapping("findAll")
public ResponseEntity getParentMessage(){
return ResponseEntity.ok(parentMessageService.findAll(););
}
}
返回结果:

懒加载
配置属性
mybatis.configuration.lazy-loading-enabled=true #false 为按需加载 mybatis.configuration.aggressive-lazy-loading=false
这样就实现了全局懒加载,若个别需要关闭,可用 fetchType=“eager”
例如下图:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java经典算法汇总之选择排序(SelectionSort)
选择排序也是比较简单的一种排序方法,原理也比较容易理解,选择排序在每次遍历过程中只记录下来最小的一个元素的下标,待全部比较结束之后,将最小的元素与未排序的那部分序列的最前面一个元素交换,这样就降低了交换的次数,提高了排序效率。2016-04-04
log4j中logger标签中additivity属性的用法说明
这篇文章主要介绍了log4j中logger标签中additivity属性的用法说明,基于很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12
Java利用trueLicense实现项目离线证书授权操作步骤
文章介绍了如何使用trueLicense实现离线授权控制,包括生成公私钥、创建证书校验模块、生成证书模块和测试模块,通过这种方式,可以控制用户使用的项目模块、授权周期、使用的设备和服务器,感兴趣的朋友跟随小编一起看看吧2024-11-11
Java8的Stream()与ParallelStream()的区别说明
这篇文章主要介绍了Java8的Stream()与ParallelStream()的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07


最新评论