转载

Mybatis之ResultMap

  • 通常实体类中的属性要和数据库表中的字段一致,包括类型,字段名称
  • 因此我们在单表查询的时候不需要使用< resultMap> 指定实体类和表中的字段对应关系,但是如果我们在查询的时候使用了别名,或者属性字段和表的字段不一致,那么我们就需要用 <resultMap> 指定对应关系了

准备

  • 创建一个User类
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 + "]";
	}
    
}
  • 创建user表
    • 表中的字段和 User 实体类一致
create table user(id int primary key auto_increment,username varchar(20),age int ,password varchar(20));

根据id查询用户信息(使用 resultType 指定结果类型)

  • 直接在 UserMapper.xml 中配置 <select>即可
    • 使用 resultType 指定返回的结果类型
<!--
	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 类中的 usernamepassword 值为 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> 来解决多表之间的查询

  • 后面的多表关联查询会讲到

总结

  1. 实体类中的属性是和表中的属性一致的,普通的java类或许不相同
  2. 如果查询返回的结果字段和java类中的属性字段一致,那么就不需要使用 resultMap ,而是能够自动的对应上
  3. 如果返回查询结果字段和java类中的属性字段不一致,那么就需要使用 resultMap 来设置对应关系了
原文  https://chenjiabing666.github.io/2018/05/04/Mybatis之ResultMap/
正文到此结束
Loading...