目前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表的主键导致数据集的合并,导致的数据丢失。(题外话:这个问题导致的主要原因是我开发的时候表结构是没有主键的,后来有因为业务的变化导致了表关系变化成一对多,表也加上了主键,但是结果集映射关系没有及时更改导致映射数据丢失)