是什么层次上的?你是想自己写一个jdbc?还是仅仅写一个针对具体应用的?

解决方案 »

  1.   

    我觉得你是想包装JDBC,然后构造面向应用的接口函数。如插入一条数据,删除数据,修改数据。但这里有一些问题。如插入数据时,显然要知道插入的表名,字段数据,如何做到比较通用?要通用只能在外部化定义,然后程序读取外部文件,进行操作。不知还有什么好方法。
      

  2.   

    建议你学一下PB的数据窗口,其他的还有Delphi的数据库操作。看看他们是怎么封装数据库操作的,应该对你有帮助。
      

  3.   

    网路说的比较贴近我的想法用OO思想和Design Pattern封装从取得连接到执行SQL获得结果集的所有数据库的一般操作哪位朋友做过这方面的开发吗?
      

  4.   

    这个应该不是很难的.你可以参考一下,那个连接池的SOURCE,对你应该蛮有价值的!
      

  5.   

    to pengji:能贴个链接地址吗?
      

  6.   

    我做的,关于接口的合理性,请斧正
    /*
     * iSee Software License, Version 1.0
     *
     * Copyright (c) 2002 iSee Studio.  All rights reserved.
     *
     * 爱思时代科技版权所有
     *
     */
    package isee.utility.datastorage;import java.io.IOException;import java.util.Hashtable;
    import java.util.Map;
    /**
     *  数据访问接口。 提供对XML和JDBC数据源的数据访问。
     *
     *@author     iSee
     *@created    2002年3月30日
     *@version    1.0,06/06/2001
     */
    public interface DataAccessible
    {
        //~ Methods ...............................................................    /**
         *  取得节点的属性列表,仅适用于XML数据源。 针对JDBC数据源,取得的值为下级的数据;
         *  针对XML文件,取得的值为指定节点包含的全部元素和属性;属性名称加前缀@,以区分同名元素。
         *
         *@param  key            节点路径
         *@return                The attributes value
         *@exception  Exception  Description of the Exception
         */
        public Hashtable getAttributes( java.lang.String key )
                                throws Exception;    /**
         *  查询满足指定条件的数据是否存在。
         *
         *@param  key            数据访问串
         *@return                存在返回true,否则返回false
         *@exception  Exception  出错时抛出
         */
        public boolean isExist( String key )
                        throws Exception;    /**
         *  设置指定节点的值。 <P>
         *
         *  <CODE>    DataAccessible dm = new DataMediator();</CODE></P> <P>
         *
         *  <CODE>    String path="project/target[@name='init']/taskdef/@name";</P>
         *  <P>
         *
         *  <CODE>    dm.setValue(path,new Object());</CODE></P>
         *
         *@param  key                   数据访问串
         *@param  value                 新值。
         *@return                       long 成功返回1;否则返回0;出现不预期的异常则返回-1;。
         *@exception  Exception         Description of the Exception
         *@throws  java.io.IOException
         *@roseuid                      3B64B3E20348
         */
        public long setValue( java.lang.String key, Object value )
                      throws Exception;    /**
         *  取值(XML数据文件中不能包含PI,否则JDOM将无法解析)。 示例如下: <P>
         *
         *  <CODE>    import isee.mymisc.Const; </P> </CODE> <P>
         *
         *  ...</CODE> <P>
         *
         *  <CODE>    DataAccessible dm = new DataMediator();</CODE></P> <P>
         *
         *  <CODE>    String path;</CODE></P> <P>
         *
         *  <CODE>    path = "xml/Root/Node[Code='04']/Name";    <FONT color="green">// 取Code字段值为'04'的Name</FONT>
         *  </CODE></P> <P>
         *
         *  <CODE>    Object value = dm.getValue(path); </P> </CODE> <P>
         *
         *  <CODE>    path = "xml/Root/Node[position()=2]/Code";    <FONT color="green">// 取绝对位置为2的记录</FONT>
         *  </CODE></P> <P>
         *
         *  <CODE>    Object value = dm.getValue(path); </P> </CODE> <P>
         *
         *  <CODE>    path = "xml/Root/Node[2]/Code";    <FONT color="green">// position()=2的省略写法</FONT>
         *  </CODE></P> <P>
         *
         *  <CODE>    long longValue = dm.getValue(path,Const.DATATYPE_LONG).longValue(); </P>
         *  </CODE> <P>
         *
         *  <CODE>    path = "xml/Root/Node[3]/Code";</CODE></P> <P>
         *
         *  <CODE>    int intValue = dm.getValue(path,Const.DATATYPE_INTEGER).intValue(); </P>
         *  </CODE> <P>
         *
         *  <CODE>    path = "xml/Root/Node[4]/Code";</CODE></P> <P>
         *
         *  <CODE>    double doubleValue = dm.getValue(path,Const.DATATYPE_DOUBLE).doubleValue(); </P>
         *  </CODE> <P>
         *
         *  <CODE>    path = "xml/Root/Node[last()]/Name";</CODE></P> <P>
         *
         *  <CODE>    Object value = dm.getValue(path); </P> </CODE> <P>
         *
         *  <CODE>    boolean boolValue = ((Boolean) value).booleanValue(); </P>
         *  </CODE>
         *
         *@param  key                   路径字符串,形如:<BR/>
         *      XML数据源: Datasource/根节点名称/子节点[过滤条件]<BR/>
         *      JDBC数据源:Datasource/Root/RecordSet/字段名称[过滤条件]<BR/>
         *      Datasource为DatastorageConst类中指定的配置文件XMLFileMap.xml的Entry的name属性<BR/>
         *      过滤条件包含在[]封闭的区域中,XML的属性前加@区分。 例如:<BR/>
         *      <CODE>Datasource1/Root/Node/Name<BR/>
         *      JDBCDatasource/Root/RecordSet/ProductName[ProductID=2]</CODE>
         *@return                       取到的Object类型的值。可使用强制数据类型转换处理。
         *@throws  java.lang.Exception
         */
        public Object getValue( String key )
                        throws java.lang.Exception;    /**
         *  取值,指定期望的数据类型。
         *
         *@param  key                   路径字符串,形如:<BR/>
         *      XML数据源: Datasource/根节点名称/子节点[过滤条件]<BR/>
         *      JDBC数据源:Datasource/Root/RecordSet/字段名称[过滤条件]<BR/>
         *      Datasource为DatastorageConst类中指定的配置文件XMLFileMap.xml的Entry的name属性<BR/>
         *      过滤条件包含在[]封闭的区域中,XML的属性前加@区分。 例如:<BR/>
         *      <CODE>Datasource1/Root/Node/Name<BR/>
         *      JDBCDatasource/Root/RecordSet/ProductName[ProductID=2]</CODE>
         *@param  dataType              按照该数据类型进行强制类型转换。取值范围参见isee.mymisc.Const类。
         *@return                       取到的Object类型的值。可使用强制数据类型转换处理。
         *@see                          isee.mymisc.Const
         *@throws  java.lang.Exception
         */
        public Object getValue( String key, int dataType )
                        throws java.lang.Exception;    /**
         *  <P>
         *
         *  删除满足指定条件的记录。</P> <P>
         *
         *  <CODE>    DataAccessible dm = new DataMediator();</CODE></P> <P>
         *
         *  <CODE>    long count = dm.delete("xml/XmlMap/Entry[@name='TestInsert']");</CODE>
         *  </P>
         *
         *@param  key            数据访问串
         *@return                删除的记录数
         *@exception  Exception  Description of the Exception
         */
        public long delete( String key )
                    throws Exception;    /**
         *@param  key
         *@param  nameValueString  Description of the Parameter
         *@return                  String[]
         *@exception  Exception    Description of the Exception
         *@deprecated              不建议使用,未实现
         */    //public String[] getValueList(String key);    /**
         *  在指定的节点插入新值。 <P>
         *
         *  <CODE>    DataAccessible dm = new DataMediator();</CODE></P> <P>
         *
         *  <CODE>    HashTable values = new HashTable();</CODE></P> <P>
         *
         *  <CODE>    values.put("@name","TestInsert");</CODE></P> <P>
         *
         *  <CODE>    values.put("Boolean",new Boolean(true));</CODE></P> <P>
         *
         *  <CODE>    values.put("Long",65535);</CODE></P> <P>
         *
         *  <CODE>    dm.insert("xml/XmlMap/Entry",values);</CODE></P>
         *
         *@param  key              数据源路径:只能有两段
         *      第一段为数据源ID,第二段为表名称或XML二级节点(字段容器)名称,不能包含条件。
         *@param  nameValueString  表征新节点的名值对列表;如:name=name,type=xml,....
         *@return                  long 插入的记录数。
         *@exception  Exception    Description of the Exception
         */
        public long insert( String key, String nameValueString )
                    throws Exception;    /**
         *  在指定的节点插入新值。
         *
         *@param  key            数据访问串
         *@param  values         HashTable的名值对
         *@return                插入的记录数。
         *@exception  Exception  Description of the Exception
         */
        public long insert( String key, Map values )
                    throws Exception;
      

  7.   

    /**
         *  在指定的节点批量插入新值。
         *
         *@param  key            数据访问串
         *@param  records        HashTable的名值对数组
         *@return                插入的记录数。
         *@exception  Exception  Description of the Exception
         */
        public long insert( String key, Map[] records )
                    throws Exception;    /**
         *  读取数据到RecordSet。
         *
         *@param  key            数据访问串
         *@param  pageNumber     页号
         *@param  rowsPerPage    每页记录数
         *@return                返回的记录集
         *@exception  Exception  Description of the Exception
         *@see                   RecordSet
         */
        public RecordSet read( String key, int pageNumber, int rowsPerPage )
                       throws Exception;    /**
         *  读取数据到RecordSet。
         *
         *@param  key            数据访问串
         *@return                isee.utility.datastorage.RecordSet 返回的记录集
         *@exception  Exception  Description of the Exception
         *@see                   RecordSet
         */
        public RecordSet read( String key )
                       throws Exception;    /**
         *  更新满足指定条件的数据。
         *
         *@param  key            数据访问串
         *@param  values         HashTable的名值对
         *@return                long 更新操作影响的记录数
         *@exception  Exception  Description of the Exception
         */
        public long update( String key, Map values )
                    throws Exception;
    }
      

  8.   

    怎么没人提意见啊:(
    我自己先说几个不足吧
    1、当时不熟悉Java,返回值该使用int的使用了long,应改为int,但已使用,改变已有源码工作量过大,所以未更正。
    2、为统一进行异常定义,未抛出明确类型的异常。
    3、欠缺数据迁移的方法,如copy或move。
    请指正
      

  9.   

    我做过的一个工作就是做一个bean
    通过配置文件来根据数据库的不同,应用服务器的不同(用连接池时)
    来达到应用程序使用接口的统一唯一不足的是,定义接口的时候应该采用javax.sql里面Connection,Statement,ResultSet等所有接口的名称和参数,这样客户段就可以直接象使用jdbc一样操作数据库而我做的这个不是,而是取其中主要部分,并且封装到了其中一个类
    这样别的程序员还得来熟悉接口
      

  10.   

    我做过的一个工作就是做一个bean
    通过配置文件来根据数据库的不同,应用服务器的不同(用连接池时)
    来达到应用程序使用接口的统一唯一不足的是,定义接口的时候应该采用javax.sql里面Connection,Statement,ResultSet等所有接口的名称和参数,这样客户段就可以直接象使用jdbc一样操作数据库而我做的这个不是,而是取其中主要部分,并且封装到了其中一个类
    这样别的程序员还得来熟悉接口
      

  11.   

    To Patrick_DK:
    不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进
    To Brain:
    是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。
      

  12.   

    To Patrick_DK:
    不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进
    To Brain:
    是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。
      

  13.   

    To Patrick_DK:
    不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进
    To Brain:
    是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。
      

  14.   

    呵呵,王文友,好久没看见你。最近忙什么哪?几个小意见,
    1。最好不用Hashtable, Map比Hashtable抽象。
    2。java.util.Map的方法很多。猜想很多方法都是你不需要的。所以也许你可以自己定义一个更符合自己要求的Map接口。接口越小,别人越好实现。
    3。一些key什么的,定义成自己的接口比直接用String更灵活。
      

  15.   

    呵呵,王文友,好久没看见你。最近忙什么哪?几个小意见,
    1。最好不用Hashtable, Map比Hashtable抽象。
    2。java.util.Map的方法很多。猜想很多方法都是你不需要的。所以也许你可以自己定义一个更符合自己要求的Map接口。接口越小,别人越好实现。
    3。一些key什么的,定义成自己的接口比直接用String更灵活。
      

  16.   

    王文友,好久不见你上csdn啦。
    最近在忙什么哪?
    几个小建议:
    1。 使用Map比使用Hashtable好
    2。 自己定义Map接口比用jdk的好。更能体现你的需求
    3。 为key使用自定义接口比用String灵活。
      

  17.   


    To Patrick_DK:
    不敢,我是想和大家讨论,同时吸收大家的思想,对该接口作改进
    To Brain:
    是啊,我当时也想过做ResultSet的实现,但后来还是自己做了一个RecordSet接口,仿照ResultSet的定义,同时借鉴ADO的Recordset。这样我能够比较自由的定制。
    To ajoo:
    我倒是常见你的文章:)很受启发
    所言极是,我原来不熟悉Java的Collection和一些OO的思想方法,所以采用了错误的定义,现在已部分改为Map。自定义的容器是更灵活,我现在的系统中有两个基类ParameterStruct和ParamList,第一个是参数基类,所有的参数类定义都由它继承,作一定扩展,第二个作为ParamStruct的容器,内部使用JGL的Collection,提供一些find和isExist的方法。因我的系统使用Servlet+XSLT开发,对XML需求比较大,所以我覆盖了它们的toString()。至于没使用标准的ResultSet,而自己定义了一个RecordSet,也有这方面的原因--为RecordSet提供了一个通用的toXml()方法,生成相应的XML串。
    至于key采用自定义接口,很好的建议!我原来见一些系统的接口定义都是这样的(Key key,Value value),感觉确实不错:)谢谢大家的建议:)请继续!
    BTW:CSDN真是郁闷,我现在总发不了消息:发送失败三次后,发送计数更新了,正文却没进去,还告诉我“不能联系回复三次以上” :(
      

  18.   

    是啊,是啊!
    所以有时还得换一个账号发。史特!另一点浅见:一般不喜欢做一个鸡肋让别人继承。Java里就那么一个鸡肋的位置,要是我占了,别人就没有自由去继承其它不那么绅士的库的鸡肋了。
    而且,鸡肋和子类的强耦合关系也很讨厌。你一旦发布了一个鸡肋,再加任何一个函数都有可能造成问题。
      

  19.   

    是这样的,不过其实我那个基类的定义是空的,它也就相当于Object,顶多根据以后的需求加上几个诸如length(标识它的参数个数)、version(参数类版本号)的属性。当时没使用接口也是因为这样的原因--因为它本来就是空的。我只是想把它们作为一种分类,利于管理和以后的调用。
    现在最大的问题就是你所说过的Key的问题了,原来我的定义是使用自己扩展的XPath,综合考虑了我所可能操纵的数据:主要是JDBC数据和XML数据(当时忽略了Mail,而且也不知道JNDI),因为XML结构比RDB的Table复杂,所以放弃SQL,让它迁就于XPath。带来的问题就是复杂查询(如多表查询)无法进行确切的XPath定义。真是头痛:)
      

  20.   

    是这样的,不过其实我那个基类的定义是空的,它也就相当于Object,顶多根据以后的需求加上几个诸如length(标识它的参数个数)、version(参数类版本号)的属性。当时没使用接口也是因为这样的原因--因为它本来就是空的。我只是想把它们作为一种分类,利于管理和以后的调用。
    现在最大的问题就是你所说过的Key的问题了,原来我的定义是使用自己扩展的XPath,综合考虑了我所可能操纵的数据:主要是JDBC数据和XML数据(当时忽略了Mail,而且也不知道JNDI),因为XML结构比RDB的Table复杂,所以放弃SQL,让它迁就于XPath。带来的问题就是复杂查询(如多表查询)无法进行确切的XPath定义。真是头痛:)
      

  21.   

    刚刚写了一个通用的数据库连接访问的通用类。(参考了很多书,自己还觉得有点问题,请高手斧正)
    一管理数据库连接类
    package dbproc;
    import debug.*;
    import java.sql.*;public class ConnectionManager
    {
          public ConnectionManager(){            writer = new DebugWriter();
        }
        public String getDriverClass(){
            return driver;
        }    public void setConnectionUrl(String s){
            url = s;
        }    public void setDebug(String b){
            debug = b.equals("true");
        }    public void setUserId(String s){
            user = s;
        }
        /******************
         * Sets the passwd for the next logon attempt
         * @return String
         ****************/
        public void setPassword(String s){
            passwd = s;
        }    public Connection logon(){
            try{
                Class.forName( driver ).newInstance();
               }
             catch (Exception ex){
                     if (debug)
                     writer.writeDebug("Error setting driver: "+ex);
              }
            try{
                con = DriverManager.getConnection( url, user, passwd );            if (debug)
                                writer.writeDebug("Connection succeded! URL: " + url +
                                            " Driver: " + driver + "  User: " + user + " Pwd: " + passwd);
                return con;
            }
            catch(Exception ex){
                    if (debug)
                            writer.writeDebug("Connection failed! URL: " + url +
                                            " Driver: " + driver + "  User: " + user + " Pwd: " + passwd +
                                            ex.getMessage());
            return null;
             }    }    private boolean debug = false;
        protected Connection con;
        protected String driver="sun.jdbc.odbc.JdbcOdbcDriver";
        protected String passwd;
        protected String user;
        protected String url="Jdbc:Odbc:cmusic";
        protected DebugWriter writer;    public static void main(String[] args) {
           ConnectionManager con= new ConnectionManager();
           //con.setDebug("true");
           con.logon();    }
      

  22.   

    二通用操作数据库的类,可以返回recordset或者一个ventor
    package dbproc;import java.sql.*;
    import debug.*;
    import java.util.*;public class dbApp {private ConnectionManager conMan;
    private Statement stmt = null;
    private ResultSet rs = null;
    private DebugWriter writer;
    private boolean debug = false;
    protected Connection con;
    private String sql;
    private Vector resultsVector;
    public dbApp()
    {
     writer = new DebugWriter();
     conMan= new ConnectionManager();
     con   = conMan.logon();
     resultsVector=new Vector();
    }
    public void setSql(String s){
      sql=s;
    }
    public String getSql(){
      return sql;
    }
    public void setDebug(String b){
        debug = b.equals("true");
        }//执行Select语句
    public ResultSet executeQuery(String sql) {
      if (sql == null || sql.equals("")){
          if (debug)  writer.writeDebug("sql is null");
          return null;
        }
    rs = null;try {
    stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    rs = stmt.executeQuery(sql);
    }catch(SQLException ex) {
      if (debug)  writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
    }
    return rs;
    }public ResultSet executeQuery(){
      if (sql == null || sql.equals("")){
        if (debug)  writer.writeDebug("sql is null");
        return null;
        }
      rs = null;  try {
        stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs = stmt.executeQuery(sql);
       }catch(SQLException ex) {
        if (debug)  writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
          }
        return rs;
    }//执行Insert,Update语句
    public void executeUpdate(String sql) {
      if (sql == null || sql.equals("")){
          if (debug)  writer.writeDebug("sql is null");
          return;
        }
    stmt = null;
    rs=null;
    try {
    stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    stmt.executeQuery(sql);
    stmt.close();
    con.close();
    }
    catch(SQLException ex) {
      if (debug)  writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
    }
    }public void executeUpdate() {
      if (sql == null || sql.equals("")){
          if (debug)  writer.writeDebug("sql is null");
          return;
        }
    stmt = null;
    rs=null;
    try {
    stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    stmt.executeQuery(sql);
    stmt.close();
    con.close();
    }
    catch(SQLException ex) {
      if (debug)  writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
    }
    }
    public void closeStmt(){
    try{
    stmt.close();
    }
    catch(SQLException e){
      if (debug) writer.writeDebug("close stmt error:" +e.getMessage());
      e.printStackTrace();}
    }public void closeConn(){
    try{
    con.close();
    }
    catch(SQLException e){
      if (debug) writer.writeDebug("close connection error:" +e.getMessage());
      e.printStackTrace();
    }
    }public Vector executeQueryVector(String s){
      if (sql == null || sql.equals("")){
        if (debug)  writer.writeDebug("sql is null");
        return null;
                }
      rs = null;  try {
        stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs = stmt.executeQuery(sql);
        ResultSetMetaData meta=rs.getMetaData();
        int count;
        count=meta.getColumnCount();    while(rs.next()){
         HashMap cols=new HashMap(count);
         int i;
          for (i=0; i<count; i++){
            Object ob=rs.getObject(i+1);
            if (rs.wasNull()) {
              ob=null;
            }
            cols.put(meta.getColumnName(i+1),ob);
          }
          resultsVector.add(cols);
        }
        return resultsVector;
       }catch(SQLException ex) {
        if (debug)  writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
          }
        return null;
    }public Vector executeQueryVector(){
      if (sql == null || sql.equals("")){
        if (debug)  writer.writeDebug("sql is null");
        return null;
                }
      rs = null;  try {
        stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs = stmt.executeQuery(sql);
        ResultSetMetaData meta=rs.getMetaData();
        int count;
        count=meta.getColumnCount();    while(rs.next()){
         HashMap cols=new HashMap(count);
         int i;
          for (i=0; i<count; i++){
            Object ob=rs.getObject(i+1);
            if (rs.wasNull()) {
              ob=null;
            }
            cols.put(meta.getColumnName(i+1),ob);
          }
          resultsVector.add(cols);
        }
        return resultsVector;
       }catch(SQLException ex) {
        if (debug)  writer.writeDebug("执行SQL语句出错:" + sql+" "+ex.getMessage());
          }
        return null;
    }
    public static void main(String[] args)
    {
     dbApp app=new dbApp();
     app.setSql("select * from com_register");
     /*ResultSet s=app.executeQuery();
     try{
     while (s.next()){
       System.out.print(s.getString(1)+"--");
       System.out.println(s.getString(2));
     }
     }catch(Exception e){e.printStackTrace();}
     app.closeStmt();
     app.closeConn();*/
     /*
     Vector a=app.executeQueryVector();
     int newcount=a.size();
     for (int i=1;i<=newcount;i++)
     {
      HashMap n=(HashMap)a.get(i);
      System.out.println(n.get("usrcode")+"--"+n.get("pwd"));
     }*/
    }}
      

  23.   

    netrouter(网路) :
    “我觉得你是想包装JDBC,然后构造面向应用的接口函数。如插入一条数据,删除数据,修改数据。但这里有一些问题。如插入数据时,显然要知道插入的表名,字段数据,如何做到比较通用?要通用只能在外部化定义,然后程序读取外部文件,进行操作。不知还有什么好方法。”to 网路:
    其实在运行期也可以知道表名、字段名等“类”信息,
    sql的PreparedStatement里面的.getMetaData()方法可以返回表的信息,java的Reflection机制可以找到object的类信息。
    我觉得问题在确定value object的字段与数据库表的字段名对应的方式。 如果是一一对应的问题不大,可对象模型和数据库模型很少有一一映射的,所以这个假设其实变得并不通用。没有读过面向对象数据库的设计思想,呵呵,不知道他们怎么解决的。
      

  24.   

    我给你提供点资料
    你去www.google.com上搜vbsf download java
    然后把vbsf下载下来
    剩下的老兄自然就明白了,东西早就有人做了出来,只不过影响不大
    就算你仍然想做,也可以有很多借鉴意义另外推荐你一本老书,《自学jdbc数据库编程21天》清华出版社98年出的
    现在能否买得到不清楚,那里面调用和封装的思想也不错,如果你有兴趣,
    巴黎面的东西整理一下封装成一个大包,也是不错的
      

  25.   

    我设计了一个 Bean, 可通过配置文件配置 访问数据库的参数,然后使用者只要会
    SQL,就可以操作数据库,无需对 java.sql.* 的知识,支持事务,当然如果想使用 statement 之类的 接口也是支持的,已使用了4年了,感觉十分好!
    使用 delete/select/update/insert/ 就可完成 95% 以上的通用操作,
    如果要使用高级的,则提供了 tramsaction/connect/statement/resultset等
    java.sql.* 中提供的接口
      

  26.   

    to zhangbaobin(保斌) (  ) 信誉:94 我找不到你说的VBSF,你能提供一个具体连接吗?谢谢 
    to qfjiang(Jiang) (  ) 信誉:100 你能共享一下你的源码和文档吗?
      

  27.   


    没什么必要。将项目中有关DB的操作集合成实体类,屏蔽外部对JDBC的接触,即可。
    这样的实体在项目框架中,可以理解为永久化资源层。可从根本上隔离应用系统中其他部分对DB的依赖性。再数据库的操作实现一个通用抽象,纯粹是多此一举。OO不能从技术上去想,OO是一种程序组织的细想,OO可以是为了封装操作,封装策略,也可以用来作为整个系统的架构分层来用。
      

  28.   

    在我们team的开发体系中,有自己的一套完整的面向DB的library,使用这套架构,在coding的时候,面向单个表的insert/update/delete/query,我们的程序里面不需要出现sql语句,全部由library动态生成和动态帮定。大家可以参考一下Entity Bean是怎么实现的。
      简单的说,对于DB中的一个table,我们有这样一些java文件于之对应:
      Model class:封装纯数据类
      DAO class:封装DB操作,通常是由父类集成下来,如从OracleDAO集成下来。
      properties文件:用来描述table和model类的对应关系,比如
      <schema table="test" model="TestModel">
        <column name="key" type="char" length="20" field="key" />
        ....
      </schema>  
      在这种体系下,对于每个表我们只要定制properties文件,然后我们的Dao在运行状态下会读取这个peoperties文件,加载这些meta信息,动态生成和帮定sql语句。
      而这些dao,model和properties文件,我们也有代码生成器来自动生成代码。
      因此,以前最麻烦的例如修改数据库结构、增加table等问题,在现在的体系下就是小菜一叠,使得开发人员可以把绝大部分精力放在business logic的实现上。  大家可以研究一下Entity Bean的实现和运行方法。
      

  29.   

    sourceforge上有一个DBForm包,不妨找来看看。geyebing(bing) 
    qfjiang(Jiang) 
    两位兄台,可否共享一下源码吗?
    谢谢谢谢谢谢谢谢乐![email protected]
      

  30.   

    好贴,可是FT的csdn,改成xml,也不好保存。
      

  31.   

    去http://www.coolservlets.com下一个数据库连接池的东东,很不错的。是开放的原代码,偶们公司都用它!!
      

  32.   

    晕---做的目的----每个人都不一样
    JDBC接口就是SUN提供的API。我实现的BEAN是为了屏蔽DBMS和APPSERVER,通过简单配置做到在各大DB和APPSERVER上的真正的可移植,所以加了一层,通过调用各大DB厂商的JDBC实现类来达到对应用层的接口的统一。这个工作要根据公司的需要项目的需要等等来决定是否必要做;
    一般项目是选定DB,APPSERVER这个项目就一直用它,所以没必要做象I做的BEAN。
      

  33.   

    我说说我的想法:
    1.建立一个建立连接池的配置文件eg:.cfg file,含driver,url,user,pass,etc
    2.建立连接池类
    3.引用连接池建立数据库操作类
    4.打包生成jar我像这样做通用性比较好!
      

  34.   

    可以看 Together 的例子CashSales。
    用抽象类实现通用的添加,修改,删除,列表查询等功能。
    业务处理类继承该抽象类,只需要设置相应的属性字段和值。
    调用相应的add,delete,list,update方法即可实现数据操作,
    不必写sql.非常有价值。
      

  35.   

    http://www.paidexplosion.com/cgi-bin/[email protected]