文档章节

Mybaits一对多映射结果集丢失数据问题

MaxBill
 MaxBill
发布于 06/26 11:05
字数 531
阅读 18
收藏 1

        目前Java Web开发使用最多的项目架构还是MVC,数据库持久层使用一般会选择用mybatis或者hibernate框架。对于mybatis和hibernate之间的区别大家自行百度,今天主要是记录下最近使用mybatis开发遇到的一个问题。

问题描述:A表和B表是一对多的关系,因此在查询的时候使用了mybatis 的一对多结果集映射查询,但是sql语句在库中查出来是10条(分页)数据,但是映射结果集后总是会少几条数据,而且有时候少的条数据会不一样(受查出的数据集影响)

问题还原:下面采用伪代码模拟实际业务场景遇到的问题

@Bean
public class A{

    private String id;

    private String aname;
    
    private List<B> blist;

}


@Bean
public class B{

    private String id;

    private String bname;
    

}
<?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="AMapper" >

  <resultMap id="BaseResultMap" type="A" >
      <result column="aname" property="aname" jdbcType="VARCHAR" />
      <collection property="blist" ofType="B">  
            <id column="sid" property="id"/>
            <result column="bname" property="bname"/>
       </collection>  
  </resultMap>

</mapper>

原因分析:面对这个问题在仔细检查了sql 语句后,确定不是sql语句问题,是结果集映射导致的,于是检查结果集映射代码,发现结果集映射出了问题,没有映射a表的主键导致数据集的合并,导致的数据丢失。(题外话:这个问题导致的主要原因是我开发的时候表结构是没有主键的,后来有因为业务的变化导致了表关系变化成一对多,表也加上了主键,但是结果集映射关系没有及时更改导致映射数据丢失)        

© 著作权归作者所有

共有 人打赏支持
MaxBill
粉丝 34
博文 76
码字总数 58986
作品 1
宝山
后端工程师
你好

@拉风小野驴 你好,想跟你请教个问题:你好,我看到你之前回答别人的帖子,就是关于mybatis封装结果集的,结果集对象中有两个List的属性,根据你之前向别人提供的一对多 我发现封装以后,Lis...

诗念不断
2017/05/02
58
0
Mybatis3.4.x技术内幕(二十一):参数设置、结果封装、级联查询、延迟加载原理分析

Mybatis在执行查询时,其参数设置、结果封装、级联查询、延迟加载,是最基本的功能和用法,我们有必要了解其工作原理,重点阐述级联查询和延迟加载。 1、MetaObject MetaObject用于反射创建对...

祖大俊
2016/09/16
788
0
mybatis核心组件详解——ResultSetHandler(未完待续)

ResultSetHandler(org.apache.ibatis.executor.resultset.ResultSetHandler)结果集处理器: 功能定义如下: public interface ResultSetHandler { <E> List<E> handleResultSets(Statement......

拉风小野驴
2016/02/26
1K
0
Mybatis进阶

基本知识 resultMap constructor–实例化的时候通过构造器将结果集注入到类中 oidArg– ID 参数; 将结果集标记为ID,以方便全局调用 oarg–注入构造器的结果集 id–结果集ID,将结果集标记为...

stutterr
2017/08/03
0
0
Mybatis深入了解(六)----关联查询(高级映射)

一对一查询 resultType resultType:使用resultType实现非常简单,如果POJO中没有包括查询的列名,可以新建扩展类继承父类,并在子类中添加列名对应的属性,即可完成映射。...

令仔很忙
2016/07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

flume -- fileChannel简要分析其过程

flume之event写入FileChannel doPut(event)-->获取共享锁后[log.lockShared();]-->FlumeEventPointer ptr = log.put(transactionID, event); 此处的log.put即将transactionID及event进行后续......

-九天-
22分钟前
2
0
Linux与FreeBSD有什么区别?

基础 许多人所称的“Linux”实际上不是 Linux。Linux 从技术上说只是 Linux 内核,典型的 Linux 发行版则包括了 Linux 内核和许多软件。这是为什么 Linux 有时被称为 GNU/Linux。事实上,许多...

linux-tao
30分钟前
2
0
jQuery学习笔记180924

jQuery - AJAX 简介 什么是 AJAX? AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML)。 简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示...

颖伙虫
43分钟前
1
0
springboot整合vue小试牛刀

序 本文主要研究一下如何在springboot工程整合vue maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-we......

go4it
45分钟前
2
0
使用python的profiler工具

主要用来检测python coding的执行时间 fly profiler

steel7c4
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部