MyBatis 查出数据不一致 MyBatis返回数据和数据库查询不一致

2023-05-16

MyBatis 查出数据不一致 MyBatis返回数据和数据库查询不一致

--- MyBatis查询到的数据 和 Sql 查询到的数据不一致

一、背景

        近期工作中,遇到一个MyBatis查询数据不一致的问题,表现是: sql在数据库中查询出10条数据,mybatis 返回的9条 (小于数据库中查到的条数), 没有进行分页等操作,那么平白无故少了的数据取哪儿呢?

        经常一番研究,问题出在 Mybatis的 <resultMap> 标签映射问题上,下面将通过代码的形式,复现当时的问题。

二、问题复现

        1、数据库中有3条数据,两条相互重复的

SELECT * FROM user_info

 

 

        2、userInfoResultMap 正确写法

<resultMap id="userInfoResultMap" type="com.runcode.mybatis.entity.UserInfo">
    <result column="user_no" property="userNo"></result>
    <result column="age" property="age"></result>
    <result column="name" property="name"></result>
</resultMap>


<select id="getList" resultMap="userInfoResultMap" parameterType="com.runcode.mybatis.entity.UserInfo">
    SELECT * FROM user_info
</select>

        2.1、调用接口,返回结果是:

[
    {
        "userNo": 1,
        "name": "小明",
        "age": 18,
        "user": null
    },
    {
        "userNo": 1,
        "name": "小明",
        "age": 18,
        "user": null
    },
    {
        "userNo": 2,
        "name": "小红",
        "age": 22,
        "user": null
    }
]

        3.1、userInfoResultMapNew 出现数据不一致,错误写法

<resultMap id="userInfoResultMapNew" type="com.runcode.mybatis.entity.UserInfo">
    <result column="user_no" property="userNo"></result>
    <result column="age" property="age"></result>
    <result column="name" property="name"></result>

    <association property="user" javaType="com.runcode.mybatis.entity.User">
        <result column="user_id" property="id" />
        <result column="user_age" property="age"></result>
        <result column="user_name" property="name"></result>
    </association>
</resultMap>

<select id="getListNew" resultMap="userInfoResultMapNew" parameterType="com.runcode.mybatis.entity.UserInfo">
    SELECT * FROM user_info
</select>

        3.2、问题是: Mybatis 查询sql Total 返回3条数据

 

        3.3、实际接口返回2条数据

[
    {
        "userNo": 1,
        "name": "小明",
        "age": 18,
        "user": null
    },
    {
        "userNo": 2,
        "name": "小红",
        "age": 22,
        "user": null
    }
]

三、总结

        1、出现MyBatis返回数据比 实际sql查询返回的数据要少的情况,一般可能是 resultMap 标签配置错误,还有一种错误情况,可以参考这篇文章:https://thinkcode.blog.csdn.net/article/details/88095198

        2、一对一的关联查询,可以不用 <association> 标签进行关联查询, 可以直接 对象名.属性 的方式进行配置,如: user.id ,可以避免出现 MyBatis返回数据比,sql查询返回的少。

<resultMap id="userInfoResultMapNew2" type="com.runcode.mybatis.entity.UserInfo">
    <result column="user_no" property="userNo"></result>
    <result column="age" property="age"></result>
    <result column="name" property="name"></result>

    <!-- 对象名.属性, 避免使用 <association> 标签  -->
    <result column="user_id" property="user.id" />
    <result column="user_age" property="user.age"></result>
    <result column="user_name" property="user.name"></result>
</resultMap>


<select id="getListNew2" resultMap="userInfoResultMapNew2" parameterType="com.runcode.mybatis.entity.UserInfo">
    SELECT * FROM user_info
</select>

        2.2、一对一的关联查询,可以不用 <resultMap> 标签进行关系维护,直接用 别名的形式也是可以的,如:b.id as `user.id`

<select id="getListNew3" resultType="com.runcode.mybatis.entity.UserInfo" parameterType="com.runcode.mybatis.entity.UserInfo">
    SELECT
        a.user_no as userNo , a.age , a.name
         , b.id as  `user.id`
         , b.age as `user.age`
         , b.name as `user.name`
    FROM user_info a
    LEFT JOIN `user` b  on b.id = a.user_no
</select>

        3、一对一的关联查询,别用 <association> 进行映射关系维护的,反正不是我用的。

 

MyBatis一对多关联查询XMl配置写法icon-default.png?t=N176https://thinkcode.blog.csdn.net/article/details/88095198

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis 查出数据不一致 MyBatis返回数据和数据库查询不一致 的相关文章

随机推荐