前言:昨天写了输入映射,今天整理下思路把输出映射也写下。看这几篇文章一定是要在看了前面几章之后不然不好理解的。
//这句sql应该够简单了
SELECT id,username username FROM USER WHERE id='29';
//在userMapper.xml中就可以写成这样
<!--
id:标识,mybatis代理开发的重要性就不在说了
parameterType:参数类型
resultType:输出结果类型
-->
<select id="findUserByIdResultMap" parameterType="int" resultType="cn.mybatis.pojo.User" >
select id ,username username from user where id=#{value}
</select>
//测试代码如下
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserByIdResultMap(29);
System.out.println(user);
}
//输出结果:(User我覆写了toString)
User [id=29, username=Hanson, sex=null, birthday=null, address=null]
//解释说明一下:
//mybatis会把查询出的结果映射到输出结果类型的对应字段上面。这也是最基本的输出映射了。
//既然是这样,那么问题来了,要是用下面这句SQL会怎么样呢?
SELECT id id_,username username_ FROM USER WHERE id='29'。
//给字段加个别名如下:
<select id="findUserByIdResultMap" parameterType="int" resultType="cn.mybatis.pojo.User" >
select id id_,username username_ from user where id=#{value}
</select>
//测试结果如下:
null
原因其实已经解释过了,就是查询出的列名和User属性不一样,导致了这样的情况。
哪有什么办法可以解决这个问题呢?
直接上代码:--》映射文件中
<!--
定义resultMap
将Select id id_,username username_ from user 和User类中的属性作一个映射关系
type:resultMap最终映射的java对象类型,可以使用别名
id:对resultMap的唯一标识
-->
<resultMap type="cn.mybatis.pojo.User" id="userResultMap">
<!--
id表示查询结果集中的唯一标识
column:查询出来的列名
property:type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系
-->
<id column="id_" property="id"/>
<!--
result:对普通名映射定义
column:查询出来的列名
property:type指定的pojo类型中的属性名
最终resultMap对column和property作一个映射关系
-->
<result column="username_" property="username"/>
</resultMap>
在看之前那段xml内容:
<!-- 使用resultMap进行输出映射
resultMap:指定定义的resultMap的id,如果这个resultMap在其他的mapper.xml文件中,前面需要加namspace
-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap" >
select id id_,username username_ from user where id=#{value}
</select>
测试:
@Test
public void testFindUserByIdResultMap() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserByIdResultMap(29);
System.out.println(user);
}
输出结果:
2016-01-08 13:28:31,393 [main] DEBUG [cn.mybatis.mapper.UserMapper.findUserByIdResultMap] - ==> Preparing: select id id_,username username_ from user where id=?
2016-01-08 13:28:31,458 [main] DEBUG [cn.mybatis.mapper.UserMapper.findUserByIdResultMap] - ==> Parameters: 29(Integer)
2016-01-08 13:28:31,485 [main] DEBUG [cn.mybatis.mapper.UserMapper.findUserByIdResultMap] - <== Total: 1
User [id=29, username=Hanson, sex=null, birthday=null, address=null]
总结:使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。(List<User>)
mybatis中使用resultMap完成高级输出结果映射。
resultMap使用方法:
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
1、定义resultMap
2、使用resultMap作为statement的输出映射类型
下一章:动态sql
本文为慕课网作者原创,转载请标明【原文作者及本文链接地址】。侵权必究,谢谢合作!
热门评论
这里少了一步:
UserMapper.java里的UserMapper接口要加一个方法声明
public User findUserByIdResultMap(int id) throws Exception;