程序其实就是两个东西:代码+数据,写程序的时候也就是写代码操作数据的过程。做程序开发和做菜很像,数据就是食材,代码就是厨艺,做出的软件就是一道菜了,至于这个菜好不好吃,到底是看食材还是看厨艺了?呵呵,当我抛出这个问题的时候,我的第一反应是菜不好吃当然是手艺不好了,不知道其他童鞋是不是这么想的。认真想下,一道好菜一般都是二者必须兼备,当然不排除某一项突出也可以达到同样的效果,但这种情况毕竟不是大众化,而是属于少数精英的,做软件也是如此,代码与数据是不可偏废的。这里我要提的是数据。
根据我的经验和知识(分类标准我一直想不太好,所以说是自己的经验和知识),我把数据分为两类:落地数据和不落地数据。
写过程序的人都知道,程序里对这两种类型数据操作是有很大的不同的。
java一个很重要的贡献就是推出了mvc设计模式,mvc其实应该按vcm顺序读最好。v及view,主要是前台展示的页面;c及controller,控制层主要作用是接受前台页面数据,根据数据的不同调用后台不同的业务模型,同时业务模型处理好的数据也要发送到controller,controller再分配给相应的前台页面;m及model,模型层专门负责操作业务模型。下图很好的表达了mvc的理念:

随着mvc模式的发展,现在流行的架构:view(视图层)+controller(也叫action,控制层)+service(业务模型层)+DAO(数据访问对象层)+数据库的多层结构,如下图:

红线是用户的请求;蓝线是服务器响应用户的请求。红色和蓝线也代表各层数据传输的流向。不管是传统的mvc模式还是现在流行的多层架构, 各个逻辑层传输的数据都是不落地数据。
在java项目里,一般我们都是传输javabean,而这些javabean都是程序员根据实际业务需求自己定义的,例如下面一个典型的javabean:
public class User {
private String name = "";
private String sex = "";
private String age = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
各个逻辑层传输javabean对象的观念一定会深入很多java程序员的人心,当一个项目开始,程序员都会吭哧吭哧的创建javabean对象,比如数据库表映射的javabean,在struts1.2里还有页面表达对应的javabean,做了这么多年这样的javabean,现在我就思考,使用javabean真是最好的选择吗?
我这里借用现在很流行的NoSQL的定义作为我文章第三部分的标题。javabean已经深入很多java程序员心理,甚至是很多程序员的习惯,其实它真的那么好用吗?真的那么包治百病吗?其实不尽然,下面我要列举它的缺点:
既然我的标题是Nojavabean,not only javabean,那么就像NoSQL能弥足SQL数据库的不足,以上的不足我们用什么技术来弥补了?答案就是:键值对。
google的三篇论文带来了云时代,用博大的胸怀改变了世界,而这里面最关键的东西就是map(键值对),key-value模式(后面简称kv)+数组我个人觉得基本可以表述这个世界的90%了。而且基本所有的语言都支持kv的数据结构,这件kv是多么强大的数据结构,世界就是被这个简单方式而改变的。(本来我想谈谈kv在云计算存储和计算的作用,作为本文主题的补充,但是时间限制,大伙可以自己查阅下相关资料)。
我的替代数据模型就是用map作为数据传输介质,让我产生这个想法的源头是三个技术:mapreduce,ibatis和json;我们中心很重视hadoop技术,我们这里经常做hadoop相关技术分享,听来听去都有什么mapreduce,都是map,map;而我们现在公司的项目都是用ibatis做orm,当时表很多,我一时偷懒不是所有的ibatis配置文件都和javabean一一对应,只是返回一个map对象,如果是列表查询就是List<Map>,没想这么做居然有意外的收获,因为页面数据我们都是封装成json对象,json其实也是一个键值对的模型,数据到了action也是被传化成了map,所有返回值一样,居然提升了整个开发的效率,而且项目里面少了javabean对象,显的清爽多了。
下面我总结下map的好处,在文章第三部分写道了javabean的缺点,这些缺点倒过来看就是map的优点了,我这里就不再复述了:
// javascript里面json obj.XXX或者obj[XXX] // java里的map map.get(XXX)或map.put(XXX)