iBATIS with MapBean应用浅析

开发 后端
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表

  1. public class User {  
  2.   private int id;  
  3.   private String name;  
  4.    
  5.   // 省略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的思想

  1. public class MapBean extends HashMap﹤String, Object﹥ {  
  2.  public MapBean() {  
  3.  }  
  4.    
  5.  public MapBean(Object... args) {  
  6.   put(args);  
  7.  }  
  8.    
  9.  public int getInt(Object key) {  
  10.   return getInt(key, 0);  
  11.  }  
  12.    
  13.  public int getInt(Object key, int defaultInt) {  
  14.   Integer i = (Integer) get(key);  
  15.   return i == null ? defaultInt : i;  
  16.  }  
  17.    
  18.  public String getString(Object key) {  
  19.   return (String) get(key);  
  20.  }  
  21.    
  22.  public String getString(Object key, String defaultValue) {  
  23.   String value = (String) get(key);  
  24.   return value == null ? defaultValue : value;  
  25.  }  
  26.    
  27.  public Timestamp getTimestamp(Object key) {  
  28.   return (Timestamp) get(key);  
  29.  }  
  30.    
  31.  public void put(Object... args) {  
  32.   for (int i = 1; i ﹤ args.length; i += 2) {  
  33.    put(String.valueOf(args[i - 1]), args[i]);  
  34.   }  
  35.  }  
  36.    
  37.  public JSONObject toJson() {  
  38.   return JSONObject.fromObject(this);  
  39.  }  
  40.    
  41.  public JSONObject toJson(String... keys) {  
  42.   xxx  
  43.  }  
  44.    
  45.  public String toJsonString() {  
  46.   return toJson().toString();  
  47.  }  

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

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

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

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

接下来,我们在sql-map-config.xml中加入

  1. ﹤typeAlias alias="mapbean" type="xxxxxxx.MapBean" /﹥ 

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

例如具体的SQL xml是这样的

  1. select id="getWorkManagerSystemRole" resultClass="mapbean" 
  2.  parameterClass="mapbean"﹥  
  3.  select * from work_manager_system_role where 
  4.  system_id=#system_id# and user_id=#user_id#  
  5. ﹤/select﹥ 

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

iBATIS with MapBean应用的浅析就向你介绍到这里,希望对你有所帮助。

【编辑推荐】

  1. iBATIS使用之高级查询技术详解
  2. iBATIS分页源码真相探讨
  3. iBATIS教程之入门浅析
  4. Hibernate与iBATIS的较量浅析
  5. iBATIS实例创建的五大步浅析
责任编辑:仲衡 来源: 网易博客
相关推荐

2009-07-16 13:08:09

iBATIS快速创建应

2009-07-17 10:59:59

iBATIS接口

2009-07-21 11:12:00

iBATIS配置

2009-07-22 11:11:39

iBATIS分页实例ObjectDataS

2009-07-15 17:19:31

iBATIS Ecli

2009-07-22 10:03:11

iBATIS Resu

2009-07-16 09:14:26

iBATIS DAO

2009-07-20 18:00:16

iBATIS DAO事

2009-07-15 17:58:07

iBATIS 动态映射

2009-07-22 10:42:59

iBATIS Cach

2009-07-16 10:23:30

iBATIS工作原理

2009-07-17 17:05:44

iBATIS缓存cacheModel

2009-07-22 15:21:00

iBATIS SQLM

2009-07-15 16:42:03

iBATIS读写CLO

2009-07-22 09:44:05

iBATIS Para

2009-07-22 15:01:01

iBATIS SQLM

2009-07-22 16:02:14

iBATIS参数

2009-07-17 09:44:40

iBATIS教程

2009-07-17 16:49:18

iBATIS XML配

2009-07-15 16:26:04

iBATIS Clob
点赞
收藏

51CTO技术栈公众号