- 通常实体类中的属性要和数据库表中的字段一致,包括类型,字段名称
-
因此我们在单表查询的时候不需要使用<
resultMap>
指定实体类和表中的字段对应关系,但是如果我们在查询的时候使用了别名,或者属性字段和表的字段不一致,那么我们就需要用 <resultMap>
指定对应关系了
准备
public class Userimplements Serializable{
private static final long serialVersionUID = 6716332190979093860L;
private Integer id;
private String username;
private String password;
private Integer age;
public Integer getAge(){
return age;
}
public void setAge(Integer age){
this.age = age;
}
public Integer getId(){
return id;
}
public void setId(Integer id){
this.id = id;
}
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password = password;
}
@Override
public String toString(){
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", age=" + age + "]";
}
}
create table user(id int primary key auto_increment,username varchar(20),age int ,password varchar(20));
根据id查询用户信息(使用 resultType
指定结果类型)
-
直接在
UserMapper.xml
中配置 <select>即可
<!--
User findUserById(Integer id);
resultType: 指定返回的结果类型
-->
<selectid="findUserById"resultType="cn.tedu.spring.entity.User">
select username,password,age,id from user where id=#{id}
</select>
-
上面的查询返回的结果字段和
User
实体类中的属性字段一致,因此只需要指定 resultType
即可对应。但是如果我们查询的语句如下:
<!--
User findUserById(Integer id);
resultType: 指定返回的结果类型
-->
<selectid="findUserById"resultType="cn.tedu.spring.entity.User">
select username name,password pw,age,id from user where id=#{id}
</select>
-
那么此时返回的结果中,
User
类中的 username
, password
值为 null
,因为没有对应上,这里使用了 别名
使用 resultMap
解决别名或者字段不对应的问题
-
如果实体类中的字段和表中的字段一致,但是查询结果中使用了别名,那么需要使用
<resultMap>
来设置对应关系
-
如果实体类中的字段和表中的字段不一致,那么返回的查询结果即使不使用别名也会不对应,因此此时还是需要使用
<resultMap>
来设置对应关系
<!-- 指定resultMap
type: 指定java类的全名
id: 唯一标识
-->
<resultMaptype="cn.tedu.spring.entity.User"id="UserMap">
<!-- id指定主键的对应关系,这里主键没有使用别名,因此不需要指定对应关系,可以自动对应上
<id column="id" property="id"/> -->
<!-- result : 指定主键之外的属性
column: 查询结果中的字段
property:java类中的对应属性
-->
<resultcolumn="name"property="username"/>
<resultcolumn="pw"property="password"/>
</resultMap>
<!--
User findUserById(Integer id);
resultMap: 指定返回的结果类型为前面定义的resultMap
-->
<selectid="findUserById"resultMap="UserMap">
select username name,password pw,age,id from user where id=#{id}
</select>
@Test
public void testFinduserById(){
//加载Spring的配置文件
AbstractApplicationContext ac
= new ClassPathXmlApplicationContext(
"spring-mvc.xml",
"spring-dao.xml");
//获取UserMapper的bean,这个是spring通过扫描mapper.xml文件自动为mybatis自动创建的,首字母小写
UserMapper userMapper
= ac.getBean(
"userMapper", UserMapper.class);
User user=userMapper.findUserById(3);
System.out.println(user);
ac.close();
}
使用 <resultMap>
来解决多表之间的查询
总结
- 实体类中的属性是和表中的属性一致的,普通的java类或许不相同
-
如果查询返回的结果字段和java类中的属性字段一致,那么就不需要使用
resultMap
,而是能够自动的对应上
-
如果返回查询结果字段和java类中的属性字段不一致,那么就需要使用
resultMap
来设置对应关系了
原文
https://chenjiabing666.github.io/2018/05/04/Mybatis之ResultMap/