JS技术

深入了解MyBatis返回值 - 偶尔记一下 - 博客频道 - CSDN.NET 偶尔记一下 没事看看 - MyBati(2)

字号+ 作者:H5之家 来源:H5之家 2015-12-14 16:00 我要评论( )

实际上不用,这里也不区分大小写,在result column="xxx" ../的column也不区分大小写,看下面的代码: for (ResultMapping compositeResultMapping : resultMapping.getComposites()) { final String compositeColu

实际上不用,这里也不区分大小写,在<result column="xxx" ../>的column也不区分大小写,看下面的代码:

for (ResultMapping compositeResultMapping : resultMapping.getComposites()) { final String compositeColumn = compositeResultMapping.getColumn(); if (compositeColumn != null) { resultMap.mappedColumns.add(compositeColumn.toUpperCase(Locale.ENGLISH)); } }

这里也转换为了大写。

到这里关于resultTypt和resultMap就结束了,但是有一个简单的问题,很多人不懂,是什么?看下个标题。

MyBatis接口返回值

接口返回值通常是一个结果,或者是List和数组。

MyBatis如何知道我想要返回一个结果还是多个结果?

在MapperMethod中的部分代码如下:

if (method.returnsVoid() && method.hasResultHandler()) { executeWithResultHandler(sqlSession, args); result = null; } else if (method.returnsMany()) { result = executeForMany(sqlSession, args); } else if (method.returnsMap()) { result = executeForMap(sqlSession, args); } else { Object param = method.convertArgsToSqlCommandParam(args); result = sqlSession.selectOne(command.getName(), param); }

可以看到查询结果有4中情况,void,list(和array),map,one。

这里重要就是if的判断条件,这种判断条件计算方法:

this.returnType = method.getReturnType(); this.returnsVoid = void.class.equals(this.returnType); this.returnsMany = (configuration.getObjectFactory().isCollection(this.returnType) || this.returnType.isArray());

可以看到,这些条件完全就是通过方法的返回值决定的。所以如果你写的返回值是数组或者集合,返回的结果就是多个。

如果返回值本身有多个,但是返回值写了一个POJO,不是集合或者数组时会怎样?

答案是会报错TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size())。

不管是返回一个结果还是多个结果,MyBatis都是安装多个结果进行查询,selectOne是查询一个,selectList是查询多个,我们看看selectOne代码:

public <T> T selectOne(String statement, Object parameter) { List<T> list = this.<T>selectList(statement, parameter); if (list.size() == 1) { return list.get(0); } else if (list.size() > 1) { throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size()); } else { return null; } }

注意看:

List<T> list = this.<T>selectList(statement, parameter);

实际上,不管查询一个还是多个结果,MyBatis都是先按多个结果进行查询。拿到list结果后在判断。

如果是查询一个结果的情况,那么list最多只能有一个返回值。通过上面代码的if else if esle可以很明白的理解。

resultTyp,resultMap和返回值多少有关系吗?

没有任何关系。

通过前面resultType和resultMap的内容,我们应该知道,这个属性是配置JDBC查询结果如何映射到一个对象上的。

不管返回值是什么或者是几个,都是按照resultType和resultMap生成返回结果。

返回结果的类型由resultType和resultMap决定。

返回结果的类型

返回结果的类型由resultType和resultMap决定,是不是很诧异???

实际上就是这种情况。。

举个例子,有个实体Country和Country2。

接口中List<Country> selectAll(),xml中的<select resultType="Country2">.

当你通过接口调用的时候,返回值是什么?你以为自己的List中的对象类型是Country,但他们实际上都是Country2

如果接口方法为Country selectById(Integer id),xml中为<select resultType="Country2">,由于类型不一致,查询的时候才会报错:java.lang.ClassCastException: xx.Country2 cannot be cast to xx.Country

为什么会这样呢?

这是因为接口调用方式是对命名空间方式调用的封装。

当你通过命名空间方式调用的时候,返回结果的类型是什么?

就是由resultType和resultMap决定的类型,这很容易理解。但是换成接口就觉得不一样了。

这是由于接口方法方式多了返回值,所以我们会认为返回的一定是这个类型。实际上是错的。

特殊情况

当使用纯注解方式时,接口的返回值类型可以起到作用,如果没有使用@ResultType注解指定返回值类型,那么就会使用这里写的返回值类型作为resultType。

  • 上一篇MyBatis日期用法技巧
  • 下一篇CentOS 7 配置goagent和安装chrome
  • 顶 2 踩 0

    我的同类文章

    猜你在找

    查看评论

    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

    CSDN 2015博客之星评选

    投我一票

    MyBatis相关资源推荐

    点击进入MyBatis工具网站

    点击加入MyBatis QQ群

    Mybatis工具

    个人资料


    isea533

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 通过wireshark,以及python代码收发邮件,了解smtp协议,pop协议工作过程 - 画花画叶难画香。。。 -

      通过wireshark,以及python代码收发邮件,了解smtp协议,pop协议工作

      2015-12-15 09:17

    • Java之旅mybatis学习(一)——走进mybatis - 李晓娜 廊坊师范学院信息技术提高班 第十期 - 博客频道

      Java之旅mybatis学习(一)——走进mybatis - 李晓娜 廊坊师范学院信

      2015-12-13 11:00

    • 深入了解Javascript_Javascript教程

      深入了解Javascript_Javascript教程

      2015-10-01 14:22

    • 深入理解Javascript闭包(closure)

      深入理解Javascript闭包(closure)

      2014-11-17 20:00

    网友点评
    t