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配置写法https://thinkcode.blog.csdn.net/article/details/88095198