继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

MyBatis3.2.x从入门到精通之第五章

HansonQ
关注TA
已关注
手记 21
粉丝 334
获赞 3452

前言:昨天写了输入映射,今天整理下思路把输出映射也写下。看这几篇文章一定是要在看了前面几章之后不然不好理解的。

//这句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

本文为慕课网作者原创,转载请标明【原文作者及本文链接地址】。侵权必究,谢谢合作!

打开App,阅读手记
11人推荐
发表评论
随时随地看视频慕课网APP

热门评论

这里少了一步:

UserMapper.java里的UserMapper接口要加一个方法声明

public User findUserByIdResultMap(int id) throws Exception;

查看全部评论