`
zgd
  • 浏览: 8422 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

[原创]Ibatis with MapBean

阅读更多
用了两年的Hibernate之后,对ORM深有感触。一方面,ORM可以令到我们从OO角度来思考数据,屏蔽了数据库的差异(其实 Hibernate被吹的最厉害就是那个分页,其实分页没什么技术含量,而且ROR都把分页从核心抽离了)。另一方面,性能问题,例如必须select才能update,必须select全部,必须update全部,cache带来的后遗症,javabean关联问题(一对多,多对一,多对多等), lazyload问题

Hibernate一直说,他生成的sql比一般程序员的要好,可以减少很多问题。但是,我倒是认为用Hibernate反而因为对程序员的要求更高导致更多问题。而且我现在认为,SQL才是王道,至少目前是。

于是在新项目中启用Ibatis,这一年来的使用感觉很不错,全程使用细粒度的SQL语句,虽然多写了很多SQL语句,但是感觉到项目在自己的控制中

我只用了Ibatis 40%不到的功能,可能大家会觉得不可思议。我没有用cache,没有用关联,没有用resultMap,甚至,连JavaBean也没有用

在大家都在讨论PO,VO,DTO的时候,我的系统里面一个JavaBean都没有

首先我问问,JavaBean是用来做什么的,存储数据,每一个PO,其实就约等于一个表里面的一行数据

我举一个真实一点的例子,一个user表
public class User {
  private int id;
  private String name;
 
  // 省略getter/setter一大段
}

不知道大家有没有用eclipse生成JavaBean getter/setter的痛苦,至少非常枯燥。整个JavaBean实现了什么功能?完全没有

好了我开谜底了,我用的是HashMap

什么,HashMap?是不是听错了

没听错,请问有什么事情是上面那个那么普通的JavaBean能做到的,而HashMap不能做到的呢

用HashMap没有具体属性的类型啊,那不是变成动态语言一样了,而且我要在JavaBean里面加逻辑怎么办

好吧,这是我想到的两个问题(如果你也有别的问题可以留意提出来)

首先,现在不同以前了,动态语言的优势慢慢提高了,像动态语言有什么不好,我从ROR里面学了很多不错的思想

其次是要加逻辑怎么办,这个问题,之前在Javaeye讨论充血模型还是贫血模型不可开交,最后还是没什么结论,目前还是一片贫血的情况,你可以翻一下你的项目里面的JavaBean,至少大多数的Bean都是没有意义的getter/setter。BO跟PO混杂在一起也很多人不建议的。至于逻辑,大可以写在util包里面,我都把整个model包去掉了,强化一下util不成么,呵呵

再次,数据库的列,跟JavaBean的属性两者,本来就是冗余的,如果我们修改数据库结构,就还要修改相应的JavaBean,或者影射文件。当然我这种做法更依赖数据库。另外,ROR的名字转换功能可以令到代码中的调用名字更好看一些,我觉得也不是非常有必要的实现

直接使用HashMap不太方便,尤其是类型转换上,于是我实现了一个MapBean的类,其实这个类很简单,关键是用HashMap代替JavaBean的思想
public class MapBean extends HashMap<String, Object> {
	public MapBean() {
	}
 
	public MapBean(Object... args) {
		put(args);
	}
 
	public int getInt(Object key) {
		return getInt(key, 0);
	}
 
	public int getInt(Object key, int defaultInt) {
		Integer i = (Integer) get(key);
		return i == null ? defaultInt : i;
	}
 
	public String getString(Object key) {
		return (String) get(key);
	}
 
	public String getString(Object key, String defaultValue) {
		String value = (String) get(key);
		return value == null ? defaultValue : value;
	}
 
	public Timestamp getTimestamp(Object key) {
		return (Timestamp) get(key);
	}
 
	public void put(Object... args) {
		for (int i = 1; i < args.length; i += 2) {
			put(String.valueOf(args[i - 1]), args[i]);
		}
	}
 
	public JSONObject toJson() {
		return JSONObject.fromObject(this);
	}
 
	public JSONObject toJson(String... keys) {
		xxx
	}
 
	public String toJsonString() {
		return toJson().toString();
	}
}

这个类主要是方便做类型转换,加入了getInt,getString等方法,另外因为我的系统里面大量使用了JSON,也有一些HashMap向JSON转换的辅助方法,还有一个特别处理过的put方法和构造器,有什么用呢,看下面的例子

MapBean params = new MapBean("id",userId,"name",username,"sex",0,"online",true);

如果你直接用HashMap实现以上功能,要写五行代码,就这个差别而已,呵呵

当然如果你用JavaBean的话,你也可以写一个对应的构造函数

接下来,我们在sql-map-config.xml中加入
<typeAlias alias="mapbean" type="xxxxxxx.MapBean" />

就可以用mapbean的别称来引用这个类了

例如具体的SQL xml是这样的
<select id="getWorkManagerSystemRole" resultClass="mapbean"
	parameterClass="mapbean">
	select * from work_manager_system_role where
	system_id=#system_id# and user_id=#user_id#
</select>

其实我已经把Ibatis当成SQL wrapper来用了,我曾经评估过Spring的JDBC Template,不过功能始终差少少,或许以后我把JDBC Template再强化一下来代替Ibatis吧

http://weavesky.com/2008/01/29/ibatis-with-mapbean/
分享到:
评论
69 楼 supttkl 2008-10-25  
apache 有一个专门的DB工程,用DynaBean封装了Map。可以实现hibernate的insert,update,delete功能。
实现多种数据库
就是缓存方面没有实现
api演示网址http://db.apache.org/ddlutils/api-usage.html
javadoc:http://db.apache.org/ddlutils/api/
测试:http://supttkl.iteye.com/blog/256248
68 楼 寄生虫 2008-10-20  
最终目的不就是为了维护方便吗?Hibernate也有sqlmap吧,跟iBatis差不多
67 楼 gumpgz 2008-10-16  
不太赞成这种做法,只有多表联合查询才需要这样去做。

ibatis不仅仅是查询,更重要的是插入、修改、删除数据,这些单表的操作用javabean是非常方便的,而且有必要。

如果说查询的话,我一直的想法是两分,对于单表查询,用javabean;对于组合查询、分页查询自己实现,不依赖于ibatis
66 楼 miaomiao0307 2008-09-23  
hibernate和ibatis我都用过,我还是比较喜欢ibatis,因为它比较简单,容易修改,而且我们可以优化sql,但是不适合数据库的移植,
而hibernate我觉得性能上并不快,也许是我使用的不正确的原因吧,我把hibernate在后台打印的sql运行了一下,发现很慢,然后察看sql才知道,是因为他拼装的sql,性能上有问题,因此修改成hql or sql,所以觉得很郁闷,一个项目有多种处理数据的方法;
65 楼 tyler2002 2008-09-23  
赞同楼主说法
64 楼 netfork 2008-09-23  
刚刚看了iBATIS in Action,老大不推荐用Map。
63 楼 罪恶的小手 2008-06-02  
我觉得你所说的方法 只是局限于SQL

但是我觉得Hibernate还是为程序员省事了不少,
62 楼 xiong619 2008-05-22  
我是刚刚接触iBatis的,Hibernate在MyEclipse工具里是自动生成的,那请问iBaties在MyEclipse工具是怎么配置的呢
61 楼 天空不空 2008-04-24  
学习学习,向楼主学习
60 楼 AllenZhang 2008-04-16  
个人觉得楼主的意见是可以参考的。适当用map可以有效地提高开发效率,少诞生一些对象。
基本上就是贫血的pojo用map,带点逻辑或者有点复杂用处的,就建立vo对象吧。
59 楼 elice 2008-03-27  
确实,使用HashMap可以省很多事,免得写特别多的POJO了
58 楼 hut 2008-03-09  
请教下楼主,如果用map的话,那么再业务逻辑中处理参数的时候怎么办?
直接用 map.get("xxx"); 吗?
那这样的话 直接将"xxx"编码在程序里,合适吗?
57 楼 leadyu 2008-03-08  
鼓捣大家全用Map?不要把Map用滥了,到后面就是个视图字段垃圾桶。看不懂现在评判精华的标准了
56 楼 rocwon 2008-03-06  
hongsoft 写道
楼主用的MapBean就是 我现在用的 SDO的 1/10的功能,不过自己想出来还是比较强的。

我们产品现在也用了这个思路
SDO+HIBERNATE  或者  sdo +iBatis。

应该说,我们的sdo+ibatis比楼主用的功能要强很多。

我现在在 oasis的 SDO标准委员会中,有兴趣可以一起讨论一下 SDO对产品的 架构帮助问题 :)



俺曾为JDBC和IBATIS实现过一个EnhancedMap,除了楼主实现的getInt/getString ***以外,还实现了MAP转换为BEAN,BEAN转换为MAP,MAP数据转换为JSON或XML格式; XML,JSON格式数据存入MAP.


55 楼 lonlyleo 2008-03-05  
类似LZ这种方法我也最近也用了,因为最近有些小任务如果照搬正规项目那一堆XO也是个枯燥的活,所以写了一个Util执行简单的查询、更新,List、Map满天飞。查询用了一下ResultSetMetaData,
List<Map<String, Object>> populate(ResultSet rs)

我认为,觉得这样快速有效,应付小项目足够了,还有一定的可配置性。对于具体的规模不大的项目来说,多写两句注释就好了。

不过,在正经的业务系统中我真的是正儿八经的分了很多层,可能是我觉得这样比较节省脑力,简单的业务做起来都像是一个模子出来的,做工人可以按时下班,做程序员可就不一定了,呵呵。
54 楼 hongsoft 2008-03-05  
楼主用的MapBean就是 我现在用的 SDO的 1/10的功能,不过自己想出来还是比较强的。

我们产品现在也用了这个思路
SDO+HIBERNATE  或者  sdo +iBatis。

应该说,我们的sdo+ibatis比楼主用的功能要强很多。

我现在在 oasis的 SDO标准委员会中,有兴趣可以一起讨论一下 SDO对产品的 架构帮助问题 :)
53 楼 rocwon 2008-03-05  
请问下Insert, Update操作也传递这个MapBean做为参数类吗?
52 楼 rdsuncn 2008-03-03  
hackang 写道
技术本身没有问题,你觉得适合你项目用就行

那种以点盖全的讨论有什么意思,我关心的只是一个问题怎么解决最快、最稳定、客户不会找我麻烦,好让我早点下班

赞同
51 楼 hackang 2008-02-26  
技术本身没有问题,你觉得适合你项目用就行

那种以点盖全的讨论有什么意思,我关心的只是一个问题怎么解决最快、最稳定、客户不会找我麻烦,好让我早点下班
50 楼 鹏凌三千 2008-02-25  


1.什么是Loonframework
Loonframework由三个子项目构成,分别对应DAO框架实现,WEB框架实现,以及一个2D的GAME框架实现,全部完成后将作为一个快速开发用综合框架而存在;目前三部分都尚处于开发阶段。

2.关于Loonframework-DAO

Loonframework -DAO是loonframework项目下的DAO实现,是一个轻量级、低外部依赖度的实现;为实现小规模项目的快速开发而诞生,目前提供了jdbc数据接口的封装及简单的pojo应用处理能力(但并不是彻底的orm)。loonframework-DAO本身是一个试验性质的项目,内部提供了事务、日志、Cache、异常处理等方面的简单实现,能够不依赖于任何第三方项目而单独运行,当然也可以通过接口选择和其它项目并用,将会陆续提供支持第三方的 template以供调用。


基本介绍:http://blog.csdn.net/cping1982/archive/2008/02/25/2118613.aspx

相关推荐

Global site tag (gtag.js) - Google Analytics