当我在学习Mybatis中,会发现select查询会有resultMap和resultType参数的设置。可能很多初学者搞不明白两者的区别,和什么时候用。总得来说resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用。根据mybatis的官方文档,是这么说的:从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。下面我来举个栗子~
resultType:
当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。实际上MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
例如如下:
public class User {
private int id;
private String name;
private String 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 password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
返回的是一个javaBean对象,这种情况下大家或许已经发现问题了,那就是javaBean的字段完全对应数据库的字段,这时候再回味官方文档的话:返回的期望类型的类的完全限定名或别名。返回期望类型的类,因为人为的设置了相同的完全限定名,所以这时候mybatis就会自动的给把对应的值赋给resultType所指定对象的属性。但是只是用于相对简单的查询,当然如果javaBean的成员变量不对应数据库的字段,可以设置别名让其对应,依然可以用resultType。
resultMap:同样来自官方的话:外部 resultMap 的命名引用。结果集的映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂映射的情形都能迎刃而解。实际开发中用resultMap在复杂查询中非常有用。例如多表查询,或者有复杂逻辑,因为这时候一个javaBean已经无能为力了,所以resultMap就发挥了他的作用。看下面实例:
图中是两个表连表查询,这时候很难用到resultType 因为所查的返回类型不是一个简单的javaBean了,那么图中的blogResult的什么,请接下来看:
看到了他的魅力一下展示出来,你想他是什么类型就是什么类型,完全是一个智能的javaBea对象,Blog和Author产生关联,使用了外部的结果映射元素来映射关联。当在复杂查询的时候就根据实际情况,使多表关联,建立自己想要的返回对象。总得来说 resultMap在实际开发中了占了80%,针对不对业务和逻辑都能灵活应用。