springboot+mybatis一对多查询+懒加载实例
作者:一枚小麻瓜
文章介绍了如何在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”
例如下图:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
