SSM(四)使用resultMap完成查询结果的展现

一、学习目标

掌握使用resultMap实现自定义结果映射

了解resultMap的自动映射级别

二、问题提出

按条件查询得到用户表列表,需要显示指定字段,并显示用户角色(中文表述)。

用户表中的userRole字段记录的是角色id,不是其对应的名称,如何解决?

三、解决方案

修改User的属性,增加userRoleName属性

User.java新增userRoleName属性

private String userRoleName; //用户角色名称
public String getUserRoleName() {
		return userRoleName;
	}

	public void setUserRoleName(String userRoleName) {
		this.userRoleName = userRoleName;
	}

1. 修改查询SQL语句,连表查询

UserMapper.java

public interface UserMapper {
	
	public List getUserList2(User user);
	
}

UserMapper.xml

UserMapperTest.java

@Test
	public void testGetUserList22() {
		List userList = null;
		SqlSession sqlSession = null;
		User user = new User();
		user.setUserName("a");
		user.setUserRole(1);
		try {
			sqlSession = MyBatisUtil.createSqlSession();
			userList = sqlSession.getMapper(UserMapper.class).getUserList2(user);
		} finally {
			MyBatisUtil.closeSqlSession(sqlSession);
		}
		for(User u : userList) {
			logger.debug("testGetUserListByUser userCode: " + u.getUserCode() + "userName: " + u.getUserName() + "userRole: " + u.getUserRoleName());
		}
	}

2. resultMap-自定义映射结果

UserMapper.xml


		
		
		
		
		
	
	

UserMapperTest.java

@Test
	public void testGetUserListUseResultMap() {
		List userList = null;
		SqlSession sqlSession = null;
		User user = new User();
		user.setUserName("a");
		user.setUserRole(1);
		try {
			sqlSession = MyBatisUtil.createSqlSession();
			userList = sqlSession.getMapper(UserMapper.class).getUserListUseResultMap(user);
		} finally {
			MyBatisUtil.closeSqlSession(sqlSession);
		}
		for(User u : userList) {
			logger.debug("testGetUserListByUser userCode: " + u.getUserCode() + "userName: " + u.getUserName() + "userRole: " + u.getUserRoleName());
		}
	}

五、resultMap

描述如何将结果集映射到java对象

在select标签里增加了一个resultMap属性,一个外部resultMap的id,表示返回结果映射到哪一个resultMap结果集。

resultMap的id属性一定是唯一的。

type属性为映射的结果集。

column:数据库中的列名或别名。

property:表示查询出来的属性对应的值赋给实体对象的那个属性。

六、resultType与resultMap

resultType:直接表示返回类型  包括基础数据类型 和 复杂数据类型

resultMap:对外部resultMap的引用  应用场景:数据库字段信息与对象属性不一致,复杂的联合查询,自由控制映射结果。

二者不能同时存在,本质上都是Map数据结果。

七、resultMap自动映射级别

问题:

使用resultMap如何实现自由灵活的控制映射结果,从而达到只对关心的属性进行赋值填充?

结果:

即使没有在resultMap中的result元素中匹配,依然可以显示结果。

提示:

resultMap自动映射匹配前提:字段名和属性名一致

resultMap的自动映射级别(autoMappingBehavior)

PARTIAL(默认):自动匹配所有属性

NONE:禁止自动映射


		
		
	

八、总结

resultMap

  • 数据结构:Map
  • 属性:id type
  • 子节点:result   -property  -column
  • 应用场景:数据库字段名与对象属性名不一致;复杂的联合查询,自由控制映射结果。
  • resultType与resultMap二者不能同时存在

 

你可能感兴趣的:(MyBatis)