一、学习目标
掌握使用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二者不能同时存在