介绍自动映射之前先看一下手动映射,如下:
注意上面的resultMap元素中有4行配置,如下:
这4行代码用于配置sql结果的列和OrderModel对象中字段的映射关系。
大家有没有注意到,映射规则中column和property元素的值都是一样,mybatis中支持自动映射配置,当开启自动映射之后,当sql的列名和Model中的字段名称是一样的时候(不区分大小写),mybatis内部会进行自动映射,不需要我们手动去写上面的4行映射规则。
下面我们将上面的示例改成自动映射的方式,如下:
注意上面的resultMap中的autoMapping属性,是否开启自动映射,我们设置为true,这样mybatis会自动按照列名和Model中同名的字段进行映射赋值。
上面两个配置最后查询结果是一样的,都会将查询结果对应的4个字段的值自动赋值给OrderModel中同名的属性。【需要注意的是其实不写 autoMapping 也是可以的 ,因为 autoMappingBehavior 默认值为 PARTIAL ,后面再进行说明 】
2、自动映射开关mybatis 中自动映射主要有2种配置,一种是全局的配置,对应用中所有的 resultMap 起效,这个是在 mybatis 配置文件中进行设置的;另外一种是通过 resultMap 的autoMapping 属性进行配置。
mybatis 判断某个 resultMap 是否开启自动映射配置的时候,会先查找自身的autoMapping 属性,如果这个属性设置值了,就直接用这个属性的值,如果resultMap 元素的 autoMapping 属性没有配置,则走全局配置的自动映射规则。
- mybatis自动映射全局配置
在mybatis全局配置文件中加入下面配置:
autoMappingBehavior 值来源于枚举:org.apache.ibatis.session.AutoMappingBehavior,源码:
public enum AutoMappingBehavior {
NONE,
PARTIAL,
FULL
private AutoMappingBehavior() {
}
}
- NONE:关闭全局映射开关
- PARTIAL:对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射,这个也是默认值。
- FULL:自动映射所有属性。
小提示:settings元素中有很多配置,这些配置最后都会被解析成org.apache.ibatis.session.Configuration的属性,源码位于org.apache.ibatis.builder.xml.XMLConfigBuilder#settingsElement方法中。
看到这里,你应该明白前面说过的 autoMapping 不加其实也是可以的,因为autoMappingBehavior 默认为 PARTIAL。
下面我们来演示一下 autoMappingBehavior NONE 配置的效果,其他请读者自行测试。
mybatis-config.xml 加入配置
OrderMapper.xml
测试用例
try (SqlSession sqlSession = this.sqlSessionFactory.openSession(true);) {
OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
OrderModel orderModel = mapper.getById4(2);
}
运行结果:
DEBUG [main] - ==> Preparing: SELECT a.id, a.user_id userId, a.create_time createTime, a.up_time upTime FROM t_order a WHERe a.id = ? DEBUG [main] - ==> Parameters: 2(Integer) DEBUG [main] - <== Total: 1 null
从输出中可以看到最后一样输出结果为null,sql实际上返回的是有结果的,但是结果映射的时候返回的是空。
结果解释:
由于mybatis全局配置中将autoMappingBehavior的值置为了NONE,表示全局自动映射被关闭了,而resultMapper中的orderModelMap4没有配置autoMapping属性,所以最终这个查询结果不会自动映射,所以最后查询结果为null。
- autoMapping 使用
上面我们有说过,当在resultMap中指定了autoMapping属性之后,这个resultMap的自动映射就受autoMapping属性的控制,和mybatis中全局映射配置(autoMappingBehavior)行为无关了。
自动装配并不是那么好玩,玩不转可能带来一些隐患,比如:
运行上面的返回的结果中 id 为 null 【感兴趣的自行测试】,为什么会是 null ?主要是因为下面这一行代码:
上面这个配置中有个column属性,指定的是id,此时mybatis认为你对id字段手动指定了映射关系,就跳过了对id字段到OrderModel.id属性的自动映射,所以导致OrderModel对象的id属性没有赋值,此时需要我们在orderModelMap8手动指定id的映射规则,如下:
再去运行测试用例就正常了。
3、总结一下对于咱们开发来说,自动映射确实可以帮助我们节省一些代码,不过也存在一些隐患,我们希望自己开发的系统是健壮的,建议大家写mapper xml的时候,还是花点时间将映射的配置都给写上去,这样能够杜绝一些隐患,使我们的系统更稳定。
参考文章:http://www.itsoku.com/course/4/79



