论坛首页 Java企业应用论坛

想改造下ibatis,不知道有没有前途。。。

浏览 15284 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-05-21   最后修改:2009-05-21
zozoh 写道
这里是对 ibatis 改造的结果:
http://nutz.googlecode.com


稍微看了一下 Nutz_Dao,个人觉得何必需要在外部显式调用这个Dao呢,你在实体对象里面 继承一个 通用的Dao,通过反射实现相应功能,然后类似 company.insert() , company.query() 等形式的外部调用会更方便,也就是类似rails的ActiveRecord模式
0 请登录后投票
   发表时间:2009-05-21  
我还是觉得hibernate好用 而其我也配合memcached一起用
0 请登录后投票
   发表时间:2009-05-22  
rtm 写道
zozoh 写道
这里是对 ibatis 改造的结果:
http://nutz.googlecode.com


稍微看了一下 Nutz_Dao,个人觉得何必需要在外部显式调用这个Dao呢,你在实体对象里面 继承一个 通用的Dao,通过反射实现相应功能,然后类似 company.insert() , company.query() 等形式的外部调用会更方便,也就是类似rails的ActiveRecord模式

侵入式设计要求程序员强制继承一个来自框架的基类。我以前曾经那么作过,,不过现在我更倾向于非侵入式,因为这样可以让程序员有更多的选择。因为你如果己继承自框架的基类,你就不能继承别的类了。

但是不管侵入还是非侵入,程序员的调用代码量都是差不多的。基本上侵入式框架原来你写一行java代码插入一条记录,非侵入式框架,你也只需要写一行代码。
0 请登录后投票
   发表时间:2009-05-22   最后修改:2009-05-22
1.建议还是直接使用sql,老实说我比较喜欢sql,调优也简单。
2、可以不用resultMap的,你直接返回map就完事了;要严谨点返回bean也行,select了几个字段,ibatis会自动填充到bean对应的属性里面。基本没必要用到resultMap,除非是调用存储过程。
3、ibatis的分页是无聊的很,有这样的做法
比如针对oracle
	<sql id="pageQueryStart">
		<![CDATA[
                         select * from (select row_.*, rownum rownum_ from (
                 ]]>
	</sql>

	<sql id="pageQueryEnd">
		<![CDATA[
                         )row_ where rownum<=#endRow# ) where rownum_>#startRow#
                 ]]>
	</sql>


然后在所有文件里面应用这两个sql片段。

4
0 请登录后投票
   发表时间:2009-05-22  
其实就是分页不好用,其它都不是问题,1、2本来就是ibatis的特性。

hibernate和ibatis面向不同的开发习惯的人,把hibernate的模式套到ibatis上就不对了。
0 请登录后投票
   发表时间:2009-05-22  
实际上 Nutz 最早的雏形(大概3-4年前吧)就是一个 SQL 管理器,类似 iBatis, 因为我很喜欢直接写 SQL。
我不喜欢 iBatis 的原因是因为它用 XML 管理 SQL
我希望我的 SQL 能写在一个 SQL 文件里,然后用 Eclipse 的 SQL Editor 打开,这样我可以看语法高亮
并且我希望我的 SQL 可以直接全选,然后在数据库客户端里直接执行。 所以我是这么规定 SQL 文件的格式的:

  1. 必须是个合法的 SQL
  2. 每条 SQL 前面的一行注释的内容,表示这个 SQL 的 key


所以,我可以这么写:

/*------------------------------------------------*/
/*abc.insert*/
INSERT INTO t_abc (name,value) VALUES(${name},${value});
/*------------------------------------------------*/
/*abc.delete*/
DELETE FROM t_abc WHERE name=${name}

里面的注释 /*--------------------*/ 没什么意义,就是为了看的清楚


在 Java 代码里可以这么写

Dao dao = new NutDao(dataSource,new FileSqlManager("demo.sqls"));
Sql<?> sql = dao.sqls().createSql("abc.insert");
sql.set("name","zozoh").set("value","Hello!!!");
dao.execute(sql);


至于执行查询的 SQL,以及如何取值,还有很多 Nutz SQL 的详细细节,请看

Nutz.Dao 的用户手册 Dao 自定义 自定义SQL操作 一节,里面有详细的代码实例,以及说明
0 请登录后投票
   发表时间:2009-05-22  
myreligion 写道
刚看了2天ibatis,感觉有些地方不太好用,准备改造一下,还请用的比较多的朋友指点下靠不靠谱。

1. SQL字段记起来太费劲。例如查询语句“select ACC_ID, ACC_FIRST_NAME, ACC_LAST_NAME, ACC_EMAIL from ACCOUNT”,无论是字段还是表名都是db里面的字段和名字,而我们在程序中实际使用的是ORM到POJO的类名和属性名称,要一下子记住2套,非常没有必要。可以改造一下,和hibernate的hql语句类似,sql语句中的字段和表名允许直接使用属性名称和类名(Alias名也可以),ibatis在执行sql的时候自动换回来,这样多方便。

2. resultMap的映射规则不合理。假设我有一个表,10个属性,resultMap允许填写3个,任何查询语句使用这个resultMap必须包含这3个字段,否则报错;查询语句也可以包含更多其他的字段,不报错也不进行OR映射(也就是说select多余的字段除了浪费流量没有别的用处,这个很不合理)。合理的应该颠倒过来的,resultMap填写完整的映射(10个字段就有10个字段的映射),select等查询语句可以选择例如2个,选择几个就ORM几个,没有选择留默认值。这样一个类只需要定义一个resultMap就够了,查询语句需要什么字段自己选择,多方便。

3. ibatis的翻页支持纯粹就是瞎闹。我们可以做个简单的dialect,专门解决翻页的问题,不用所有的翻页select都自己定义Limit。。。之类的。

4. ibatis cache不好用。ibatis cache的对象序列化方法应该允许自定义,默认是Java默认的序列化,也应该允许选择别的;cache control加上一个memcached的支持。

我看到的就这4个,不知道进行改造有没有用处,还是我的理解不对。


1、在sqlmap-mapping文件的sql语句中,如果直接使用类属性,还是需要把类属性映射到数据库表的字段上。简单地说就是要增加一个xml文件,描述java类的属性和db表的字段的映射。说到这,你感觉是不是和hibernate很像?

2、感觉你是想用一个万能的resultmap,什么查询结果都可以往里塞。如果这样你就完全没有必要显示地配resultmap,直接配置select的时候,指定resultmap为map类型就可以了。至于在java代码中怎么解释这个map,谁调用谁解释。


3、不好评论,翻页这东东,要找一个通用的实现机制,那就学hibernate吧。

4、我基本上不用ibatis的cache。
0 请登录后投票
   发表时间:2009-05-22  
最近在学习一个叫做 ebean 的新ORM框架,感觉是别出心裁,感觉比 jpa、hibernate、ibatis等都要更加轻量级。正在体验中,如果合适,准备替换掉现在正在使用的hibernate.
0 请登录后投票
   发表时间:2009-05-22  
如果你觉得hibernate 去映射版,就是ibatis了,直接写sql比用bean在维护性上差多了!!
0 请登录后投票
   发表时间:2009-05-24  
你得明白ibatis的设计目标:具备完整sql层控制力的sqlmap框架,它就干这个,而且只干这么,对于DAO层,ibatis的作者都推荐用spring来集成,自己原来的DAO层实现已经停止开发。

术业有专攻,ibatis只想做这些,楼主真有能力可以做一个ibatis封装,前提是楼主先读完ibatis的代码。

我倒是觉得做个ibatis的ide插件更实用,idea下已经有了。
2 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics