二、输出映射
1、resultType
(1)使用方法
使用resultType进行结果映射时,查询的列名和映射的pojo属性名完全一致,该列才能映射成功。
如果查询的列名和映射的pojo属性名全部不一致,那么映射的对象为空,不会创建pojo对象;
如果查询的列名和映射的pojo属性名有一个一致,那么映射的对象不为空,会创建pojo对象,但是只有映射正确的那一个属性才有值。
(2)输出简单类型
注意,对简单类型的结果映射也是有要求的,查询的列必须是一列,才能映射为简单类型。
当输出结果只有一列时,可以使用ResultType指定简单类型作为输出结果类型。
2.1 需求
综合查询用户总数,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息)。
2.2 Mapper映射文件
<!-- 综合查询用户信息总数,需要传入查询条件复杂,比如(用户信息、订单信息、商品信息) -->
<select id=
"findUsersCount"
parameterType=
"UserQueryVO"
resultType=
"int"
>
SELECT count(
1
) FROM USER WHERE sex = #{userExt.sex} AND username LIKE
'%${userExt.username}%'
</select>
2.3 Mapper接口
//综合查询用户信息总数。学习:resultType输出简单类型
public
int
findUsersCount(UserQueryVO vo);
2.4测试代码
@Test
public
void
testFindUsersCount() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.
class
);
//构造userQueryVO对象
UserQueryVO userQueryVO =
new
UserQueryVO();
// 构造UserExt对象
UserExt userExt =
new
UserExt();
userExt.setSex(
"1"
);
userExt.setUsername(
"小明"
);
userQueryVO.setUserExt(userExt);
int
count = mapper.findUsersCount(userQueryVO);
System.out.println(count);
// 关闭SqlSession
sqlSession.close();
}
(3)输出POjo单个对象和列表
注意:
输出单个pojo对象和pojo列表(盛放pojo对象)时,mapper映射文件中的resultType的类型是一样的,mapper接口的方法返回值不同。
3.1Mapper映射文件
<select id=
"findUsersByName"
parameterType=
"java.lang.String"
resultType=
"cn.itcast.mybatis.po.User"
>
SELECT * FROM USER WHERE username LIKE
'%${value}%'
</select>
3.2Mapper接口
1、输出单个pojo对象
//根据用户名称来模糊查询用户信息
public
User findUsersByName(String username);
2、输出pojo列表
//根据用户名称来模糊查询用户信息列表
public
List<User> findUsersByName(String username);
总结:同样的mapper映射文件,返回单个对象和对象列表时,mapper接口在生成动态代理的时候,
会根据返回值的类型,决定调用selectOne方法还是selectList方法。
2、resultMap
resultMap可以进行高级结果映射(一对一、一对多映射)。
(1)使用方法
如果查询出来的列名和属性名不一致,通过定义一个resultMap将列名和pojo属性名之间作一个映射关系。
1、 定义resultMap
2、 使用resultMap作为statement的输出映射类型。
(2)需求
把下面SQL的输出结果集进行映射
SELECT id id_,username username_,sex sex_FROM USER WHERE id =
1
(3)Mapper映射文件
定义resultMap:
<!-- 定义resultMap -->
<!--
[id]:定义resultMap的唯一标识
[type]:定义该resultMap最终映射的pojo对象
[id标签]:映射结果集的唯一标识列,如果是多个字段联合唯一,则定义多个id标签
[result标签]:映射结果集的普通列
[column]:SQL查询的列名,如果列有别名,则该处填写别名
[property]:pojo对象的属性名
-->
<resultMap type=
"user"
id=
"userResultMap"
>
<id column=
"id_"
property=
"id"
/>
<result column=
"username_"
property=
"username"
/>
<result column=
"sex_"
property=
"sex"
/>
</resultMap>
定义statement:
<!-- 根据ID查询用户信息(学习resultMap) -->
<select id=
"findUserByIdResultMap"
parameterType=
"int"
resultMap=
"userResultMap"
>
SELECT id id_,username username_,sex sex_ FROM USER WHERE id = #{id}
</select>
(4)Mapper接口定义
//根据ID查询用户信息(学习resultMap)
public
User findUserByIdResultMap(
int
id);<strong>
</strong>
定义Statement使用resultMap映射结果集时,Mapper接口定义方法的返回值类型为mapper映射文件中resultMap的type类型。
(5)测试代码
@Test
public
void
findUserByIdResultMapTest() {
// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 通过SqlSession,获取mapper接口的动态代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.
class
);
// 调用mapper对象的方法
User user = userMapper.findUserByIdResultMap(
1
);
System.out.println(user);
// 关闭SqlSession
sqlSession.close();
}