所谓结果集映射,解决属性名和字段名不一致的问题。具体操作如下:首先新建一个模块,命名为mybatis-03,同之前一样,我们新建一个和mybatis-01一模一样的模块。其次我们将实体类User中的变量,由“pwd”人为修改为“password”,然后重新生成无参/全参构造方法、Getter、Setter、toString方法等方法。在测试类中我们来测试查询,我们使用getUserById()方法,来通过ID实现查找该用户全部信息的功能。
如此运行之后,结果为如下:
我们发现,这样的查询只查出来了id以及name,而password没有查询出来,分析原因我们大致可以了解到,由于我们在User实体类中修改了其中的变量,而在UserMapper配置文件中,select
*from user where id = #{id}可以看做 select
id,name,pwdfrom user where id = #{id}会去User实体类中找属性pwd,但是实体类User中没有该属性,所以找不到自然是返回null值,这是我们所找出来的原因。接下来给出解决方案:较为笨拙的解决方法为:将select
id,name,pwd from user where id = #{id}语句修改为select
id,name,pwdas password from user where id = #{id},这样可以解决,意思是将寻找到的结果,转化为别名password,与实体类User对应起来就可以找到了,但是这样的方法较为笨拙,没有实际意义,所以,我们接下来介绍另外一种解决方案,由此,
ResultMap结果集映射便诞生了。详细介绍如下:再次描述问题症结所在【即数据库为pwd,而实体类属性定义为password,有冲突】,解决为如下:
原本为:
改后为:在select语句中后加入resultMap结果集映射,随便命名,我们命名为UserMap,然后在其上分对结果集resultMap进行解释,将id中的UserMap指向type中的pojo.User,这样又绕回来了,实际还是相当于getUserById指向pojo.User,只不过在中间加入了resultMap结果集映射的相关内容。
在该结果集映射中,我们编写实体类属性与数据库字段名的匹配关系,如上图所示,column为数据库中的字段名,property为实体类中的属性名。属性名与字段名哪条不一致在这里匹配哪条即可,在我们本例当中,实体类属性名password与数据库字段名pws不匹配,所以在此处我们进行匹配,使用语句:column="pwd"
property="password"/>
如此一来,数据库中的字段名pws即与实体类中的属性名password相匹配了。再次操作测试类进行测试,即可顺利查找相关内容了!