mybatis:嫌弃resultType很久,殊不知resultType才是无敌的存在!!

来源:互联网  责任编辑:小易  时间:2017/5/28 12:38:59
本网有用户碰到这样的问题:mybatis:嫌弃resultType很久,殊不知resultType才是无敌的存在!!,具体问题如下:

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

=================1楼=====================

不明嚼个厉。

=================2楼=====================

如果看不到合适的地方用合适的类型,那么就还没学明白

=================3楼=====================

你要知道:写起来方便用起来难受,写起来麻烦用起来舒服

=================4楼=====================

返回值是不建议使用map的,前几天看的阿里的开发规范,是严格禁止使用map作为返回值的。
该费时间去写的,你还是得花点时间。

=================5楼=====================

引用 4 楼 zwy0123 的回复:
返回值是不建议使用map的,前几天看的阿里的开发规范,是严格禁止使用map作为返回值的。
该费时间去写的,你还是得花点时间。

唉,为啥哩

=================6楼=====================

引用 3 楼 u011320740 的回复:
你要知道:写起来方便用起来难受,写起来麻烦用起来舒服

用起来也挺方便的感觉

=================7楼=====================

resultType一对多不是很方便,不如resultMap,其他的倒没什么。

=================8楼=====================

用Map返回结果不适合拓展,你的方法自己用可以,给别人用还要看你的SQL里返回了什么,在清单功能里,用Map返回查询结果不方便用反射写文件。

=================9楼=====================

一对多还是用resultMap好些

=================10楼=====================

引用 7 楼 m2200 的回复:
resultType一对多不是很方便,不如resultMap,其他的倒没什么。

一对多也照样查的出来吧,比如  1个用户 2个订单  ,就查询出两条记录      用户a  订单1    ,用户a 订单2 ,这样前台展示也方便
如果是resultMap的话 是这样的:
用户a(订单1、订单2),我有个疑问,不太明白,这样的话,前台页面要怎么通过循环展示结果列表?求教

=================11楼=====================

引用 10 楼 x18094 的回复:
Quote: 引用 7 楼 m2200 的回复:

resultType一对多不是很方便,不如resultMap,其他的倒没什么。

一对多也照样查的出来吧,比如  1个用户 2个订单  ,就查询出两条记录      用户a  订单1    ,用户a 订单2 ,这样前台展示也方便
如果是resultMap的话 是这样的:
用户a(订单1、订单2),我有个疑问,不太明白,这样的话,前台页面要怎么通过循环展示结果列表?求教


是的,你也知道是这种结果,不能合并一的那一方,多的那一方是几,就查出几条记录,你要手动写代码合并。

直接拿你查出来的结果集在页面上显示出来,还不重复,太难,不如手动合并下。

思路是根据一的那一方的主键ID来合并,ID相同的合并。

=================12楼=====================

 还有就是类型转换问题,你直接用map,有些值的类型转换后不是你想要的类型,就会出现问题。

反例:某同学为避免写一个<resultMap>,直接使用 HashTable 来接收数据库返回结果,结果
出现日常是把 bigint 转成 Long 值,而线上由于数据库版本不一样,解析成 BigInteger,导
致线上问题。

=================13楼=====================

引用 11 楼 m2200 的回复:
Quote: 引用 10 楼 x18094 的回复:

Quote: 引用 7 楼 m2200 的回复:

resultType一对多不是很方便,不如resultMap,其他的倒没什么。

一对多也照样查的出来吧,比如  1个用户 2个订单  ,就查询出两条记录      用户a  订单1    ,用户a 订单2 ,这样前台展示也方便
如果是resultMap的话 是这样的:
用户a(订单1、订单2),我有个疑问,不太明白,这样的话,前台页面要怎么通过循环展示结果列表?求教


是的,你也知道是这种结果,不能合并一的那一方,多的那一方是几,就查出几条记录,你要手动写代码合并。

直接拿你查出来的结果集在页面上显示出来,还不重复,太难,不如手动合并下。

思路是根据一的那一方的主键ID来合并,ID相同的合并。

那就说 多对一的时候  是没问题的,就是需求要求就要这样显示的时候,  a   1    a   2

=================14楼=====================

引用 12 楼 zwy0123 的回复:
 还有就是类型转换问题,你直接用map,有些值的类型转换后不是你想要的类型,就会出现问题。

反例:某同学为避免写一个<resultMap>,直接使用 HashTable 来接收数据库返回结果,结果
出现日常是把 bigint 转成 Long 值,而线上由于数据库版本不一样,解析成 BigInteger,导
致线上问题。

好吧~~~

=================15楼=====================

引用 12 楼 zwy0123 的回复:
 还有就是类型转换问题,你直接用map,有些值的类型转换后不是你想要的类型,就会出现问题。

反例:某同学为避免写一个<resultMap>,直接使用 HashTable 来接收数据库返回结果,结果
出现日常是把 bigint 转成 Long 值,而线上由于数据库版本不一样,解析成 BigInteger,导
致线上问题。
不错的经验,收下了

=================16楼=====================

引用 12 楼 zwy0123 的回复:
 还有就是类型转换问题,你直接用map,有些值的类型转换后不是你想要的类型,就会出现问题。

反例:某同学为避免写一个<resultMap>,直接使用 HashTable 来接收数据库返回结果,结果
出现日常是把 bigint 转成 Long 值,而线上由于数据库版本不一样,解析成 BigInteger,导
致线上问题。


受教了

=================17楼=====================

我们公司分布式开发,模块之间前期都是用map取值,然后沟通成本大大提升。

=================18楼=====================

每个类型的存在都是有特定意义的, 还是要区分场景。

=================19楼=====================

各有各好处  没有无敌的存在 只有适合的存在

=================20楼=====================

我现在是经常用resultType(map),感觉很方便。但是map有个不好的就是,如果查询的字段值为null,map就不没有该字段。
sql里面需要做个判断ifnull。

=================21楼=====================

引用 8 楼 secoler 的回复:
用Map返回结果不适合拓展,你的方法自己用可以,给别人用还要看你的SQL里返回了什么,在清单功能里,用Map返回查询结果不方便用反射写文件。


+1
虽然本人没用过 iBatis,但看楼主介绍的内容里,似乎和 C# 里的 DataTable 很类似,就是取一行数据时通过传入字段名取字段值
这种情况下,如果一个项目小,只有一两个人搞定还好办,人多了就麻烦死了。当初我参与一个C#项目,那项目里所有的数据库访问全部是使用 DataTable,就和楼主说的List<Map<String, Object>> 类似,数据访问层由另外一个工程师封装好,而我为了取一个数据库字段,就必须传个字符串给一个行(就象楼主说的Map),但这个字符串应该传什么值?为了确保我不记错,就必须阅读他的DAO层源代码,查看SQL语言甚至数据库里的存储过程。总之那些日子每天访问数据库就是吐槽,再也不想用 DataTable了。

总结一下这种方式(List<Map<String, Object>>)有什么不足
1、取字段值时必须传个字符串给 Map,而这个 Map 很容易给程序员带来困惑,DAO 的使用者时常需要阅读DAO的源代码才能确定应该传什么字符串给 Map
2、一旦数据库字段名称、类型发生变化,程序员必须扫描所有的源代码进行修改,然后测试所有的可能
3、一旦字符串写错,程序员很难察觉,编译器也不会报错,测试也不一定会走到那条语句,隐患留到了最后发布版本里

这种方式对DAO封装者来说是很省事,但是对调用者来说简直是噩梦。当初经常因为改了数据库上一点点东西,就把所有代码全部排查一遍,然后不断地测试测试测试……
后面做的项目里,我们都使用ORM模式进行封装,基本上只要数据DAO层做好修改,再利用编译器报的错误,基本上都会把该改的问题全部找到,测试量少了很多很多很多

=================22楼=====================

严格约束全部使用resultType,如果用resultMap说明持久层管理太松散。

=================23楼=====================

我也经常会面临这个问题,一般规定的返回值都是map,但是有的时候也是看需求的,你需要查询的数据是什么 根据你要查找的数据来决定是使用resultType和resultMap ,另外 很好奇楼主说的qo类是什么?是指pojo吧?我们一般都称model

=================24楼=====================

用map接收的确可行,但是不一定好,比如你想看到这个map中接收的是哪些参数,你可能就需要到数据库取看字段
map中的key的大小写是一般是和数据库字段大小写一致的,如果在定义字段的时候没有注意这个问题,可能在之后的获取过程中会相当麻烦。

=================25楼=====================

增改 用resultMap 查删 用resultType

=================26楼=====================

update, delete可以使用resultType指定int, select单个结果也可以使用resultType指定int, 或者string. 但是多个结果并不推荐使用resultType, 而应该使用resultMap明确结果类型. 首先存在转型问题(先向上转Object, 再向下转具体类型), 其次不同数据库版本之可能存在解析不一致导致向下转型错出现ClassCastException或者出现丢失精度的问题.

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved