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

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

1.输入映射parameterType

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

看下咱们的需求:定义查询条件查询用户信息,须要向statement输入查询条件,查询条件能够有user信息、商品信息等等。数据库

首先咱们在domain包下建立UserCustom类并继承User,UserCustom类用于对User属性进行扩展(例如User中只有用户信息,而咱们能够在UserCustom中加入商品信息),而后再建立User的包装类UserQueryVo.java:apache

UserMapper.xml中添加以下配置信息:mybatis

UserMapper.java中添加方法:app

而后即可以进行测试:dom

可能出现的异常:若是在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对象 。spa

2.1resultType

借用上述parameter传递包装pojo对象的知识(不用parameter传递包装pojo对象的知识也行),咱们来谈谈用resultType输出简单类型。UserMapper.xml文件中添加以下配置:code

而后在UserMapper.java中添加以下方法:

测试:

这里由于查询的记录结果集为一条记录且该记录只有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中进行配置:

而后在UserMapper.xml中使用它:

UserMapper.java文件中:

测试类代码:

运行测试类发现,即便咱们查询的列名与User对象的属性不同,可是咱们的确映射成功了。

相关文章
相关标签/搜索