本人已死,有事烧纸
-nico

2008年2月2日

结合自己的实际经验,分析一下数据库持久层框架应该达到什么样的功能

    hibernate?ejb?以及最近了解到的ibatis?
    ejb历来以繁琐著称,或者称为重量级。
    hibernate,看看它的hello cat演示很简单,但实际使用中几乎没有那么简单的情况。一旦业务复杂的话,再考虑上性能等等要求,总觉得也过于重量级。最不爽的是一种情况是如果关系表(就是仅仅包含2个主业务表的数据关联,可能只有2,3个字段的那种)多一点,一对多,多对多,用起来总感觉象杀鸡用牛刀:明明就是几个关联简单处理一下即可,但却非要换成对象。还要lazy load。呵呵,抱怨一下。我用hibernate,操作上感觉比较舒服的是create和update的时候。最痛苦的是query,次不爽的是delete。
    ibatis,我只是看了一下所谓的demo,就跑了。配置文件复杂的来。。。且把sql写在配置中,个人总是很难接受这种方式,如果是team work的话,不够安全的说,总觉得貌似是个人都能改(最怕N个人在同一个xml中配自己的SQL,林子大了什么鸟都有,team人多了,什么问题都会出;这种多人搞一个文件就是问题的最佳孳生点)。

    罗索了这么多,下面说重点,开始总结。
    我觉得目前大部分都基于关系数据库的现状,增删改查四大功能中,【查】,【增】可充分考虑OO思想,【改】可以适用部分OO思想,【删】则几乎不用考虑OO。我所指的OO,是以对象的概念来操作的意思。

    【查】,我觉得可以做到调用者自己根据业务组织SQL语句,定义SQL结果数据存储POJO类,然后调用query方法,完成查询,并将结果集数据载入到POJO对象中。这个样子即满足了大部分的需求。分页暂不予考虑。
        public List doQuery(String sqlClause, Class pojoClass) throws XException;
            关于这个,我已经有一篇随笔,且自己已经代码实现并验证。所以不多说了。

    【增】,向指定的表插数据是比较容易让人联想到对象概念的操作。所以,应该比较适合使用对象。增操作时,指定表名,指定POJO对象实例,调用insert方法。
        public void doInsert(String tableName, Object pojoInstance) throws XException;
            所作的事情:
                1。从数据库载入表结构(一般来说表结构改动的可能性不大,一次扫描后可缓存)
                2。将POJO对象的get属性和表的字段,类型关联起来
                3。构造insert语句。最好再检查一下字段能否为null等等。
                4。执行insert语句。
            实际上,我觉得还有一种方式虽然对象概念不多,但应该也蛮灵活,好用的。
        public void doInsert(String tableName, Map values) throws XException;
            基本操作思想和上面的一致。不过不需要用反射获取属性信息了。直接从map中遍历即可。

    【改】,更新的字段多时,可能组织为一个POJO对象比较让人能接受;但如果每次只更新1,2个字段或者针对某个表更新业务比较多(这次是a,b字段,下次是c,d等字段)的话,貌似丢弃对象,直接MAP更方便丫。基本接口和insert类似。个人感觉这是一个比较中间化的操作。
 
    【删】,一般我们删除时都是根据主键或者某些字段的条件来的。简单根据主键来删时,貌似用MAP也比较能接受,因为通过指定俩参数,自己可以不用组织SQL,轻微爽的说。复杂点的删,业务要求组织一个暴恶心的SQL的情况也未尝不存在,这种情况下,我们最多提供一个直接执行SQL语句的接口即可。

以上纯属个人想法,不甚成熟,随笔记之,以做备忘。
posted @ 2008-02-02 20:08 Nico| 编辑 收藏
 

2008年1月30日

突然灵感:SQL查询结果和POJO的映射
    刚刚看了一篇关于IBM的pureQuery的介绍。
    结合工作中的实际情况。忽然发现,大部分的模块都会有查询功能。尽管很多项目都使用了hibernate,但是,查询结果页面上的数据一般都不会是单纯某个hibernate entity object所具备的,很多都是几张表的数据凑起来的。要是再加上分页要求的话,使用HQL查询似乎有困难。使用纯SQL,JDBC查询的话相对简单,但是,每个地方都会编写几乎雷同的代码。而这种情况出现多次的话,大家都会去COPY,PASTE。很快,各种小问题就跟着来了。
    所以,写一个实现如标题的小工具应该很有实用性。

public class SQLResults2POJOUtil {
    public SQLResults2POJOUtil (java.sql.Connection queryConnection) {
        ...
    }

    public List query(String sql, Object[] params, Class pojoClass) throws java.sql.SQLException {
        /* 第一步:执行SQL查询,得到结果集。
         * 第二步:将结果集中的每个column的name和pojoClass中的相关属性的set方法关联起来。
         * 第三步:遍历结果集的每个数据,设置到pojoClass的实例。
         * 最后:返回pojoClass集合。
         * 这里面有2个关键点,第一是column name和属性名称匹配时要忽略大小写,忽略下划线
         * 第二点是实际设置pojoClass实例的值时还要记得类型转换(常规转化就那么几种,可以考虑建立转化注册机制,方便实际使用中特殊类型转化的扩展需要)。
         */
    }

    public List query(String sql, Class pojoClass) throws java.sql.SQLException  {
        return (query(sql, null, pojoClass));
    }
}
posted @ 2008-01-30 21:28 Nico 阅读(414) | 评论 (0) | 编辑 收藏
 
仅列出标题  
 
<2025年7月>
日一二三四五六
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

 导航

  • BlogJava
  • 首页
  • 发新随笔
  • 发新文章
  • 联系
  • 聚合
  • 管理

 统计

  • 随笔: 2
  • 文章: 7
  • 评论: 0
  • 引用: 0

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与

留言簿(1)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2008年2月 (1)
  • 2008年1月 (1)

文章档案

  • 2008年1月 (3)
  • 2007年2月 (1)
  • 2006年7月 (3)

搜索

  •  

最新评论

阅读排行榜

  • 1. 结合自己的实际经验,分析一下数据库持久层框架应该达到什么样的功能(419)
  • 2. 突然灵感:SQL查询结果和POJO的映射(414)

评论排行榜

  • 1. 结合自己的实际经验,分析一下数据库持久层框架应该达到什么样的功能(0)
  • 2. 突然灵感:SQL查询结果和POJO的映射(0)

Powered by: 博客园
模板提供:沪江博客
Copyright ©2025 Nico