[一步是咫尺,一步即天涯]
接上文,本文我们继续来叙述Mybatis中resultMap的高级用法,类似的,我们先给大家叙述基本的概念及用法,具体实例在后文中再做演示,敬请期待!
-------------------------------------------------------------------------------------------------------------------------------------
上文,我们说到了“has-many”这个问题,在Mybatis中提供给我们另外一个非常有用的元素:
下面给出一个典型的
这里的
我们先看看现实场景是什么?
a.一个博客只有一个作者。
b.一个作者有很多文章。
我们先回顾一下,基本增改删查中的select,如下:
此时,如果数据库中存在多条数据,那么我们的dao层接口就需要修改为如下的内容:
public List users;
这里类似的,一个作者有很多文章,那么结果返回的接口写法如下:
private List posts;
首先,我们看看如何使用嵌套查询来加载blog上posts的文章
特别的,这里有几件事情需要注意,尽管,看起来上面的这里和上面的第二:这里有一个全新的属性:"ofType",这个属性是必须的。它用来区分JavaBean(或者字段)属性类型和集合包含的类型。
因此,请各位看官仔细阅读下面这条配置:
在上面的这句话中,javaType并不是必须要存在的,Mybatis能够在多数情况下自动的配置到对应的类型当中,因此,这句话也可以简化为:
首先,我们先来看看SQL语句该怎么写:
我们又一次关联Blog,Post两张表。重点关注简单映射之后的结果列的标签名。现在用“posts”的集合来映射“blog”就可以简写为:
同样的,请各位看官一定要记得id元素的重要性,否则的话,请查看前文中,我们对id的解释。
与此同时,如果我们选择了更长形式,来允许更加可以重用的结果集形式,我们可以参照下面的这种写法:
正如我们在
SELECT * FROM BLOG WHERE ID = #{id}
SELECT * FROM POST WHERE BLOG_ID = #{id}
注意:
这里对于我们映射没有深度,广度,
关于映射,结合,关联是一个非常值得深入研究的方向,本文,我们就先说到这里,更多的内容还请各位看官在使用中不断发现吧!
先来回顾我们上文中给的示例代码,如下:
定义一个
在这个例子中,Mybatis将会从结果集合中得到每一条记录。并且比较其”vehicle type“的值。如果正确的匹配到了某个case的值,它就会使用对应的”resultMap“。换句话说,这种机制完全的忽略了其他的”resultMap“(有特例,待会介绍)。但是,如果没有一个case被匹配到的话,Mybatis将会使用<discriminator>标签外部定义的”resultMap“,因此,如果”carResult“被声明为如下内容:
曾经也许有人已经有人发现了外部映射的定义有点让人反感。所以,下面有一种比较简单写法,如下:
注意:在上面结果集合中,Mybatis能够自动的帮助我们映射对象的属性与列。因此,对于这些例子,大部分都是包含冗余的属性的,换句话说,实际开发中,适度的保持简洁,是一种推荐的做法。”强迫症“还是不要的好!
细心的读者可能已经发现,我们上文中出现过集合类型的返回值,但是并没有定义
1.当自动映射查询结果时,MyBatis会获取sql返回的列名并在java类中查找相同名字的属性(忽略大小写)。 这意味着如果Mybatis发现了ID列和id属性,Mybatis会将ID的值赋给id。
2.通常数据库列使用大写单词命名,单词间用下划线分隔;而java属性一般遵循驼峰命名法。 为了在这两种命名方式之间启用自动映射,需要将mapUnderscoreToCamelCase设置为true。
自动映射的功能也能够在特殊的resultMap下继续工作。在这种情况下,对于每一个结果映射的集合,所有出现在结果集当中的列,如果没有被手动的设置映射,那么它都会被自动的映射。 在接下来的例子中, id 和 userName列将被自动映射, hashed_password 列将根据配置映射。
当使用FULL级别来实现自动映射时,我们处理联系在一起的结果,和在同一行记录中查询几个不同的实体。由此,这里可能存在一些不期望中的结果。(这句话翻得不好)看看下面这个例子吧:
无论自动映射的界别设置为什么,我们都可以通过”autoMapping“属性来控制开启或者关闭自动映射的功能,具体做法如下:
至此,Mybatis最入门---ResultMaps高级用法(下)结束
参考资料:
官方文档:http://www.mybatis.org/mybatis-3