piliskys

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  25 随笔 :: 0 文章 :: 40 评论 :: 0 Trackbacks

前言:
如果你对hibernate不是那样的推崇,但感觉jdbc的sqlr操作又不是那么OO的话,那么这篇文章可能给能带来或多或少的期望…
在很长的一段时间里,中总感觉应该对sql的操作来实现一种集成化,这种想法可能是来源于hibernate操作的思维吧,当时头脑中有一些想法:
1, 最大程度的让编程者对数据库操作实现面向对象操作,(所有的一些基本操作,程序员可以不用去记住表的字段名,完全对象化,如插值,删值,像hibernate一样查出对多和对一的结果,把结果也对象化,一些不能实现的保留sql操作,)
2, 最大程度让sql语句重用,提高数据库的效率(利用程序对一些操作sql的集成,保证相同操作sql的一致性)
3, 操作要简单,容易与项目集成,通用(约束少)
对于当时,头脑中只是有这些朦胧的定义,而对于要实现何种方法,怎样把对对象操作来实现sql的拼接(这里就是一个反的过程),心里没底,但能够实现(只是功能的强弱问题)这一点很清楚,其实当时总是考虑实现后是否有其价值,是否对编程者有所帮助,这个是我一直没有抽时间做的主要原因。
正题:
通过这几天的一些空余时间,算完成了这个东西,不管它是否有用,只当是自己一次练习,现在把一些实现及调用的方法作个简介:
此工具自动生成两种文件vo与dao,
值对象(VO),每一个表对应一个vo,
vo与普通的javabean方法相同,有get和set方法,若表A的主键作为表B的外键,那么此vo有get B表的一个list(to-many),如果表A中引用了B 表的主键作为外键,那么它有get B 表的一个vo,(to-one)
数据访问对象(DAO),此文件对编程者是透明的,可以不作了解,主要是一些访问数据的方法,由公用接口调用。
首先在你的程序中调用接口的实现
DataStore ds  =     com.piliskys.dataStore.DataManager.getInstance();
首先申明此句并未得到数据库的联接,而是当操作时才得到数据库联接的,而且在同一次会话中,此联接是相同的,具体可看ConnectionUtil此类,此类可以对数务进行设置,
在此接口中,没有定义提高和回滚操作,因为这些操作都可定义在开发框架中,正常结束就提交,捕获异常就回滚,
这两操作可直接调ConnectionUtil.currentConnection("piliskys")的操作,
那么我们开始介绍它的各个方法,在此为一个tb_person表为例:
tb_person(per_name varchar2,per_age number), per_name 为主键
  1,  public  boolean delete(Object obj)
  删除单个vo,需要设置主键,
程序:删一个叫 小李 的记录
DataStore ds  = com.piliskys.dataStore.DataManager.getInstance();//这里是没有跟数据库
          ds.delete(new TbPerson("小李"));//有主键的表都有此构造方法
    ConnectionUtil.currentConnection("piliskys").commit;
----------------------------------------------
就这么简单,以下调用DataStore 和提交略

  2,  public  int deleteByVO(Object obj)//返回删除的记录数
注:如果未对obj设置任何条件将不会进行删除操作(因为个人认为这一般是不可能的,比较危险,所以加以控制)
程序:删除姓  李 的记录
 TbPerson tp =new TbPerson();
 tp.setPerName("李%");
 ds.deleteByVO(tp);
----------------------------------------------
程序:删除年龄大于等于 19岁的记录
  TbPerson tp =new TbPerson();
 tp.setPerAge(new Long(19),">=");//所有双参数方法都是为一些条件选择而用,后面一参数是用来设操作符的 > < >= <= !=,这些,方便吧
 ds.deleteByVO(tp);
----------------------------------------------
程序:删除年龄为空的记录
  TbPerson tp =new TbPerson();
  tp.setPerAge(null);
  ds.deleteByVO(tp);
----------------------------------------------
  3  public  int update(Object obj)
  此操作必须对主键进行设置,否则报错,设置其它字段属于为更新字段,其它字段未设置也会报错,说明没有可更新的字段,
程序 略
  4  public  int update(Object src,Object tar)//两对象必须同类(代表同一表)
   此操作 以前一对象做为条件进行批量更新后一对象设置的值,条件如是字符串可设置带%,条件对象也可加操作符,使用所有双参数设置都相同,其它可设置null,对''字符串不处理
程序 略
  5  public  boolean insert(Object obj)//未进行设置的字段为null
程序 插入一个叫 刘德华 年龄为38的记录
    TbPerson tp =new TbPerson();
    pt.setPerName("刘德华");
    pt.setPerAge(new Long(38));//age为Long型的话
    ds.insert(pt);
----------------------------------------------
程序 插入一个叫 罗拿多 的,年龄未知
    TbPerson tp =new TbPerson();
    pt.setPerName("罗拿多");
    ds.insert(pt);
----------------------------------------------
 6   public  List selectAll(Class class1)
返回所有记录(但此处为考虑程序的效率,设置了一个最大数,可参看原文件中定义的MAX_SIZE可进行更改,
程序 查出所有tb_person表的记录
     List list = ds.selectAll(TbPerson.class);//也简单吧
-----------------------------------------------
 7   public  void selectByPK(Object obj)
 根据主键查找记录 ,这个是无返回值的,返回的就是本身的这个obj,为了省点内存,不用多new一个对象,而且实现的话主键已经设好,只要设其它字段,而且个人认为这样更好用,如果一个表无主键,那么查出来的就是数据库的第一条记录,利用 rownum=1实现,而不是查出的第一条,最大程度地提高数据库的效率,
程序  查出名叫 刘德华的记录
     TbPerson tp =new TbPerson("刘德华");
     ds.selectByPK(tp);
然后 这个tp就是一个与数据库主键为刘德华的记录,可以用它了
-------------------------------------------------
 8  public  List selectByVO(Object obj)
此方法跟上面的deleteByVO的使用基本相同,返回值是vo的一个系列,
有一点不同的是,deleteByVO不设置任何查询条件将不会做操作,而此方法不设置任何条件的话就会查出所有的(个人认为查询是无危害性的,要查就查吧)
程序 参考 deleteByVO
 9  public  List selectByVO(Object obj, int i, int j)
  此方法是上一方法的扩充,主要是用于分页操作,
程序 查姓 刘 的第11条记录到20条
        ds.selectByVO(new TbPerson("刘%"),11,20);//呵呵,感觉这样有点别扭
本应该 TbPerson tp =new TbPerson();
                tp.setPerName("刘%");
         ds.selectByVO(tp,11,20);//效果一样,
--------------------------------------------------
 10  public  int sqlExcute(String s, List list)
这个是用于直接调 sql语句的操作,主要是执行一些更新,删除操作, list就是按条件顺序设置的参数集,PreparedStatement的操作
程序 略
  11  public List selectBySQL(String s, List list)
这个是用于直接调 sql语句的操作,执行查询操作, list就是按条件顺序设置的参数集,PreparedStatement的操作
return  List 含map的list,key为字段全部小写
程序 略
 12  public  List selectByQuery(String s, List list)
这个是用于直接调 sql语句的操作,执行查询操作, list就是按条件顺序设置的参数集,PreparedStatement的操作
return  List 含map的list,key为字段全部小写
程序 略
  13  public  List selectByQuery(String s, List list,int i,int j)
同上,但主要是为了分页操作,
        throws DAOException;

    public   void close()throws SQLException;
数据库联接关闭
关于事物提义及回滚请使用ConnectionUtil.currentConnection("piliskys")的操作。
此程序支持在控制台显示sql语句,可以在配制文件中设置是否显示,具体操作参看包中的说明。
========================================================================
当然个人的能力是有限的,如果你认为还应该实现什么功能,程序哪方面不如人意,本人只是按照自己的观点,站在一个编程者的角度考虑问题,不足之处可能很多,希望多提见意和建议,程序只是经本人进行测试,可能不是很全面,希望共同完善。
关于如何部署于程序,包中有说明。
注意事项:不支持复合主键作为其它表的外键,下次改进吧。

最后:请尊重他人成果,谢谢您的支持,本人邮箱piliskys@itpub.net希望得到你的意见和建议。
========================================================================
此处下载原程序http://www.blogjava.net/Files/piliskys/jdbcutil.rar

posted on 2006-03-29 13:43 霹雳火 阅读(2613) 评论(8)  编辑  收藏

评论

# re: Jbdc助手-数据库操作面向对象的实现(oracle) 2006-03-29 14:15 scud
普通的都好处理

但是对于组合查询,组合条件,多表查询,又该如何处理哪

DBHelper也可以很简单地实现这些功能,当然这些我早就想过:包括直接insert,update,delete一个对象

但是对于一个对象很简单,但是同时delete,update多个对象就不好处理了。至于你的两个参数的设置条件,我觉得不是很优雅。

  回复  更多评论
  

# re: Jbdc助手-数据库操作面向对象的实现(oracle) 2006-03-29 14:28 霹雳火
但是对于组合查询,组合条件,多表查询,又该如何处理哪
--------------------------------------------------------------
我想上面的东西还是要用sql直接处理吧,sql可以千变万化,对象化是很难实现的,表表关联的更不用说,我只是最大程度把关系对象化,
当时我也考虑不要两个参数的设置是否值得加入,但就算在单表查询中这种条件也是很多的,所以加入了,
DBHelper中加入了表的原始字段,我原先就觉得这点不好,当然个人的思考问题是不同的,看问题的方面也可能不同,
做这东西只是为了探讨其中的一些问题及方法,并不是为了得到一个肯定或其它之类的东西,
最后,谢谢你的回复,  回复  更多评论
  

# re: Jbdc助手-数据库操作面向对象的实现(oracle) 2006-03-30 12:36 rox
比较支持你的想法,因为有用过DB4O,很类似。
很多用过DB4O的,也会问如何才能实现SQL查询里面的一些特性。
因为大家已经习惯了关系型数据库,如何突破,我也很困惑。呵呵。  回复  更多评论
  

# re: Jbdc助手-数据库操作面向对象的实现(oracle) 2006-04-02 20:34 剑事
感觉不够通用  回复  更多评论
  

# re: Jbdc助手-数据库操作面向对象的实现(oracle) 2006-04-03 08:40 霹雳火
不知楼上在这方面有什么好的建议,一句话很简练,但除了打消别人的积级性这外,好象没有启到任何作用啊,希望得到一些具体的建议  回复  更多评论
  

# re: Jbdc助手-数据库操作面向对象的实现(oracle) 2006-04-04 16:50 Terry的回答
我一直有个疑惑:用SQL不好吗?学习SQL的成本应该远小于学习各种工具的成本(比如Hibernate)  回复  更多评论
  

# re: Jbdc助手-数据库操作面向对象的实现(oracle) 2006-04-05 08:57 霹雳火
如果把一个工具集成化后,那么学习它的成本应该是很低的,我们的初衷是只要懂java基础就能用这些工具,至于能不能达到这种要求,那是我们一直所追求的。
直接用sql:
1,sql的重用效率不高,各个程序员很难写出一致的sql。
2,操作上有时会较复杂,如一条插入语句远比面向对象操作复杂。
3,数据库关系的操作与程序面向对象操作不一致。
当然很多数据库操作面向对象很难实现,可能必须用sql来直接实现。但基于数据库2080原则,我们对其中一些sql操作面向对象化(如一些单表插入、删除、更新等),可能这此在sql语句中只占20%,但它们的操作频率可能占80%。因此,个人感觉这种集成是有必要的。  回复  更多评论
  

# re: Jbdc助手-数据库操作面向对象的实现(oracle) 2006-11-03 15:12 he
我觉得还是不要搞这样的高不成低不就的东西,因为这些东西做小应用不如直接采用jdbc简单,搞复杂的东西又满足不了应用,不过还是比较鼓励思考的。谨慎值得鼓励!!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: