java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > springboot+mybatis一对多查询+懒加载

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”

例如下图:

总结

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

您可能感兴趣的文章:
阅读全文