目前Java Web开发使用最多的项目架构仍是MVC,数据库持久层使用通常会选择用mybatis或者hibernate框架。对于mybatis和hibernate之间的区别你们自行百度,今天主要是记录下最近使用mybatis开发遇到的一个问题。java
问题描述:A表和B表是一对多的关系,所以在查询的时候使用了mybatis 的一对多结果集映射查询,可是sql语句在库中查出来是10条(分页)数据,可是映射结果集后老是会少几条数据,并且有时候少的条数据会不同(受查出的数据集影响)sql
问题还原:下面采用伪代码模拟实际业务场景遇到的问题数据库
@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表的主键致使数据集的合并,致使的数据丢失。(题外话:这个问题致使的主要缘由是我开发的时候表结构是没有主键的,后来有由于业务的变化致使了表关系变化成一对多,表也加上了主键,可是结果集映射关系没有及时更改致使映射数据丢失) mybatis