如鵬網 大學生計算機學習社區

          CowNew開源團隊

          http://www.cownew.com 郵件請聯系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks

          今天做了個executeBatch的例子,可是輸的結果卻出乎我的意料,如下

          begintime:2006-05-25 09:58:11.0
          endtime:2006-05-25 09:58:11.14
          sqlType:executeBatch
          sql:insert into tmm_bill (billname, billdesc) values (?, ?);insert into tmm_bill (billname, billdesc) values (?, ?);
          paramters:[1, 2]

          為什么輸出的是兩個語句,而只有一組參數呢,于是我決定一探究竟.

          下面是我的例子

          ?? conn = DriverManager
          ???? .getConnection("listenerconfig=/com/cownew/JDBMonitor/demo/oracleconfig.xml:url=jdbc:oracle:thin:@zbw:1521:xinem8gg", "m8connect", "m8connect");
          ?? //for (int i = 0; i < 10; i++)
          ?? //{

          ??? ps = conn
          ????? .prepareStatement("insert into tmm_bill (billname, billdesc) values (?, ?)");
          ???
          ??? ps.setString(1,"songzho");
          ??? ps.setString(2, "yufn");
          ???
          ??? ps.addBatch();
          ???
          ??? ps.setString(1, "2");
          ??? ps.setString(2, "3");
          ???
          ??? ps.addBatch();
          ???
          ???
          ??? ps.executeBatch();
          ??? ps.close();

          原來我們輸出的內容封裝在SQLInfo這個類中

          這個類中有一個get和set方法用來取值和付值,這個我就不多介紹了,主要說一下其中一個方法

          private List parameters = new ArrayList();

          ?public List getParameters()
          ?{
          ? return parameters;
          ?}

          public String toString()
          ?{
          ? StringBuffer sb = new StringBuffer();
          ? sb.append("begintime:").append(beginTime).append("\n");//設置開始執行語句的時間
          ? sb.append("endtime:").append(endTime).append("\n");//設置結束執行語句的時間
          ? sb.append("sqlType:").append(sqlType).append("\n");//設置語句的類型
          ? sb.append("sql:").append(sql).append("\n");//設置語句
          ? if(parameters.size()>0)
          ? {
          ????? sb.append("paramters:").append(parameters).append("\n");//設置參數,就是這里有點問題
          ? }
          ? return sb.toString();
          ?}

          在這里大家可以看出來parameters就是用來傳入參數的arrayList,可是這里只能存一組參數;

          我們再看一下 DBPreparedStatement 這個類,這個類的意義也不用多說了吧,主要看看兩個方法

          ?public int[] executeBatch() throws SQLException
          ?{
          ? SQLInfo info = new SQLInfo();
          ? info.setSqlType(SQLTypeEnum.executeBatch);//SQLInfo類設置SqlType的方法
          ? info.setBeginTime(JdbcUtils.getTimeStamp());//SQLInfo類設置BeginTime的方法
          ? info.setSql(sbAddBatch.toString());//SQLInfo類設置Sql的方法,sbAddBatch是一個StringBuffer

          ? int[] ret = stmt.executeBatch();

          ? info.setEndTime(JdbcUtils.getTimeStamp()); ());//SQLInfo類設置EndTime的方法
          ?
          ? if (params != null && paramCount != 0)//這里是設置參數的地方,就是這里出了一點問題,params只是保存一組參數,也就是最后一組
          ????????? //對于只有一組參數是沒有問題的,可是如果有多組參數就會出現上面我說的那個現象了
          ? {
          ?? int i = 0;
          ?? for (int size = paramCount; i < size; i++)
          ??? info.getParameters().add(params[i]);
          ? }
          ? logSql(info);
          ? sbAddBatch.setLength(0);
          ? return ret;
          ?}

          我改動的方法是這樣的
          private ArrayList paramsList = new ArrayList();
          public class DBPreparedStatement extends DBStatement implements
          ??PreparedStatement
          {
          ?.
          ?.
          ?.
          ?public void addBatch() throws SQLException
          ?{
          ??//sbAddBatch.append(sql).append(";");
          ???? ArrayList pListTemp = new ArrayList();
          ???? for (int i = 0; i < paramCount; i ++)
          ???? {
          ???????? pListTemp.add(params[i]);//把每一組參數存到一個ArrayList里面
          ???? }
          ????
          ???? paramsList.add(pListTemp);//再把那個臨時的TempList存到一個ArrayList里面

          ??
          ??((PreparedStatement) stmt).addBatch();

          ?}

          ?.
          ?public int[] executeBatch() throws SQLException
          ?{
          ??
          ???? sbAddBatch.append(sql);
          ????
          ???? SQLInfo info = new SQLInfo();
          ??info.setSqlType(SQLTypeEnum.executeBatch);
          ??info.setBeginTime(JdbcUtils.getTimeStamp());
          ??info.setSql(sbAddBatch.toString());

          ??int[] ret = stmt.executeBatch();

          ??info.setEndTime(JdbcUtils.getTimeStamp());??
          ??
          ??if (paramsList != null && paramsList.size() != 0)
          ??{
          ???for (int i = 0; i < paramsList.size(); i ++)
          ???{
          ?????? info.getParameters().add(paramsList.get(i));//取到每一個TempList
          ???}

          ?????
          ??}
          ??logSql(info);
          ??sbAddBatch.setLength(0);
          ??return ret;
          ?}
          ?.
          ?.
          ?.
          }
          public class SQLInfo implements Serializable
          {
          ?.
          ?.
          ?.
          ?public String toString()
          ?{
          ??StringBuffer sb = new StringBuffer();
          ??sb.append("begintime:").append(beginTime).append("\n");
          ??sb.append("endtime:").append(endTime).append("\n");
          ??sb.append("sqlType:").append(sqlType).append("\n");
          ??sb.append("sql:").append(sql).append("\n");
          ??if(parameters.size()>0)
          ??{
          ????? for (int i = 0; i < parameters.size(); i ++)
          ????? {
          ????????? sb.append("paramters:").append((ArrayList)parameters.get(i)).append("\n");//循環取TempList里的參數
          ????? }

          ??}
          ??return sb.toString();
          ?}
          }
          得到的結果為
          begintime:2006-05-25 13:16:00.218
          endtime:2006-05-25 13:16:00.234
          sqlType:executeBatch
          sql:insert into tmm_bill (billname, billdesc) values (?, ?)
          paramters:[songzho, yufn]
          paramters:[2, 3]

          也不知道各位看官看明白了沒有,其實不懂也沒什么關系,我只是想在這里給大家說一下我們輸出方式,總結一下就是我們做了自己的DBConnect,DBStatetment,
          DBPrepareStatement....,都是繼承了JDBC的原型,在實現這些功能的之前,先把信息記錄在SqlInfo里,再跟據配置的寫日志方式進行寫日志.
          作者月光光是CowNew開源團隊(http://www.cownew.com)JDBMonitor開發組的核心開發人員,在J2EE開發方面頗有造詣。

          posted on 2006-05-27 01:46 CowNew開源團隊 閱讀(1253) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 昆山市| 栾川县| 安康市| 南通市| 永定县| 陆良县| 饶平县| 凤翔县| 德保县| 桐乡市| 来安县| 郑州市| 饶平县| 增城市| 岳阳县| 眉山市| 大冶市| 双辽市| 绥宁县| 正镶白旗| 阜新市| 镇宁| 宾阳县| 丹江口市| 天长市| 阜平县| 平南县| 克山县| 灵台县| 上杭县| 宜宾县| 垣曲县| 潮州市| 商洛市| 内乡县| 黄陵县| 泾源县| 苏尼特右旗| 南陵县| 班玛县| 南木林县|