MyBatis 使用resultMap 以及 一对一和一对多

记录一下从hibernate 改成 mybatis 遇到的一些问题

小问题一

运行的时候突然发现的报错:

MyBatis 使用resultMap 以及 一对一和一对多_第1张图片

检查过几遍之后才发现原因: 之前的时候不小心在后面增加了一个斜杠

MyBatis 使用resultMap 以及 一对一和一对多_第2张图片

由于编译器不会对 sql 语句进行检查, 所以运行后台的时候并没有报错。所以当时没发现。

而过几天之后,当运行到这条sql 语句的时候, 后台才报了错。

所以,我们写sql 语句的时候要小心。

以防我们写的不对, 还可以进入mysql 执行一下这条语句看看结果。

MyBatis 使用resultMap 以及 一对一和一对多_第3张图片

发现问题

背景: 分页的时候发现这三列数据为空

效果图:
MyBatis 使用resultMap 以及 一对一和一对多_第4张图片

排查问题:

内部编号这一列的问题很快就排查了出来:

后台与数据库字段名不一致

数据库:
image.png


后台实体:
image.png

所以在我们执行下面这条语句时,在进行实体映射的时候对应不上, 所以为null

 

以往的解决办法

我想起了以前 前后台字段不对应时 的解决办法:

@JsonProperty("internal_number")
private String internalNumber;

然而这个注释并没有用。

因为这个注解是json序列化时,序列化为另一个名称。 前后台就是通过 json 传递数据信息。

而目前情况是后台与数据库的交互, ORM 把数据库映射成对象, 用不到Json。

所以此时我们需要用到myBatis的另一个标签 resultMap

resultMap

resultMap属于mybatis返回操作结果的一个标签,可以用来映射select查询出来结果的集合。

主要作用是将实体类中的字段与数据库表中的字段进行关联映射

resultMap 属性:

属性 描述
id 当前命名空间中的一个唯一标识,用于标识一个结果映射。
type 类的完全限定名
extends 可以继承其他resultMap的一些写好的属性

result属性:

属性 描述
id 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
result 注入到字段或 JavaBean 属性的普通结果
association 一个复杂类型的关联;许多结果将包装成这种类型
collection 一个复杂类型的集合

例子:


    
        
            
             
            
            
            
            
            
            
        
    

这个时候, 我们就可以在 column 属性写上 实体名,在 property 属性写上数据库名。
最后就映射成功。在列表中可以看到这列。

MyBatis 使用resultMap 以及 一对一和一对多_第5张图片

一对一,一对多

剩下两列还为空。 原因是: 剩下两个属性都是对象

MyBatis 使用resultMap 以及 一对一和一对多_第6张图片

这时候就需要用到上面提到过的 association 标签了。

association

它其实就相当于: 一对一OneToOne

用法有两种:

  1. resultMap
 

MyBatis 使用resultMap 以及 一对一和一对多_第7张图片

  1. select

image.png

你可能感兴趣的:(mybatis)