目前Java Web开发使用最多的项目架构还是MVC,数据库持久层使用一般会选择用mybatis或者hibernate框架。对于mybatis和hibernate之间的区别大家自行百度,今天主要是记录下最近使用mybatis开发遇到的一个问题。
问题描述:A表和B表是一对多的关系,因此在查询的时候使用了mybatis 的一对多结果集映射查询,但是sql语句在库中查出来是10条(分页)数据,但是映射结果集后总是会少几条数据,而且有时候少的条数据会不一样(受查出的数据集影响)
问题还原:下面采用伪代码模拟实际业务场景遇到的问题
1@Bean 2public class A{ 3 4 private String id; 5 6 private String aname; 7 8 private List<B> blist; 9 10} 11 12 13@Bean 14public class B{ 15 16 private String id; 17 18 private String bname; 19 20 21} 22 23<?xml version="1.0" encoding="UTF-8" ?> 24<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 25 26<mapper namespace="AMapper" > 27 28 <resultMap id="BaseResultMap" type="A" > 29 <result column="aname" property="aname" jdbcType="VARCHAR" /> 30 <collection property="blist" ofType="B"> 31 <id column="sid" property="id"/> 32 <result column="bname" property="bname"/> 33 </collection> 34 </resultMap> 35 36</mapper>
原因分析:面对这个问题在仔细检查了sql 语句后,确定不是sql语句问题,是结果集映射导致的,于是检查结果集映射代码,发现结果集映射出了问题,没有映射a表的主键导致数据集的合并,导致的数据丢失。(题外话:这个问题导致的主要原因是我开发的时候表结构是没有主键的,后来有因为业务的变化导致了表关系变化成一对多,表也加上了主键,但是结果集映射关系没有及时更改导致映射数据丢失)