MyBatis之输入(parameterType)与输出(resultType、resultMap)映射

title: MyBatis之输入(parameterType)与输出(resultType、resultMap)映射
tags: MyBatis
categories: MyBatis


若图片无法显示,请前往我的博客查看,相应文章链接:http://codingxiaxw.cn/2016/11/08/35-mybatis%E8%BE%93%E5%85%A5%E4%B8%8E%E8%BE%93%E5%87%BA%E6%98%A0%E5%B0%84/

在MyBatis中,我们通过parameterType完成输入映射(指将值映射到sql语句的占位符中,值的类型与dao层响应方法的参数类型一致),通过resultType完成输出映射(从数据库中输出,通过dao层的方法查询到的数据输出到pojo对象中)。 注意输入与输出都是相对于数据库的。接下来我们先谈谈输入映射。工程目录结构如下:

<img src="http://od2xrf8gr.bkt.clouddn.com/mulu22.png" width="50%" height="50%"/>

1.输入映射parameterType

通过parameterType传入简单类型或对象,我们之前讲过了,接下来我们要讲的是parameterType传递pojo包装对象。可以定义pojo包装类型扩展mapper接口输入参数的内容。

看下我们的需求:定义查询条件查询用户信息,需要向statement输入查询条件,查询条件可以有user信息、商品信息等等。

首先我们在domain包下创建UserCustom类并继承User,
image

UserCustom类用于对User属性进行扩展(例如User中只有用户信息,而我们可以在UserCustom中加入商品信息),然后再创建User的包装类UserQueryVo.java:
image

UserMapper.xml中添加如下配置信息:
image

UserMapper.java中添加方法:[图片上传失败...(image-fc7303-1526286066544)]

然后便可以进行测试:[图片上传失败...(image-ca072b-1526286066544)]

可能出现的异常:如果在parameterType中指定了错误的属性名时会出现如下异常:

org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'userCusto' in 'class cn.itcast.mybatis.po.UserQueryVo'### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'userCusto' in 'class cn.itcast.mybatis.po.UserQueryVo'

2.输出映射

输出映射有resultType和resultMap,他们都是指定输出结果的类型(pojo、简单类型、hashmap...),并将sql查询结果映射为java对象 。

2.1resultType

借用上述parameter传递包装pojo对象的知识(不用parameter传递包装pojo对象的知识也行),我们来谈谈用resultType输出简单类型。UserMapper.xml文件中添加如下配置:[图片上传失败...(image-f2a460-1526286066544)]

然后在UserMapper.java中添加如下方法:
[图片上传失败...(image-b17ca0-1526286066544)]

测试:[图片上传失败...(image-d88084-1526286066544)]

这里因为查询的记录结果集为一条记录且该记录只有1列,所以我们使用的是返回简单类型。

使用resultType时我们应该注意:sql查询的列名要和resultType指定pojo的属性名相同,指定相同属性方可映射成功,如果sql查询的列名要和resultType指定pojo的属性名全部不相同(或是部分不相同),则映射到pojo对象中的对应属性为null。例如有时候我们不需要查询select * from user where id = ?而是select username,address _address where id = ? 此时我们给查询的address列名给了一个别名_address,这样我们通过查询表中address的数据然后在将它映射到User对象时,该对象的address属性就为null,即没将从表中查询到的address数据映射到user对象的address属性中。

此时resultMap就出现了。如果sql查询列名和最终要映射的pojo的属性名不一致,使用resultMap就可以将列名和pojo的属性名做一个对应关系 (列名和属性名映射配置)。

2.2resultMap

使用resultMap需要在UserMapper.xml中进行配置:[图片上传失败...(image-c8cb27-1526286066544)]

然后在UserMapper.xml中使用它:

[图片上传失败...(image-71e872-1526286066544)]

UserMapper.java文件中:[图片上传失败...(image-671c6d-1526286066544)]

测试类代码:

[图片上传失败...(image-7d1e57-1526286066544)]

运行测试类发现,即使我们查询的列名与User对象的属性不一样,但是我们的确映射成功了。

2018.3.19更

欢迎加入我的Java交流1群:659957958。群里目前已有1800人,每天都非常活跃,但为了筛选掉那些不怀好意的朋友进来搞破坏,所以目前入群方式已改成了付费方式,你只需要支付9块钱,即可获取到群文件中的所有干货以及群里面各位前辈们的疑惑解答;为了鼓励良好风气的发展,让每个新人提出的问题都得到解决,所以我将得到的入群收费收入都以红包的形式发放到那些主动给新手们解决疑惑的朋友手中。在这里,我们除了谈技术,还谈生活、谈理想;在这里,我们为你的学习方向指明方向,为你以后的求职道路提供指路明灯;在这里,我们把所有好用的干货都与你分享。还在等什么,快加入我们吧!

2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626 。群2作为群1的附属群,除了日常的技术交流、资料分享、学习方向指明外,还会在每年互联网的秋春招时节在群内发布大量的互联网内推方式,话不多说,快上车吧!

3.联系

If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.

推荐阅读更多精彩内容

  • title: MyBatis之使用resultMap实现高级映射tags: MyBatiscategories: ...
    codingXiaxw阅读 1,415评论 1 1
  • 一、输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型、HashMap、pojo的包装...
    yjaal阅读 807评论 0 2
  • Mapper.xml映射文件 Mapper.xml映射文件定义了操作数据库的sql,每个sql是一个stateme...
    暗物质阅读 7,888评论 0 2
  • 1.1mybatis下载 mybaits 的代码由github.com 管理,地址:https://github....
    暖熊熊阅读 653评论 0 5
  • 每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它是线程不安全的 配置文...
    蕊er阅读 382评论 0 0
  • 计算机操作系统都有的基本概念,以下概念简单方式来描述。 进程:就是在系统中,正在运行的一个应用程序。线程:是 CP...
    s_在路上阅读 311评论 0 0
  • 降温的第一天去吃,辣锅真的好吃!!!非常喜欢的一家不起眼的火锅了!!! 鸭血配辣锅真的是非常绝配!!!总之都很好吃...
    菠00阅读 114评论 0 0
  • 自我记事起,公交车就出现在我的记忆中了。 儿时的公交车是那种小小的中巴。记忆里外婆抱着我,坐在司机边上的那块凸起的...
    长马阅读 347评论 0 9