MyBatis查询数据,赋值给List集合时,数据缺少的问题及解决

 更新时间:2022年01月20日 09:34:51   作者:咖啡苦涩  
这篇文章主要介绍了MyBatis查询数据,赋值给List集合时,数据缺少的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

MyBatis查询数据赋值给List集合数据缺少

今天在使用MyBatis查询数据时,发现查出来的数据和List集合的大小不一致,如下图所示,Total为3,但是list集合size为2.

  List<ArticleCommentToShow> commentsByArticleId = articleCommentService.getCommentsByArticleId(article.getArticleId());
            logger.info("长度:" + commentsByArticleId.size());
    /**
     * 评论用户头像
     */
    private String imagePath;
    /**
     * 评论用户的用户名
     */
    private String userName;
    /**
     * 评论实体类
     */
    private ArticleComment articleComment;

ArticleCommentShow中包含了一个实体类ArticleComment,在查询的时候我使用了resultMap查询,对应的查询如下图所示

   <!--对应于getCommentsByArticleId的需要字段-->
    <sql id="wholeCommon">
        user_name,image_path,article_comment_id,comment_content, comment_time, to_id,article_comment.user_id,article_comment.article_id,to_user_id
    </sql>
    <!--根据文章ID获取评论-->
    <select id="getCommentsByArticleId" resultMap="CommentsResult">
        select
        <include refid="wholeCommon"/>
        from article_comment,user
        <where>
            (article_id = #{articleId} and article_comment.user_id =  user.user_id)
        </where>
    </select>
    <resultMap id="CommentsResult" type="com.molihub.entity.ArticleCommentToShow">
        <result property="userName" column="user_name"/>
        <result property="imagePath" column="image_path"/>
        <association property="articleComment" javaType="com.molihub.entity.ArticleComment">
            <id property="articleCommentId" column="article_comment_id"/>
            <result property="articleId" column="article_id"/>
            <result property="commentContent" column="comment_content"/>
            <result property="commentTime" column="comment_time"/>
            <result property="toId" column="to_id"/>
            <result property="userId" column="user_id"/>
            <result property="toUserId" column="to_user_id"/>
        </association>
    </resultMap>

经过不断的百度,查资料,发现是因为我的查出来的数据没有主键,因为我查出来的数据格式类似这样:list: [1,a],[2,a],[3,b],这里的字母为实体类,所以当实体类重复的时候,MyBatis会自动去重,用最新的数据替换之前“重复”的数据。

解决办法

1.添加主键,用于区分重复数据,2.禁用二级缓存,否则虽然第一次查出来的数据是正常的,但是再次查询的时候会发现数据依然缺少。

经过修改,resultMap改为如下格式

   <resultMap id="CommentsResult" type="com.molihub.entity.ArticleCommentToShow">
        <id property="articleComment.articleCommentId" column="article_comment_id"/>
        <result property="userName" column="user_name"/>
        <result property="imagePath" column="image_path"/>
        <result property="articleComment.articleId" column="article_id"/>
        <result property="articleComment.commentContent" column="comment_content"/>
        <result property="articleComment.commentTime" column="comment_time"/>
        <result property="articleComment.toId" column="to_id"/>
        <result property="articleComment.userId" column="user_id"/>
        <result property="articleComment.toUserId" column="to_user_id"/>
    </resultMap>

Mybatis查询时数据丢失的问题

公司里的实体类和mapper文件均由mybatis逆向工程生成

之前使用myabtis查询时直接使用注解@select(......)时遇到了一个问题。

结果显示数据库查询没有问题,但是有的数据缺没有插入到指定的字段中,如下图中ID成功存储,Z40_ID,Z40_103到Z40_113均失败。

经过排查得出结论

如果数据库命名很规范比如user_name,用逆向插件生成实体类时该字段会自动转换为userName

但是如果数据库命名形式为:字母(含数字)_字母(含数字)这种情况,自动映射就会失效,就会发生部分数据没有set到指定属性下;

解决办法

对于一些命名不规范的列需要加上注解手动映射

或者直接在mapper.xml文件里用xml方式写sql语句,一般逆向工程都自动生成列的映射规范了;

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

相关文章

  • spring使用OXM进行对象XML映射解析

    spring使用OXM进行对象XML映射解析

    这篇文章主要介绍了spring使用OXM进行对象XML映射解析,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • sharding-jdbc读写分离原理详细解析

    sharding-jdbc读写分离原理详细解析

    这篇文章主要介绍了sharding-jdbc读写分离原理详细解析,很多时候,为了应付DB的高并发读写,我们会采用读写分离技术,读写分离指的是利用数据库主从技术(把数据复制到多个节点中),分散读多个库以支持高并发的读,需要的朋友可以参考下
    2023-12-12
  • Spring实战之XML与JavaConfig的混合配置详解

    Spring实战之XML与JavaConfig的混合配置详解

    大家都知道Spring的显示配置方式有两种,一种是基于XML配置,一种是基于JavaConfig的方式配置。那么下这篇文章主要给大家分别介绍如何在JavaConfig中引用XML配置的bean以及如何在XML配置中引用JavaConfig,需要的朋友可以参考下。
    2017-07-07
  • Spring的自动装配Bean的三种方式

    Spring的自动装配Bean的三种方式

    本篇文章主要介绍了 Spring的自动装配Bean的三种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java调用浏览器打开网页完整实例

    Java调用浏览器打开网页完整实例

    这篇文章主要介绍了Java调用浏览器打开网页的方法,以完整实例形式分析了java打开网页的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Mybatisplus自动填充实现方式及代码示例

    Mybatisplus自动填充实现方式及代码示例

    这篇文章主要介绍了Mybatisplus自动填充实现方式及代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 如何使用Java计算修改文件的MD5值

    如何使用Java计算修改文件的MD5值

    这篇文章主要介绍了如何使用Java计算修改文件的MD5值,MD5是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致,需要的朋友可以参考下
    2023-04-04
  • SpringBoot校园综合管理系统实现流程分步讲解

    SpringBoot校园综合管理系统实现流程分步讲解

    这篇文章主要介绍了SpringBoot+Vue实现校园综合管理系统流程分步讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • 一文带你学会Spring JDBC的使用

    一文带你学会Spring JDBC的使用

    JDBC 就是 数据库开发 操作的 代名词,因为只要是现代商业项目的开发那么一定是离不开 数据库 的,不管你搞的是什么,只要是想使用动态的开发结构,那么一定就是 JDBC ,那么下面来教教大家传统JDBC的使用
    2022-09-09
  • Spring底层事务原理解析

    Spring底层事务原理解析

    Spring事务有可能会提交,回滚、挂起、恢复,所以Spring事务提供了一种机制,可以让程序员来监听当前Spring事务所处于的状态,这篇文章主要介绍了Spring底层事务原理,需要的朋友可以参考下
    2022-12-12

最新评论