关于使用mybatis查询数据库中的id总是为0的原因

一对多(一个老师对应多个学生)

遇到的问题: 查询到的id总是为0,而实际数据库中的id=1。
关于使用mybatis查询数据库中的id总是为0的原因
此时使用的映射文件是:
关于使用mybatis查询数据库中的id总是为0的原因
而正确的查询结果应该是id=1。
关于使用mybatis查询数据库中的id总是为0的原因
此时使用的映射文件是:
关于使用mybatis查询数据库中的id总是为0的原因
后来,经过了仔细分析,发现了唯一的区别就在于,Teacher类的映射,第一行的那个property="id"与column=“tid”,这儿不写就会导致id=0的情况

本以为到这里,事情就结束了,但是最后又发现了新的问题。

以下以起别名为tid为例:

  1. 情况一:
    关于使用mybatis查询数据库中的id总是为0的原因
    此时property的id对应teacher类中的id,column的tid对应起的别名tid,这是正确的写法,此时可以的到理想的结果。
  2. 情况二(重点):
    关于使用mybatis查询数据库中的id总是为0的原因
    此时property的id对应teacher类中的id,column的id没有对应起的别名tid,此时报了TooManyResultsException,提示查出来的值太多。
    关于使用mybatis查询数据库中的id总是为0的原因
  3. 情况三:
    关于使用mybatis查询数据库中的id总是为0的原因
    此时property的tid没有对应teacher类中的id,column的id对应起的别名tid,此时报了ReflectionException,提示没有对应的setter方法。这个还是比较好理解的。
    关于使用mybatis查询数据库中的id总是为0的原因
  4. 情况四:
    关于使用mybatis查询数据库中的id总是为0的原因

此时我直接不写这一行,就回到了刚才的最初的问题,查到的Id=0,而为什么会导致等于0,却不是报错呢?

这里顺便解决之前在多对一中遇到的类似的情况,即id明明为1却查出来为0的原因:
经过测试,有两种可能会导致这种情况:
1.和一对多一样,直接不写id的这一行,查询出来的结果,id就是0
关于使用mybatis查询数据库中的id总是为0的原因
2.第二种情况与一对多有些许区别,就是column与数据库中的字段对应不上,在一对多的情况下也会导致teacher的id等于0。这时可能会有个疑惑,为什么在一对多中,对应不上的时候(情况二),是显示查询的结果太多,而多对一中,对应不上时,显示的却是id=0?其实答案也很简单,因为一对多时,查询出来的student是用list集合接收的,所以不会出现查询结果太多的情况(因为无论多少个结果,都直接加到集合中就行了),但是多对一中,查询出来的只是一个结果,如果对应不上,就会报查询结果太多的错误。
关于使用mybatis查询数据库中的id总是为0的原因

好了,到这里,所有的疑惑就都解开了

上一篇:数据库笔记3——数据库管理系统体系结构,访问管理,查询优化,恢复机制,并发控制


下一篇:Linux多线程之pthread_self