专注于Java领域优质技术,欢迎关注
作者:清幽之地
前言
在Mybatis中,有一个强大的功能元素resultMap。当我们希望将JDBC ResultSets中的数据,转化为合理的Java对象时,你就能感受到它的非凡之处。正如其官方所述的那样:
resultMap元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达数千行的代码。ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
一、字段映射
在Mybatis中,最简单的结果映射方式,就是通过类型别名typeAliases来处理。
如果要这样做,那么第一步需要配置实体类包的路径:
mybatis.type-aliases-package=com.xxx.entity
该路径下的所有类,就会被注册到TYPE_ALIASES容器。我们在指定返回值类型的时候,就直接用别名即可。
比如,我们有一个User类:
![29457bae8cb51961c291d2eb4a1596e7.png](https://img-blog.csdnimg.cn/img_convert/29457bae8cb51961c291d2eb4a1596e7.png)
如果数据库中表的字段与User类的属性名称一致,我们就可以使用resultType来返回。
![e8bfb39a7ae10bed82d09de210d5b288.png](https://img-blog.csdnimg.cn/img_convert/e8bfb39a7ae10bed82d09de210d5b288.png)
当然,这是理想状态下,属性和字段名都完全一致的情况。但事实上,不一致的情况是有的,这时候我们的resultMap就要登场了。
如果User类保持不变,但SQL语句发生了变化,将id改成了uid。
![789aabe5a89af91613a44bd88dd46a75.png](https://img-blog.csdnimg.cn/img_convert/789aabe5a89af91613a44bd88dd46a75.png)
那么,在结果集中,我们将会丢失id数据。这时候我们就可以定义一个resultMap,来映射不一样的字段。
然后,我们把上面的select语句中的resultType修改为resultMap="getUserByIdMap"。
这里面column对应的是数据库的列名或别名;property对应的是结果集的字段或属性。
这就是resultMap最简单,也最基础的用法:字段映射。
下面,我们看看其他几种标签都是怎么应用的。
![52650ca0c945bd37050840d76194f496.png](https://img-blog.csdnimg.cn/img_convert/52650ca0c945bd37050840d76194f496.png)
二、构造方法
如果你希望将结果注入构造方法里,就可以用到constructor元素。
比如,我们的User类增加了一个构造方法:
public User(String id, String name) {this.id = id+"--------";this.username = name+"--------";}
我们需要在resultMap中定义constructor元素:
![69b3b19942a526d954f9d89eb6ff7952.png](https://img-blog.csdnimg.cn/img_convert/69b3b19942a526d954f9d89eb6ff7952.png)
其中,column代表数据库字段名称或者别名;name则是构造方法中的参数名称;javaType指定了参数的类型。
如你所想,这样指定构造方法后,我们结果集中的id和username属性都会发生变化。
{ "id": "1001--------