Mybatis查询结果集映射问题
当我们使用Mybatis查询数据库时,一定会设置返回值类型的属性值。一般查询都是返回一条或多条数据,往往是使用一个实体类或类的集合来接受。假如我们设置了以下mapper.xml查询信息
<select id="getUsers" resultType="User">
select * from mybatis.user
</select>
一般来说,我们都认为User类的属性名要和数据库的字段名一一对应,然而在我的实验过程中发现,结果集的映射与实体类的属性名关系并不大。
在数据库中有id, name, pwd三个字段。
实体类是如下
package com.lifue.pojo; public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
这是一个很普通的实体类,并且属性名和字段名也是一致的,此时的映射自然是没有问题的。
然而我现在就想把属性pwd改为password。get和set的方法名不变,相应的pwd改为password。
package com.lifue.pojo; public class User { private int id; private String name; private String password; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.password = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return password; } public void setPwd(String pwd) { this.password = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
将实体类属性名改了,但保持了get/set的形参名和方法名不变,此时的查询结果还是可以正常的映射到实体类中。进行到这里,不禁让我有点迷惑。为了找出映射依据,进行进一步的实验。
这一次我将形参名也改了,
public void setPwd(String password) { this.password = password; }
依旧是能够正常映射的。
最后只能修改get/set的方法名了。
public void setPassword(String password) { this.password = password; }
当我对方法名进行修改后,此时mybatis终于无法正常的映射了。
保持着怀疑的心,我又把属性名改回了pwd,而形参名和方法名没有发生改变。
package com.lifue.pojo; public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String password) { this.id = id; this.name = name; this.pwd = password; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return pwd; } public void setPassword(String password) { this.pwd = password; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + pwd + '\'' + '}'; } }
此时的映射又可以正常使用了。
最后发现除了形参名之外,属性名以及set的方法名都与映射有关。

浙公网安备 33010602011771号