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<User> getUserList2(User user);
	
}

UserMapper.xml

<select id="getUserList2" resultType="user" parameterType="user">
		select u.*, r.roleName as userRoleName from smbms_user u, smbms_role r
		where userName like CONCAT('%',#{userName},'%')
		and userRole=#{userRole} and u.userRole=r.id
	</select>

UserMapperTest.java

@Test
	public void testGetUserList22() {
		List<User> 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

<resultMap type="user" id="userMap">
		<result property="id" column="id"/>
		<result property="userCode" column="userCode"/>
		<result property="userName" column="userName"/>
		<result property="userRole" column="userRole"/>
		<result property="userRoleName" column="roleName"/>
	</resultMap>
	<select id="getUserListUseResultMap" resultMap="userMap" parameterType="user">
		select u.*, r.roleName from smbms_user u, smbms_role r
		where userName like CONCAT('%',#{userName},'%')
		and userRole=#{userRole} and u.userRole=r.id
	</select>

UserMapperTest.java

@Test
	public void testGetUserListUseResultMap() {
		List<User> 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:禁止自动映射

<settings>
		<!-- 关闭自动映射 -->
		<setting name="autoMappingBehavior" value="NONE"/>
	</settings>

八、总结

resultMap

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值