再次阅读了Mybatis官方文档,感觉在自己上手实际项目的情况下能更加容易地理解这份文档,也许是翻译质量不太高的原因,我个人认为这份文档是极不适合初学者将其作为入门资料学习的,这文档其实就是一篇夹杂详细说明的API,我想应该没人通过读API来入门吧。
回归正题,今天我在按教程写练手项目时又遇见了开始接触Mybatis时未曾解决的问题——为何要用实体对象的包装类,这个问题比较大,当时只是照葫芦画瓢,草草按教程的写法写完了事,现在从此问题又引发了一些其他基础问题——配置文件中有关包装类的resultMap标签及其associate、collection子标签的作用是什么,下面一个个归纳。
一、为何要用实体对象的包装类
现在我还无法解决该问题,网上千篇一律地说是根据业务需要,这么些有更好的拓展性,但我目前遇到的业务场景较为简单,用与不用没有差别,用了反而在Mapper.xml中需要额外配置,并令文件内容变得复杂,今后遇到了更复杂的业务需求再来更新这部分内容。
二、resultMap标签
若不写出,Mybatis会自动查找与数据库列名对应的实体类属性名并以上图方式实现映射(Mybatis默认的命名法:数据库列名为以“-”分隔的单词,实体类属性名为以驼峰命名法创造的单词),若无法找到对应的列名则映射的实体相关属性值为null。当属性名和列名不对应,可手动写出,除了这个用法,它还可以根据业务映射未与数据库表对应的实体类,如数据库表记用id关联其他表记录,但是实体类的属性为其他类或一个集合(传说中的一对一,一对多),需要用到associate和collection标签。
三、associate标签(关联)
但是当仅仅需要映射一个以另一个实体类作为属性的实体类时无须使用该标签,只要在实体类中配置相关属性,并写上get方法,在Mapper.xml中查询出相关实体类的对应列的值即可完成自动映射。
四、collection标签(集合)