java - 阿里的开发手册中为什么禁用map来作为查询的接受类?
问题描述
我在项目中经常使用List<Map<String,Object>>做为查询的接受对象.感觉使用方便,不用每个多表查询的时候都创建DTO类.
上面只针对查询,如果将map应用到DTO,VO是否会有相同的问题.
问题解答
回答1:1、map参数数量大时不易维护。要通过识别字符串形式的key,可能哪个字母没加程序就出错了
2、map转成实体,耗费资源。或者不转实体,直接将map传到sql层,但要判断空值(传没传这个参数啊。。。),参数数量一多要加一堆判断(sql效率下降,也不易维护)
3、创建map再put进参数值,比创建一个实体类的时间要长(map数量少时创建的时间差距很小,但是数量较大时差距会非常大)
4、参数类型的控制。sql中不是字符串类型的参数还要转成数值。。。错误跑到sql中,容易被CC
5、面相对象,将sql层与实体分离,降低耦合。否则维护很麻烦
回答2:我认为有两个方面吧:1.面向对象的思想2.效率吧,毕竟玩查询的【这里的效率是指map.get(key)】,map.put然后get的 这样很容易出错吧, 的确不怎么好
都是我瞎编的,呵呵,大学老师好像讲过吧。。
回答3:不利于他人共同开发和后期维护
回答4:Map<String, Object> 类型不安全
回答5:Map用查询参数,方法调用者根本就不知道方法提供者提供方法参数可以存哪些健值对以及健值对类型,map.put(key,value)乱传的问题不能在编译阶段发现,用QueryDto可以精确定义参数类型和限制(JSR 303 Validation)
回答6:如果我没有理解错误的话.
数据查询对象是指 dao 查询方法的参数封装, 并不是指方法的返回. 这样做的好处是代码的可读性高, 你直接使用map作为接口参数, 使用者想要确定具体的查询条件非常困难, 而且给外部接口调用的灵活性太高, 比如 使用者在map中增加一个x, 但是你的查询根本不支持, 但是你如何让使用者能够确认的知道呢?
而 dao 的返回参数按照文档的要求是应该使用 do/dto.
回答7:感觉主要是调试和维护困难,比如任何key的拼写错误,要到query执行时才能反馈
回答8:map的优点:
1、灵活性强于javabean,易扩展,耦合度低。2、写起来简单,代码量少。
看一看Javabean的优点:
1、面向对象的良好诠释、2、数据结构清晰,便于团队开发 & 后期维护。3、代码足够健壮,可以排除掉编译期错误。
权衡利弊,如果团队开发还是javabean比较好,个人项目就无所谓了。欢迎补充!~
相关文章:
1. PHP中的$this代表当前的类还是方法?2. javascript - vue2.0中使用vue2-dropzone的demo,vue2-dropzone的github网址是什么??百度不到。3. 鼠标过导航标签时,无效果,请问如何查找问题4. javascript - avalon.js ms-on 事件绑定无效 ?5. html - 这种错位的时间轴怎么布局,然后用css实现?6. html5 - 目前 公司App 嵌入H5页面 做个 手机支付功能 没有做过 所以 请求各位有经验的 给个思路7. java - spring-data Jpa 不需要执行save 语句,Set字段就可以自动执行保存的方法?求解8. IOS app应用软件的id号怎么查询?比如百度贴吧的app-id=4779278139. java - butterknife怎么绑定多个view10. java - 如图代码,Collection 类中的iterator()是抽象方法,为什么可以调用?